diff options
| -rw-r--r-- | src/server/shared/DataStores/DB2StorageLoader.cpp | 57 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2StorageLoader.h | 3 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2Store.h | 5 |
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); } } |
