inline void LoadDBC(uint32& availableDbcLocales,barGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename) { // compatibility format and C++ structure sizes ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()),sizeof(T),filename)); std::string dbc_filename = dbc_path + filename; if (storage.Load(dbc_filename.c_str())) { bar.step(); for (uint8 i = 0; i < MAX_LOCALE; ++i) { if (!(availableDbcLocales & (1 << i))) continue; std::string dbc_filename_loc = dbc_path + localeNames[i] + "/" + filename; if (!storage.LoadStringsFrom(dbc_filename_loc.c_str())) availableDbcLocales &= ~(1<<i); // mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) non-existed FILE * f=fopen(dbc_filename.c_str(),"rb"); if (f) { char buf[100]; snprintf(buf,100," (exists, but has %d fields instead %d) Wrong client version of DBC files?",storage.GetFieldCount(),strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else errlist.push_back(dbc_filename); } }
inline void LoadDBC(LocalData& localeData, BarGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename) { // compatibility format and C++ structure sizes MANGOS_ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); std::string dbc_filename = dbc_path + filename; if (storage.Load(dbc_filename.c_str())) { bar.step(); for (uint8 i = 0; fullLocaleNameList[i].name; ++i) { if (!(localeData.availableDbcLocales & (1 << i))) continue; LocaleNameStr const* localStr = &fullLocaleNameList[i]; std::string dbc_dir_loc = dbc_path + localStr->name + "/"; if (!(localeData.checkedDbcLocaleBuilds & (1 << i))) { localeData.checkedDbcLocaleBuilds |= (1 << i); // mark as checked for speedup next checks uint32 build_loc = ReadDBCBuild(dbc_dir_loc, localStr); if (localeData.main_build != build_loc) { localeData.availableDbcLocales &= ~(1 << i); // mark as not available for speedup next checks // exist but wrong build if (build_loc) { std::string dbc_filename_loc = dbc_path + localStr->name + "/" + filename; char buf[200]; snprintf(buf, 200, " (exist, but DBC locale subdir %s have DBCs for build %u instead expected build %u, it and other DBC from subdir skipped)", localStr->name, build_loc, localeData.main_build); errlist.push_back(dbc_filename_loc + buf); } continue; } } std::string dbc_filename_loc = dbc_path + localStr->name + "/" + filename; if (!storage.LoadStringsFrom(dbc_filename_loc.c_str())) localeData.availableDbcLocales &= ~(1 << i);// mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) nonexistent FILE* f = fopen(dbc_filename.c_str(), "rb"); if (f) { char buf[100]; snprintf(buf, 100, " (exist, but have %u fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else errlist.push_back(dbc_filename); } }
inline void LoadDBC(uint32& available_dbc_locales, StoreProblemList& errors, DBC::DBCStorage<T>& storage, std::string const& dbc_path, std::string const& dbc_filename,std::string const* custom_format = NULL, std::string const* custom_index_name = NULL) { auto tsize = sizeof(T); ASSERT(DBC::DBCLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBC::DBCLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), dbc_filename)); ++g_dbc_file_count; std::string dbc_file_path = dbc_path + dbc_filename; DBC::SQL::SqlDbc* sql = NULL; if (custom_format) { assert(false && "SqlDbc not yet implemented"); } if (storage.Load(dbc_file_path.c_str(), sql)) { for (uint8 i = 0; i < DBC::C_TOTAL_LOCALES; ++i) { if (!(available_dbc_locales & (1 << i))) { continue; } std::string localised_name(dbc_path); localised_name.append(DBC::C_LOCALE_NAMES[i]); localised_name.push_back('/'); localised_name.append(dbc_filename); if (!storage.LoadStringsFrom(localised_name.c_str())) { /* Mark as not available to speed up next checks */ available_dbc_locales &= ~(1 << i); } } } else { /* We failed to load the dbc, so work out if it's incompatible or just doesn't exist */ if (auto file = fopen(dbc_file_path.c_str(), "rb")) { std::ostringstream stream; stream << dbc_file_path << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten."; std::string buf = stream.str(); errors.push_back(buf); fclose(file); } else { errors.push_back(dbc_file_path); } } delete sql; }
inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable<T>& storage, std::string const& dbcPath, std::string const& filename) { // compatibility format and C++ structure sizes ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T), "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); ++GameTableCount; std::string dbcFilename = dbcPath + filename; if (storage.Load(dbcFilename.c_str())) { bool found = false; // Find table definition in GameTables.db2 for (uint32 i = 0; i < sGameTablesStore.GetNumRows(); ++i) { GameTablesEntry const* gt = sGameTablesStore.LookupEntry(i); if (!gt) continue; for (uint32 i = 0; i < TOTAL_LOCALES; ++i) { if (tableName == gt->Name->Str[i]) { found = true; storage.SetGameTableEntry(gt); break; } } if (found) break; } ASSERT(found, "Game table %s definition not found in GameTables.db2", tableName.c_str()); } else { // sort problematic dbc to (1) non compatible and (2) non-existed if (FILE* f = fopen(dbcFilename.c_str(), "rb")) { std::ostringstream stream; stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten."; std::string buf = stream.str(); errors.push_back(buf); fclose(f); } else errors.push_back(dbcFilename); } }
inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, std::string const* customFormat = NULL, std::string const* customIndexName = NULL) { // compatibility format and C++ structure sizes ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T), "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); ++DBCFileCount; std::string dbcFilename = dbcPath + filename; SqlDbc * sql = NULL; if (customFormat) sql = new SqlDbc(&filename, customFormat, customIndexName, storage.GetFormat()); if (storage.Load(dbcFilename.c_str(), sql)) { for (uint8 i = 0; i < TOTAL_LOCALES; ++i) { if (!(availableDbcLocales & (1 << i))) continue; std::string localizedName(dbcPath); localizedName.append(localeNames[i]); localizedName.push_back('/'); localizedName.append(filename); if (!storage.LoadStringsFrom(localizedName.c_str())) availableDbcLocales &= ~(1<<i); // mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) non-existed if (FILE* f = fopen(dbcFilename.c_str(), "rb")) { std::ostringstream stream; stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten."; std::string buf = stream.str(); errors.push_back(buf); fclose(f); } else errors.push_back(dbcFilename); } delete sql; }
inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename, const std::string * custom_entries = NULL, const std::string * idname = NULL) { // compatibility format and C++ structure sizes if (!(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename))) return; ++DBCFileCount; std::string dbc_filename = dbc_path + filename; SqlDbc * sql = NULL; if (custom_entries) sql = new SqlDbc(&filename, custom_entries, idname, storage.GetFormat()); if (storage.Load(dbc_filename.c_str(), sql)) { for (uint8 loc = 1; loc < TOTAL_LOCALES; ++loc) { if (!(availableDbcLocales & (1 << loc))) continue; std::string localizedFileName = dbc_path + localeNames[loc] + "/" + filename; if (!storage.LoadStringsFrom(localizedFileName.c_str(), loc)) availableDbcLocales &= ~(1<<loc); // mark locale as not available } } else { // sort problematic dbc to (1) non compatible and (2) non-existed FILE * f=fopen(dbc_filename.c_str(), "rb"); if (f) { printf("Can't LOAD dbc %s !\n", dbc_filename.c_str()); char buf[100]; snprintf(buf, 100, " (exist, but have %d fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else { printf("Can't OPEN dbc %s !\n", dbc_filename.c_str()); errlist.push_back(dbc_filename); } } delete sql; }
inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, char const* dbTable = nullptr, char const* dbFormat = nullptr, char const* dbIndexName = nullptr) { // compatibility format and C++ structure sizes ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); ++DBCFileCount; std::string dbcFilename = dbcPath + filename; if (storage.Load(dbcFilename.c_str())) { for (uint8 i = 0; i < TOTAL_LOCALES; ++i) { if (!(availableDbcLocales & (1 << i))) continue; std::string localizedName(dbcPath); localizedName.append(localeNames[i]); localizedName.push_back('/'); localizedName.append(filename); if (!storage.LoadStringsFrom(localizedName.c_str())) availableDbcLocales &= ~(1 << i); // mark as not available for speedup next checks } if (dbTable) storage.LoadFromDB(dbTable, dbFormat, dbIndexName); } else { // sort problematic dbc to (1) non compatible and (2) non-existed if (FILE* f = fopen(dbcFilename.c_str(), "rb")) { std::ostringstream stream; stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten. Search on forum for TCE00008 for more info."; std::string buf = stream.str(); errors.push_back(buf); fclose(f); } else errors.push_back(dbcFilename); } }
inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, std::string const* customFormat = NULL, std::string const* customIndexName = NULL) { // compatibility format and C++ structure sizes ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); ++DBCFileCount; std::string dbcFilename = dbcPath + filename; SqlDbc * sql = NULL; if (customFormat) sql = new SqlDbc(&filename, customFormat, customIndexName, storage.GetFormat()); if (storage.Load(dbcFilename.c_str(), sql)) { for (uint8 i = 0; i < TOTAL_LOCALES; ++i) { if (!(availableDbcLocales & (1 << i))) continue; std::string localizedName(dbcPath); localizedName.append(localeNames[i]); localizedName.push_back('/'); localizedName.append(filename); if (!storage.LoadStringsFrom(localizedName.c_str())) availableDbcLocales &= ~(1<<i); // mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) non-existed if (FILE* f = fopen(dbcFilename.c_str(), "rb")) { char buf[100]; snprintf(buf, 100, " (exists, but has %u fields instead of " SIZEFMTD ") Possible wrong client version.", storage.GetFieldCount(), strlen(storage.GetFormat())); errors.push_back(dbcFilename + buf); fclose(f); } else errors.push_back(dbcFilename); } delete sql; }
inline void LoadDBC(barGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, std::string filename) { // compatibility format and C++ structure sizes assert(DBCFile::GetFormatRecordSize(storage.fmt) == sizeof(T) || LoadDBC_assert_print(DBCFile::GetFormatRecordSize(storage.fmt),sizeof(T),filename)); if(storage.Load(filename.c_str())) bar.step(); else { // sort problematic dbc to (1) non compatible and (2) non-existed FILE * f=fopen(filename.c_str(),"rb"); if(f) { char buf[100]; snprintf(buf,100," (exist, but have %d fields instead %d) Wrong client version DBC file?",storage.fieldCount,strlen(storage.fmt)); errlist.push_back(filename + buf); fclose(f); }else errlist.push_back(filename); } }
inline void LoadDBC(uint32& availableDbcLocales,barGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename, const std::string * custom_entries = NULL, const std::string * idname = NULL) { // compatibility format and C++ structure sizes if(!(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()),sizeof(T),filename))) return; std::string dbc_filename = dbc_path + filename; SqlDbc * sql = NULL; if (custom_entries) sql = new SqlDbc(&filename,custom_entries, idname,storage.GetFormat()); if (storage.Load(dbc_filename.c_str(), sql)) { bar.step(); } else { // sort problematic dbc to (1) non compatible and (2) non-existed FILE * f=fopen(dbc_filename.c_str(),"rb"); if (f) { printf("Can't LOAD dbc %s !\n", dbc_filename.c_str()); char buf[100]; snprintf(buf,100," (exist, but have %d fields instead " SIZEFMTD ") Wrong client version DBC file?",storage.GetFieldCount(),strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else { printf("Can't OPEN dbc %s !\n", dbc_filename.c_str()); errlist.push_back(dbc_filename); } } delete sql; }