diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-07-05 12:17:47 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-07-05 12:17:47 +0200 |
commit | 59f1f60a8387479d93dc64e3ecc3a56b7f0cbf34 (patch) | |
tree | 72568a9b821da626d60a51e94a0ef867fb88b00c /src/server/database/Database/Field.h | |
parent | beceafc39faf58a498cfac455eef00049ae6b485 (diff) |
Core/DBLayer: Optimize string based query results by eliminating unneeded buffer copies
Diffstat (limited to 'src/server/database/Database/Field.h')
-rw-r--r-- | src/server/database/Database/Field.h | 50 |
1 files changed, 19 insertions, 31 deletions
diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h index 31b93b097cb..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 @@ -96,51 +107,28 @@ class TC_DATABASE_API Field bool IsNull() const { - return data.value == NULL; + 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 = NULL; - } + 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_DEBUG + QueryResultFieldMetadata const* meta; void LogWrongType(char const* getter) const; - void SetMetadata(MySQLField* field, uint32 fieldIndex); - Metadata meta; - #endif + void SetMetadata(QueryResultFieldMetadata const* fieldMeta); }; #endif |