aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.cpp57
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.h3
-rw-r--r--src/server/shared/DataStores/DB2Store.h5
3 files changed, 45 insertions, 20 deletions
diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp
index 1e68c4881f8..0e72a049a7a 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.cpp
+++ b/src/server/shared/DataStores/DB2StorageLoader.cpp
@@ -222,10 +222,10 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos)
return recordsize;
}
-uint32 DB2FileLoader::GetFormatStringsFields(const char * format)
+uint32 DB2FileLoader::GetFormatStringFieldCount(char const* format)
{
uint32 stringfields = 0;
- for (uint32 x=0; format[x]; ++x)
+ for (uint32 x = 0; format[x]; ++x)
if (format[x] == FT_STRING)
++stringfields;
@@ -311,7 +311,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da
return nullptr;
// we store flat holders pool as single memory block
- size_t stringFields = GetFormatStringsFields(format);
+ size_t stringFields = GetFormatStringFieldCount(format);
if (!stringFields)
return nullptr;
@@ -414,20 +414,25 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin
char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool)
{
+ // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format
PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement));
if (!result)
return nullptr;
- if (strlen(format) + 1 /*VerifiedBuild*/ != result->GetFieldCount())
+ // we store flat holders pool as single memory block
+ size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format);
+
+ size_t expectedFields = strlen(format) + 1 /*VerifiedBuild*/;
+ if (stringFields)
+ expectedFields += 1 /*ID*/ + stringFields * (TOTAL_LOCALES - 1) + 1 /*VerifiedBuild in locale table*/;
+
+ if (expectedFields != result->GetFieldCount())
return nullptr;
//get struct size and index pos
int32 indexField;
uint32 recordSize = DB2FileLoader::GetFormatRecordSize(format, &indexField);
- // we store flat holders pool as single memory block
- size_t stringFields = DB2FileLoader::GetFormatStringsFields(format);
-
// each string field at load have array of string for each locale
size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES;
size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize;
@@ -443,12 +448,14 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
char* dataTable = new char[result->GetRowCount() * recordSize];
uint32 offset = 0;
+ uint32 const fieldCount = strlen(format);
+ uint32 const localeFieldsOffset = fieldCount + 2 /*VerifiedBuild in main table, ID in locale table*/;
uint32 oldIndexSize = records;
uint32 rec = 0;
do
{
Field* fields = result->Fetch();
- uint32 stringFieldNum = 0;
+ uint32 stringFieldNumInRecord = 0;
if (indexField >= 0)
{
@@ -460,7 +467,7 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
else
tempIndexTable[records++] = &dataTable[offset];
- for (uint32 x = 0; x < result->GetFieldCount(); x++)
+ for (uint32 x = 0; x < fieldCount; x++)
{
switch (format[x])
{
@@ -479,15 +486,18 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
break;
case FT_STRING:
{
- std::string value = fields[x].GetString();
LocalizedString** slot = (LocalizedString**)(&dataTable[offset]);
- *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec++ + stringHolderSize * stringFieldNum]);
- // Value in database field must be for enUS locale
- char* str = new char[value.length() + 1];
- strcpy(str, value.c_str());
- stringPool.push_back(str);
- (*slot)->Str[LOCALE_enUS] = str;
- ++stringFieldNum;
+ *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec++ + stringHolderSize * stringFieldNumInRecord]);
+
+ // Value in database in main table field must be for enUS locale
+ if (char* str = AddLocaleString(*slot, LOCALE_enUS, fields[x].GetString()))
+ stringPool.push_back(str);
+
+ for (uint32 i = LOCALE_koKR; i < TOTAL_LOCALES; ++i)
+ if (char* str = AddLocaleString(*slot, i, fields[localeFieldsOffset + (i - 1) * stringFieldNumInRecord].GetString()))
+ stringPool.push_back(str);
+
+ ++stringFieldNumInRecord;
offset += sizeof(char*);
break;
}
@@ -511,3 +521,16 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
return dataTable;
}
+
+char* DB2DatabaseLoader::AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value)
+{
+ if (!value.empty())
+ {
+ char* str = new char[value.length() + 1];
+ strcpy(str, value.c_str());
+ holder->Str[locale] = str;
+ return str;
+ }
+
+ return nullptr;
+}
diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h
index 82f5ff02afe..4254fcc1121 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.h
+++ b/src/server/shared/DataStores/DB2StorageLoader.h
@@ -82,7 +82,7 @@ class DB2FileLoader
char* AutoProduceStringsArrayHolders(const char* fmt, char* dataTable);
char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale);
static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL);
- static uint32 GetFormatStringsFields(const char * format);
+ static uint32 GetFormatStringFieldCount(const char * format);
private:
uint32 recordSize;
@@ -109,6 +109,7 @@ class DB2DatabaseLoader
public:
char* Load(const char* format, int32 preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool);
+ static char* AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value);
};
#endif
diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h
index 84134c48160..c8f42d6d4e7 100644
--- a/src/server/shared/DataStores/DB2Store.h
+++ b/src/server/shared/DataStores/DB2Store.h
@@ -162,7 +162,7 @@ public:
return false;
// load strings from another locale dbc data
- if (DB2FileLoader::GetFormatStringsFields(fmt))
+ if (DB2FileLoader::GetFormatStringFieldCount(fmt))
m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale));
return true;
@@ -178,7 +178,8 @@ public:
if (char* dataTable = db2.Load(fmt, _hotfixStatement, nCount, indexTable.asChar, extraStringHolders, m_stringPoolList))
{
m_dataTableEx = reinterpret_cast<T*>(dataTable);
- m_stringPoolList.push_back(extraStringHolders);
+ if (extraStringHolders)
+ m_stringPoolList.push_back(extraStringHolders);
}
}