diff options
Diffstat (limited to 'src/server/shared')
-rw-r--r-- | src/server/shared/Common.h | 17 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2FileLoader.cpp | 10 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2FileLoader.h | 2 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2Store.h | 31 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCFileLoader.cpp | 9 | ||||
-rw-r--r-- | src/server/shared/Define.h | 4 |
6 files changed, 43 insertions, 30 deletions
diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h index 70ee32d2868..779eb95e291 100644 --- a/src/server/shared/Common.h +++ b/src/server/shared/Common.h @@ -181,6 +181,23 @@ LocaleConstant GetLocaleByName(const std::string& name); typedef std::vector<std::string> StringVector; +#if defined(__GNUC__) +#pragma pack(1) +#else +#pragma pack(push, 1) +#endif + +struct LocalizedString +{ + char const* Str[TOTAL_LOCALES]; +}; + +#if defined(__GNUC__) +#pragma pack() +#else +#pragma pack(pop) +#endif + // we always use stdlibc++ std::max/std::min, undefine some not C++ standard defines (Win API and some other platforms) #ifdef max #undef max diff --git a/src/server/shared/DataStores/DB2FileLoader.cpp b/src/server/shared/DataStores/DB2FileLoader.cpp index 83e6e83104f..7a27072dd20 100644 --- a/src/server/shared/DataStores/DB2FileLoader.cpp +++ b/src/server/shared/DataStores/DB2FileLoader.cpp @@ -365,7 +365,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da return stringHoldersPool; } -char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable) +char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) { if (strlen(format) != fieldCount) return NULL; @@ -391,14 +391,14 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable) case FT_STRING: { // fill only not filled entries - char** slot = (char**)(&dataTable[offset]); - if (**((char***)slot) == nullStr) + LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); + if (db2str->Str[locale] == nullStr) { const char * st = getRecord(y).getString(x); - *slot=stringPool + (st-(const char*)stringTable); + db2str->Str[locale] = stringPool + (st - (const char*)stringTable); } - offset+=sizeof(char*); + offset += sizeof(char*); break; } } diff --git a/src/server/shared/DataStores/DB2FileLoader.h b/src/server/shared/DataStores/DB2FileLoader.h index 5d3c8449442..86350ebf1d6 100644 --- a/src/server/shared/DataStores/DB2FileLoader.h +++ b/src/server/shared/DataStores/DB2FileLoader.h @@ -80,7 +80,7 @@ class DB2FileLoader bool IsLoaded() const { return (data != NULL); } char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable); char* AutoProduceStringsArrayHolders(const char* fmt, char* dataTable); - char* AutoProduceStrings(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); private: diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index e4f91beb592..22dbe4a361c 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -32,7 +32,7 @@ public: virtual bool HasRecord(uint32 id) const = 0; - virtual void WriteRecord(uint32 id, ByteBuffer& buffer) const = 0; + virtual void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const = 0; protected: uint32 tableHash; @@ -48,7 +48,7 @@ bool DB2StorageHasEntry(DB2Storage<T> const& store, uint32 id) } template<class T> -void WriteDB2RecordToPacket(DB2Storage<T> const& store, uint32 id, ByteBuffer& buffer) +void WriteDB2RecordToPacket(DB2Storage<T> const& store, uint32 id, uint32 locale, ByteBuffer& buffer) { uint8 const* entry = (uint8 const*)store.LookupEntry(id); ASSERT(entry); @@ -73,10 +73,15 @@ void WriteDB2RecordToPacket(DB2Storage<T> const& store, uint32 id, ByteBuffer& b break; case FT_STRING: { - size_t len = strlen(*(char**)entry); + LocalizedString* locStr = *(LocalizedString**)entry; + if (locStr->Str[locale][0] == '\0') + locale = 0; + + char const* str = locStr->Str[locale]; + size_t len = strlen(str); buffer << uint16(len); if (len) - buffer << *(char**)entry; + buffer << str; entry += sizeof(char*); break; } @@ -97,13 +102,13 @@ class DB2Storage : public DB2StorageBase typedef std::list<char*> StringPoolList; typedef std::vector<T*> DataTableEx; typedef bool(*EntryChecker)(DB2Storage<T> const&, uint32); - typedef void(*PacketWriter)(DB2Storage<T> const&, uint32, ByteBuffer&); + typedef void(*PacketWriter)(DB2Storage<T> const&, uint32, uint32, ByteBuffer&); public: DB2Storage(char const* f, EntryChecker checkEntry = NULL, PacketWriter writePacket = NULL) : nCount(0), fieldCount(0), fmt(f), indexTable(NULL), m_dataTable(NULL) { - CheckEntry = checkEntry ? checkEntry : &DB2StorageHasEntry<T>; - WritePacket = writePacket ? writePacket : &WriteDB2RecordToPacket<T>; + CheckEntry = checkEntry ? checkEntry : (EntryChecker)&DB2StorageHasEntry<T>; + WritePacket = writePacket ? writePacket : (PacketWriter)&WriteDB2RecordToPacket<T>; } ~DB2Storage() { Clear(); } @@ -113,9 +118,9 @@ public: uint32 GetNumRows() const { return nCount; } char const* GetFormat() const { return fmt; } uint32 GetFieldCount() const { return fieldCount; } - void WriteRecord(uint32 id, ByteBuffer& buffer) const + void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const { - WritePacket(*this, id, buffer); + WritePacket(*this, id, locale, buffer); } T* CreateEntry(uint32 id, bool evenIfExists = false) @@ -142,7 +147,7 @@ public: void EraseEntry(uint32 id) { indexTable[id] = NULL; } - bool Load(char const* fn) + bool Load(char const* fn, uint32 locale) { DB2FileLoader db2; // Check if load was sucessful, only then continue @@ -159,13 +164,13 @@ public: m_stringPoolList.push_back(db2.AutoProduceStringsArrayHolders(fmt, (char*)m_dataTable)); // load strings from dbc data - m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable)); + m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale)); // error in dbc file at loading if NULL return indexTable!=NULL; } - bool LoadStringsFrom(char const* fn) + bool LoadStringsFrom(char const* fn, uint32 locale) { // DBC must be already loaded using Load if (!indexTable) @@ -177,7 +182,7 @@ public: return false; // load strings from another locale dbc data - m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable)); + m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale)); return true; } diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp index 5e82579d29d..3a61057510e 100644 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ b/src/server/shared/DataStores/DBCFileLoader.cpp @@ -157,9 +157,6 @@ uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos) case FT_NA: case FT_NA_BYTE: break; - case FT_LOGIC: - ASSERT(false && "Attempted to load DBC files that do not have field types that match what is in the core. Check DBCfmt.h or your DBC files."); - break; default: ASSERT(false && "Unknown field format character in DBCfmt.h"); break; @@ -251,9 +248,6 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** *((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings offset += sizeof(char*); break; - case FT_LOGIC: - ASSERT(false && "Attempted to load DBC files that do not have field types that match what is in the core. Check DBCfmt.h or your DBC files."); - break; case FT_NA: case FT_NA_BYTE: case FT_SORT: @@ -308,9 +302,6 @@ char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable) offset += sizeof(char*); break; } - case FT_LOGIC: - ASSERT(false && "Attempted to load DBC files that does not have field types that match what is in the core. Check DBCfmt.h or your DBC files."); - break; case FT_NA: case FT_NA_BYTE: case FT_SORT: diff --git a/src/server/shared/Define.h b/src/server/shared/Define.h index 27ef7791ab7..ab3a743315d 100644 --- a/src/server/shared/Define.h +++ b/src/server/shared/Define.h @@ -97,8 +97,8 @@ enum DBCFormer FT_BYTE='b', //uint8 FT_SORT='d', //sorted by this field, field is not included FT_IND='n', //the same, but parsed to data - FT_LOGIC='l', //Logical (boolean) - FT_SQL_PRESENT='p', //Used in sql format to mark column present in sql dbc + FT_SQL_PRESENT='p', //Used in sql format to mark column present in sql dbc FT_SQL_ABSENT='a' //Used in sql format to mark column absent in sql dbc }; + #endif //TRINITY_DEFINE_H |