aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/options.cmake1
-rw-r--r--cmake/showoptions.cmake11
-rw-r--r--src/server/database/Database/Field.cpp24
-rw-r--r--src/server/database/Database/Field.h2
-rw-r--r--src/server/database/Database/QueryResult.cpp4
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
}