Core/DataStores: Fixed loading db2 strings

Closes #24916
This commit is contained in:
Shauren
2020-06-29 00:10:37 +02:00
parent 6040f8eb31
commit 2fcb79e2de
2 changed files with 19 additions and 20 deletions

View File

@@ -522,6 +522,9 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char** indexTable, uint32 ind
return nullptr;
}
if (!_loadInfo->GetStringFieldCount(false))
return nullptr;
char* stringPool = new char[_header->StringTableSize];
memcpy(stringPool, _stringTable, _header->StringTableSize);
@@ -1111,29 +1114,15 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable
offset += 8;
break;
case FT_STRING:
{
LocalizedString* slot = (LocalizedString*)(&dataTable[offset]);
for (uint32 locale = 0; locale < TOTAL_LOCALES; ++locale)
{
slot->Str[locale] = nullStr;
if (_header->Locale & (1 << locale))
slot->Str[locale] = stringPtr;
}
for (char const*& localeStr : ((LocalizedString*)(&dataTable[offset]))->Str)
localeStr = nullStr;
strcpy(stringPtr, RecordGetString(rawRecord, x, z));
stringPtr += strlen(stringPtr) + 1;
offset += sizeof(LocalizedString);
break;
}
case FT_STRING_NOT_LOCALIZED:
{
char const** slot = (char const**)(&dataTable[offset]);
*slot = stringPtr;
strcpy(stringPtr, RecordGetString(rawRecord, x, z));
stringPtr += strlen(stringPtr) + 1;
*(char const**)(&dataTable[offset]) = nullStr;
offset += sizeof(char*);
break;
}
default:
ASSERT(false, "Unknown format character '%c' found in %s meta for field %s",
_loadInfo->TypesString[fieldIndex], _fileName, _loadInfo->Fields[fieldIndex].Name);
@@ -1204,6 +1193,9 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char** indexTable, uint32 inde
std::size_t stringFields = _loadInfo->GetStringFieldCount(false);
std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true);
if (!stringFields)
return nullptr;
std::size_t stringsInRecordSize = (stringFields - localizedStringFields) * sizeof(char*);
std::size_t localizedStringsInRecordSize = localizedStringFields * sizeof(LocalizedString);
@@ -1276,8 +1268,14 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char** indexTable, uint32 inde
break;
}
case FT_STRING_NOT_LOCALIZED:
{
char const** db2str = (char const**)(&recordData[offset]);
*db2str = stringPtr;
strcpy(stringPtr, RecordGetString(rawRecord, x, z));
stringPtr += strlen(stringPtr) + 1;
offset += sizeof(char*);
break;
}
default:
ASSERT(false, "Unknown format character '%c' found in %s meta for field %s",
_loadInfo->TypesString[fieldIndex], _fileName, _loadInfo->Fields[fieldIndex].Name);

View File

@@ -98,11 +98,12 @@ bool DB2StorageBase::Load(std::string const& path, LocaleConstant locale, char**
// load raw non-string data
_dataTable = db2.AutoProduceData(_indexTableSize, indexTable, _stringPool);
if (!_dataTable)
return false;
// load strings from db2 data
if (!_stringPool.empty())
if (char* stringBlock = db2.AutoProduceStrings(indexTable, _indexTableSize, locale))
_stringPool.push_back(stringBlock);
if (char* stringBlock = db2.AutoProduceStrings(indexTable, _indexTableSize, locale))
_stringPool.push_back(stringBlock);
db2.AutoProduceRecordCopies(_indexTableSize, indexTable, _dataTable);