Core/DBC: Some cleanup of Cleanup (8edea4a follow-up)

This commit is contained in:
Treeston
2018-10-02 20:05:22 +02:00
parent ead439fbd6
commit f2447a8dfc
3 changed files with 19 additions and 30 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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);
}