aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/shared/DataStores/DBCDatabaseLoader.cpp43
-rw-r--r--src/server/shared/DataStores/DBCDatabaseLoader.h4
-rw-r--r--src/server/shared/DataStores/DBCStore.cpp2
3 files changed, 19 insertions, 30 deletions
diff --git a/src/server/shared/DataStores/DBCDatabaseLoader.cpp b/src/server/shared/DataStores/DBCDatabaseLoader.cpp
index fd34a86fcb5..8bccbba56fd 100644
--- a/src/server/shared/DataStores/DBCDatabaseLoader.cpp
+++ b/src/server/shared/DataStores/DBCDatabaseLoader.cpp
@@ -23,8 +23,8 @@
#include "StringFormat.h"
#include <sstream>
-DBCDatabaseLoader::DBCDatabaseLoader(char const* tableName, char const* dbFormatString, char const* primaryKey, char const* dbcFormatString)
- : _sqlTableName(tableName), _formatString(dbFormatString), _indexName(primaryKey), _dbcFormat(dbcFormatString), _sqlIndexPos(0), _recordSize(0)
+DBCDatabaseLoader::DBCDatabaseLoader(char const* tableName, char const* dbFormatString, char const* primaryKey, char const* dbcFormatString, std::vector<char*>& stringPool)
+ : _sqlTableName(tableName), _formatString(dbFormatString), _indexName(primaryKey), _dbcFormat(dbcFormatString), _sqlIndexPos(0), _recordSize(0), _stringPool(stringPool)
{
// Get sql index position
int32 indexPos = -1;
@@ -54,28 +54,6 @@ DBCDatabaseLoader::DBCDatabaseLoader(char const* tableName, char const* dbFormat
static char const* nullStr = "";
-struct CleanupStruct
-{
- static char* Clone(std::string const& str)
- {
- char* ptr = new char[str.size() + 1];
- memcpy(ptr, str.c_str(), str.size() + 1);
- _instance()._managed.push_back(ptr);
- return ptr;
- }
-
- ~CleanupStruct()
- {
- for (char* ptr : _managed)
- delete[] ptr;
- _managed.clear();
- }
-
- private:
- static CleanupStruct& _instance() { static CleanupStruct c; return c; }
- std::vector<char*> _managed;
-};
-
char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable)
{
std::string query = Trinity::StringFormat("SELECT * FROM %s ORDER BY %s DESC;", _sqlTableName, _indexName);
@@ -160,8 +138,9 @@ char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable)
dataOffset += sizeof(uint8);
break;
case FT_STRING:
- *reinterpret_cast<char**>(&dataValue[dataOffset]) = CleanupStruct::Clone(fields[sqlColumnNumber].GetString());
+ *reinterpret_cast<char**>(&dataValue[dataOffset]) = CloneStringToPool(fields[sqlColumnNumber].GetString());
dataOffset += sizeof(char*);
+ break;
case FT_SORT:
break;
default:
@@ -175,16 +154,16 @@ char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable)
{
case FT_FLOAT:
*reinterpret_cast<float*>(&dataValue[dataOffset]) = 0.0f;
- dataOffset += 4;
+ dataOffset += sizeof(float);
break;
case FT_IND:
case FT_INT:
*reinterpret_cast<uint32*>(&dataValue[dataOffset]) = uint32(0);
- dataOffset += 4;
+ dataOffset += sizeof(uint32);
break;
case FT_BYTE:
*reinterpret_cast<uint8*>(&dataValue[dataOffset]) = uint8(0);
- dataOffset += 1;
+ dataOffset += sizeof(uint8);
break;
case FT_STRING:
*reinterpret_cast<char**>(&dataValue[dataOffset]) = const_cast<char*>(nullStr);
@@ -211,3 +190,11 @@ char* DBCDatabaseLoader::Load(uint32& records, char**& indexTable)
return dataTable.release();
}
+
+char* DBCDatabaseLoader::CloneStringToPool(std::string const& str)
+{
+ char* buf = new char[str.size() + 1];
+ memcpy(buf, str.c_str(), str.size() + 1);
+ _stringPool.push_back(buf);
+ return buf;
+}
diff --git a/src/server/shared/DataStores/DBCDatabaseLoader.h b/src/server/shared/DataStores/DBCDatabaseLoader.h
index 1f885df8cb7..ebc71969763 100644
--- a/src/server/shared/DataStores/DBCDatabaseLoader.h
+++ b/src/server/shared/DataStores/DBCDatabaseLoader.h
@@ -24,7 +24,7 @@
struct TC_SHARED_API DBCDatabaseLoader
{
- DBCDatabaseLoader(char const* dbTable, char const* dbFormatString, char const* index, char const* dbcFormatString);
+ DBCDatabaseLoader(char const* dbTable, char const* dbFormatString, char const* index, char const* dbcFormatString, std::vector<char*>& stringPool);
char* Load(uint32& records, char**& indexTable);
@@ -35,6 +35,8 @@ private:
char const* _dbcFormat;
int32 _sqlIndexPos;
uint32 _recordSize;
+ std::vector<char*>& _stringPool;
+ char* CloneStringToPool(std::string const& str);
DBCDatabaseLoader(DBCDatabaseLoader const& right) = delete;
DBCDatabaseLoader& operator=(DBCDatabaseLoader const& right) = delete;
diff --git a/src/server/shared/DataStores/DBCStore.cpp b/src/server/shared/DataStores/DBCStore.cpp
index dbe0e52fe87..dabaa84aa23 100644
--- a/src/server/shared/DataStores/DBCStore.cpp
+++ b/src/server/shared/DataStores/DBCStore.cpp
@@ -72,5 +72,5 @@ bool DBCStorageBase::LoadStringsFrom(char const* path, char** indexTable)
void DBCStorageBase::LoadFromDB(char const* table, char const* format, char const* index, char**& indexTable)
{
- _dataTableEx = DBCDatabaseLoader(table, format, index, _fileFormat).Load(_indexTableSize, indexTable);
+ _dataTableEx = DBCDatabaseLoader(table, format, index, _fileFormat, _stringPool).Load(_indexTableSize, indexTable);
}