aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/Common.h17
-rw-r--r--src/server/shared/DataStores/DB2FileLoader.cpp10
-rw-r--r--src/server/shared/DataStores/DB2FileLoader.h2
-rw-r--r--src/server/shared/DataStores/DB2Store.h31
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.cpp9
-rw-r--r--src/server/shared/Define.h4
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