aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/database/Database/Field.h36
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp7
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp12
3 files changed, 37 insertions, 18 deletions
diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h
index 42a842e6283..72364f2c034 100644
--- a/src/server/database/Database/Field.h
+++ b/src/server/database/Database/Field.h
@@ -23,6 +23,36 @@
#include <mysql.h>
+/**
+ @class Field
+
+ @brief Class used to access individual fields of database query result
+
+ Guideline on field type matching:
+
+ | MySQL type | method to use |
+ |------------------------|----------------------------------------|
+ | TINYINT | GetBool, GetInt8, GetUInt8 |
+ | SMALLINT | GetInt16, GetUInt16 |
+ | MEDIUMINT, INT | GetInt32, GetUInt32 |
+ | BIGINT | GetInt64, GetUInt64 |
+ | FLOAT | GetFloat |
+ | DOUBLE, DECIMAL | GetDouble |
+ | CHAR, VARCHAR, | GetCString, GetString |
+ | TINYTEXT, MEDIUMTEXT, | GetCString, GetString |
+ | TEXT, LONGTEXT | GetCString, GetString |
+ | TINYBLOB, MEDIUMBLOB, | GetBinary, GetString |
+ | BLOB, LONGBLOB | GetBinary, GetString |
+ | BINARY, VARBINARY | GetBinary |
+
+ Return types of aggregate functions:
+
+ | Function | Type |
+ |----------|-------------------|
+ | MIN, MAX | Same as the field |
+ | SUM, AVG | DECIMAL |
+ | COUNT | BIGINT |
+*/
class Field
{
friend class ResultSet;
@@ -214,15 +244,15 @@ class Field
return 0.0f;
#ifdef TRINITY_DEBUG
- if (!IsType(MYSQL_TYPE_DOUBLE))
+ if (!IsType(MYSQL_TYPE_DOUBLE) && !IsType(MYSQL_TYPE_NEWDECIMAL))
{
- TC_LOG_WARN("sql.sql", "Warning: GetDouble() on non-double field %s.%s (%s.%s) at index %u. Using type: %s.",
+ TC_LOG_WARN("sql.sql", "Warning: GetDouble() on non-double/non-decimal field %s.%s (%s.%s) at index %u. Using type: %s.",
meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type);
return 0.0f;
}
#endif
- if (data.raw)
+ if (data.raw && !IsType(MYSQL_TYPE_NEWDECIMAL))
return *reinterpret_cast<double*>(data.value);
return static_cast<double>(atof((char*)data.value));
}
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index d2cf2d4bae7..e5b32f548f9 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -433,14 +433,11 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
}
case 1:
{
- uint16 acctCharCount = 0;
+ uint64 acctCharCount = 0;
if (result)
{
Field* fields = result->Fetch();
- // SELECT SUM(x) is MYSQL_TYPE_NEWDECIMAL - needs to be read as string
- const char* ch = fields[0].GetCString();
- if (ch)
- acctCharCount = atoi(ch);
+ acctCharCount = uint64(fields[0].GetDouble());
}
if (acctCharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_ACCOUNT))
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index b22f56ef923..b81d6152c03 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1773,21 +1773,13 @@ public:
PreparedQueryResult result6 = CharacterDatabase.Query(stmt4);
if (result6)
{
- // Define the variables, so the compiler knows they exist
- uint32 rmailint = 0;
-
- // Fetch the fields - readmail is a SUM(x) and given out as char! Thus...
- // ... while totalmail is a COUNT(x), which is given out as INt64, which we just convert on fetch...
Field* fields = result6->Fetch();
- std::string readmail = fields[0].GetString();
+ uint32 readmail = uint32(fields[0].GetDouble());
uint32 totalmail = uint32(fields[1].GetUInt64());
- // ... we have to convert it from Char to int. We can use totalmail as it is
- rmailint = atoul(readmail.c_str());
-
// Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given
if (totalmail >= 1)
- handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail);
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, readmail, totalmail);
}
return true;