diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-07-05 12:17:47 +0200 |
---|---|---|
committer | jackpoz <giacomopoz@gmail.com> | 2020-07-10 22:47:04 +0200 |
commit | c317f248bf1a7c5256ff7678f5332258e3f86e2b (patch) | |
tree | 9a074bd1ad82186727d34960a48b29745239e4db /src/server/database/Database/Field.h | |
parent | 92efefabc8b3107ab743b88346867a4ec5423efe (diff) |
Core/DBLayer: Optimize string based query results by eliminating unneeded buffer copies
(cherry picked from commit 59f1f60a8387479d93dc64e3ecc3a56b7f0cbf34)
# Conflicts:
# src/server/database/Database/Field.cpp
# src/server/database/Database/Field.h
# src/server/database/Database/QueryResult.cpp
Diffstat (limited to 'src/server/database/Database/Field.h')
-rw-r--r-- | src/server/database/Database/Field.h | 49 |
1 files changed, 19 insertions, 30 deletions
diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h index 45db25c4ecd..ea7c82d1876 100644 --- a/src/server/database/Database/Field.h +++ b/src/server/database/Database/Field.h @@ -36,6 +36,17 @@ enum class DatabaseFieldTypes : uint8 Binary }; +struct QueryResultFieldMetadata +{ + char const* TableName = nullptr; + char const* TableAlias = nullptr; + char const* Name = nullptr; + char const* Alias = nullptr; + char const* TypeName = nullptr; + uint32 Index = 0; + DatabaseFieldTypes Type = DatabaseFieldTypes::Null; +}; + /** @class Field @@ -99,47 +110,25 @@ class TC_DATABASE_API Field return data.value == nullptr; } - struct Metadata - { - char const* TableName; - char const* TableAlias; - char const* Name; - char const* Alias; - char const* Type; - uint32 Index; - }; - protected: - #pragma pack(push, 1) struct { - uint32 length; // Length (prepared strings only) - void* value; // Actual data in memory - DatabaseFieldTypes type; // Field type - bool raw; // Raw bytes? (Prepared statement or ad hoc) + char const* value; // Actual data in memory + uint32 length; // Length + bool raw; // Raw bytes? (Prepared statement or ad hoc) } data; - #pragma pack(pop) - - void SetByteValue(void* newValue, DatabaseFieldTypes newType, uint32 length); - void SetStructuredValue(char* newValue, DatabaseFieldTypes newType, uint32 length); - void CleanUp() - { - // Field does not own the data if fetched with prepared statement - if (!data.raw) - delete[] ((char*)data.value); - data.value = nullptr; - } + void SetByteValue(char const* newValue, uint32 length); + void SetStructuredValue(char const* newValue, uint32 length); bool IsType(DatabaseFieldTypes type) const; bool IsNumeric() const; private: - #ifdef TRINITY_STRICT_DATABASE_TYPE_CHECKS - void SetMetadata(MySQLField* field, uint32 fieldIndex); - Metadata meta; - #endif + QueryResultFieldMetadata const* meta; + void LogWrongType(char const* getter) const; + void SetMetadata(QueryResultFieldMetadata const* fieldMeta); }; #endif |