diff options
-rw-r--r-- | cmake/options.cmake | 1 | ||||
-rw-r--r-- | cmake/showoptions.cmake | 11 | ||||
-rw-r--r-- | src/server/database/Database/Field.cpp | 24 | ||||
-rw-r--r-- | src/server/database/Database/Field.h | 2 | ||||
-rw-r--r-- | src/server/database/Database/QueryResult.cpp | 4 |
5 files changed, 26 insertions, 16 deletions
diff --git a/cmake/options.cmake b/cmake/options.cmake index 33a321e6204..4f99875d983 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -48,6 +48,7 @@ else() endif() option(WITH_WARNINGS "Show all warnings during compile" 0) option(WITH_COREDEBUG "Include additional debug-code in core" 0) +option(WITH_STRICT_DATABASE_TYPE_CHECKS "Enable strict checking of database field value accessors" 0) set(WITH_SOURCE_TREE "hierarchical" CACHE STRING "Build the source tree for IDE's.") set_property(CACHE WITH_SOURCE_TREE PROPERTY STRINGS no flat hierarchical hierarchical-folders) option(WITHOUT_GIT "Disable the GIT testing routines" 0) diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake index 937ed8016c1..6094198e76a 100644 --- a/cmake/showoptions.cmake +++ b/cmake/showoptions.cmake @@ -60,7 +60,7 @@ if( WITH_COREDEBUG ) message(" *** additional core debug logs have been enabled!") message(" *** this setting doesn't help to get better crash logs!") message(" *** in case you are searching for better crash logs use") - message(" *** -DCMAKE_BUILD_TYPE=RelWithDebug") + message(" *** -DCMAKE_BUILD_TYPE=RelWithDebInfo") message(" *** DO NOT ENABLE IT UNLESS YOU KNOW WHAT YOU'RE DOING!") message("* Use coreside debug : Yes") add_definitions(-DTRINITY_DEBUG) @@ -112,6 +112,15 @@ if ( PERFORMANCE_PROFILING ) add_definitions(-DPERFORMANCE_PROFILING) endif() +if( WITH_STRICT_DATABASE_TYPE_CHECKS ) + message("") + message(" *** WITH_STRICT_DATABASE_TYPE_CHECKS - WARNING!") + message(" *** Validates uses of database Get***() functions from Field class") + message(" *** invalid calls will result in returning value 0") + message(" *** NOT COMPATIBLE WITH MARIADB!") + add_definitions(-DTRINITY_STRICT_DATABASE_TYPE_CHECKS) +endif() + if (BUILD_SHARED_LIBS) message("") message(" *** WITH_DYNAMIC_LINKING - INFO!") diff --git a/src/server/database/Database/Field.cpp b/src/server/database/Database/Field.cpp index 0f806265b03..c36506ea28f 100644 --- a/src/server/database/Database/Field.cpp +++ b/src/server/database/Database/Field.cpp @@ -36,7 +36,7 @@ uint8 Field::GetUInt8() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int8)) { TC_LOG_WARN("sql.sql", "Warning: GetUInt8() on non-tinyint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -55,7 +55,7 @@ int8 Field::GetInt8() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int8)) { TC_LOG_WARN("sql.sql", "Warning: GetInt8() on non-tinyint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -74,7 +74,7 @@ uint16 Field::GetUInt16() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int16)) { TC_LOG_WARN("sql.sql", "Warning: GetUInt16() on non-smallint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -93,7 +93,7 @@ int16 Field::GetInt16() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int16)) { TC_LOG_WARN("sql.sql", "Warning: GetInt16() on non-smallint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -112,7 +112,7 @@ uint32 Field::GetUInt32() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int32)) { TC_LOG_WARN("sql.sql", "Warning: GetUInt32() on non-(medium)int field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -131,7 +131,7 @@ int32 Field::GetInt32() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int32)) { TC_LOG_WARN("sql.sql", "Warning: GetInt32() on non-(medium)int field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -150,7 +150,7 @@ uint64 Field::GetUInt64() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int64)) { TC_LOG_WARN("sql.sql", "Warning: GetUInt64() on non-bigint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -169,7 +169,7 @@ int64 Field::GetInt64() const if (!data.value) return 0; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Int64)) { TC_LOG_WARN("sql.sql", "Warning: GetInt64() on non-bigint field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -188,7 +188,7 @@ float Field::GetFloat() const if (!data.value) return 0.0f; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Float)) { TC_LOG_WARN("sql.sql", "Warning: GetFloat() on non-float field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -207,7 +207,7 @@ double Field::GetDouble() const if (!data.value) return 0.0f; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (!IsType(DatabaseFieldTypes::Double) && !IsType(DatabaseFieldTypes::Decimal)) { TC_LOG_WARN("sql.sql", "Warning: GetDouble() on non-double/non-decimal field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -226,7 +226,7 @@ char const* Field::GetCString() const if (!data.value) return nullptr; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS if (IsNumeric() && data.raw) { TC_LOG_WARN("sql.sql", "Error: GetCString() on numeric field %s.%s (%s.%s) at index %u. Using type: %s.", @@ -302,7 +302,7 @@ bool Field::IsNumeric() const data.type == DatabaseFieldTypes::Double); } -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS #ifdef _WIN32 // hack for broken mysql.h not including the correct winsock header for SOCKET definition, fixed in 5.7 #include <winsock2.h> diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h index c209cd8fbaa..c29f91a54c8 100644 --- a/src/server/database/Database/Field.h +++ b/src/server/database/Database/Field.h @@ -136,7 +136,7 @@ class TC_DATABASE_API Field bool IsNumeric() const; private: - #ifdef TRINITY_DEBUG + #ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS void SetMetadata(MYSQL_FIELD* field, uint32 fieldIndex); Metadata meta; #endif diff --git a/src/server/database/Database/QueryResult.cpp b/src/server/database/Database/QueryResult.cpp index 853e5ad1a56..7e6b6fd50a6 100644 --- a/src/server/database/Database/QueryResult.cpp +++ b/src/server/database/Database/QueryResult.cpp @@ -126,7 +126,7 @@ _result(result), _fields(fields) { _currentRow = new Field[_fieldCount]; -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS for (uint32 i = 0; i < _fieldCount; i++) _currentRow[i].SetMetadata(&_fields[i], i); #endif @@ -253,7 +253,7 @@ m_metadataResult(result) *m_rBind[fIndex].length); } -#ifdef TRINITY_DEBUG +#ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS m_rows[uint32(m_rowPosition) * m_fieldCount + fIndex].SetMetadata(&field[fIndex], fIndex); #endif } |