diff options
-rw-r--r-- | src/common/DataStores/DB2FileLoader.cpp | 32 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2Store.cpp | 7 |
2 files changed, 19 insertions, 20 deletions
diff --git a/src/common/DataStores/DB2FileLoader.cpp b/src/common/DataStores/DB2FileLoader.cpp index f7cdd8ff35c..9ff9a7b4c2d 100644 --- a/src/common/DataStores/DB2FileLoader.cpp +++ b/src/common/DataStores/DB2FileLoader.cpp @@ -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); diff --git a/src/server/shared/DataStores/DB2Store.cpp b/src/server/shared/DataStores/DB2Store.cpp index 0c99462ec5d..f7ec9ab2473 100644 --- a/src/server/shared/DataStores/DB2Store.cpp +++ b/src/server/shared/DataStores/DB2Store.cpp @@ -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); |