diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-03-08 18:10:02 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-03-08 18:10:02 +0100 |
| commit | 7b235ce6e4da0e9c19fa9c6306bc7a71c7fb905d (patch) | |
| tree | 28611e02e44e55d28f60a9b1b3433831ed6772b8 /src/server | |
| parent | f585c831248f24c93697b0c314dd015897febe39 (diff) | |
Core/DataStores: Refactor DB2 loaders to be reusable by extractors
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 1037 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2DatabaseLoader.cpp | 301 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2DatabaseLoader.h (renamed from src/server/shared/DataStores/DB2StorageLoader.h) | 57 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2StorageLoader.cpp | 1257 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2Store.cpp | 189 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2Store.h | 137 |
6 files changed, 1137 insertions, 1841 deletions
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index e8e93a0d87e..f17ce912a9b 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -21,12 +21,12 @@ #ifndef DB2LoadInfo_h__ #define DB2LoadInfo_h__ -#include "DB2StorageLoader.h" +#include "DB2DatabaseLoader.h" #include "DB2Metadata.h" struct AchievementLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -46,13 +46,14 @@ struct AchievementLoadInfo { false, FT_BYTE, "MinimumCriteria" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT); + return &loadInfo; } }; struct AnimKitLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -61,13 +62,14 @@ struct AnimKitLoadInfo { false, FT_SHORT, "OneShotStopAnimKitID" }, { false, FT_SHORT, "LowDefAnimKitID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT); + return &loadInfo; } }; struct AreaGroupMemberLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -75,13 +77,14 @@ struct AreaGroupMemberLoadInfo { false, FT_SHORT, "AreaGroupID" }, { false, FT_SHORT, "AreaID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER); + return &loadInfo; } }; struct AreaTableLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -114,13 +117,14 @@ struct AreaTableLoadInfo { false, FT_BYTE, "WindSettingsID" }, { false, FT_INT, "UWIntroSound" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE); + return &loadInfo; } }; struct AreaTriggerLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -142,13 +146,14 @@ struct AreaTriggerLoadInfo { false, FT_BYTE, "Flag" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER); + return &loadInfo; } }; struct ArmorLocationLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -159,13 +164,14 @@ struct ArmorLocationLoadInfo { false, FT_FLOAT, "Modifier4" }, { false, FT_FLOAT, "Modifier5" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION); + return &loadInfo; } }; struct ArtifactLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -179,13 +185,14 @@ struct ArtifactLoadInfo { false, FT_BYTE, "ArtifactCategoryID" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT); + return &loadInfo; } }; struct ArtifactAppearanceLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -205,13 +212,14 @@ struct ArtifactAppearanceLoadInfo { false, FT_INT, "ItemAppearanceID" }, { false, FT_INT, "AltItemAppearanceID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE); + return &loadInfo; } }; struct ArtifactAppearanceSetLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -225,13 +233,14 @@ struct ArtifactAppearanceSetLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET); + return &loadInfo; } }; struct ArtifactCategoryLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -239,13 +248,14 @@ struct ArtifactCategoryLoadInfo { false, FT_SHORT, "ArtifactKnowledgeCurrencyID" }, { false, FT_SHORT, "ArtifactKnowledgeMultiplierCurveID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY); + return &loadInfo; } }; struct ArtifactPowerLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -257,13 +267,14 @@ struct ArtifactPowerLoadInfo { false, FT_INT, "ID" }, { true, FT_INT, "RelicType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER); + return &loadInfo; } }; struct ArtifactPowerLinkLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -271,13 +282,14 @@ struct ArtifactPowerLinkLoadInfo { false, FT_SHORT, "FromArtifactPowerID" }, { false, FT_SHORT, "ToArtifactPowerID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK); + return &loadInfo; } }; struct ArtifactPowerRankLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -288,13 +300,14 @@ struct ArtifactPowerRankLoadInfo { false, FT_SHORT, "Unknown" }, { false, FT_BYTE, "Rank" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK); + return &loadInfo; } }; struct ArtifactQuestXpLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -310,13 +323,14 @@ struct ArtifactQuestXpLoadInfo { false, FT_INT, "Exp9" }, { false, FT_INT, "Exp10" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP); + return &loadInfo; } }; struct AuctionHouseLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -326,26 +340,28 @@ struct AuctionHouseLoadInfo { false, FT_BYTE, "DepositRate" }, { false, FT_BYTE, "ConsignmentRate" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE); + return &loadInfo; } }; struct BankBagSlotPricesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_INT, "Cost" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES); + return &loadInfo; } }; struct BannedAddonsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -354,13 +370,14 @@ struct BannedAddonsLoadInfo { false, FT_STRING_NOT_LOCALIZED, "Version" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS); + return &loadInfo; } }; struct BarberShopStyleLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -373,13 +390,14 @@ struct BarberShopStyleLoadInfo { false, FT_BYTE, "Data" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE); + return &loadInfo; } }; struct BattlePetBreedQualityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -387,13 +405,14 @@ struct BattlePetBreedQualityLoadInfo { false, FT_FLOAT, "Modifier" }, { false, FT_BYTE, "Quality" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); + return &loadInfo; } }; struct BattlePetBreedStateLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -402,13 +421,14 @@ struct BattlePetBreedStateLoadInfo { false, FT_BYTE, "BreedID" }, { false, FT_BYTE, "State" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE); + return &loadInfo; } }; struct BattlePetSpeciesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -422,13 +442,14 @@ struct BattlePetSpeciesLoadInfo { true, FT_BYTE, "Source" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES); + return &loadInfo; } }; struct BattlePetSpeciesStateLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -437,13 +458,14 @@ struct BattlePetSpeciesStateLoadInfo { false, FT_SHORT, "SpeciesID" }, { false, FT_BYTE, "State" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); + return &loadInfo; } }; struct BattlemasterListLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -479,13 +501,14 @@ struct BattlemasterListLoadInfo { false, FT_BYTE, "MaxPlayers" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST); + return &loadInfo; } }; struct BroadcastTextLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -505,13 +528,14 @@ struct BroadcastTextLoadInfo { false, FT_INT, "SoundID2" }, { false, FT_INT, "PlayerConditionID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT); + return &loadInfo; } }; struct CharSectionsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -526,13 +550,14 @@ struct CharSectionsLoadInfo { false, FT_BYTE, "Type" }, { false, FT_BYTE, "Color" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS); + return &loadInfo; } }; struct CharStartOutfitLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -568,13 +593,14 @@ struct CharStartOutfitLoadInfo { false, FT_BYTE, "OutfitID" }, { false, FT_BYTE, "PetFamilyID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT); + return &loadInfo; } }; struct CharTitlesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -584,13 +610,14 @@ struct CharTitlesLoadInfo { false, FT_SHORT, "MaskID" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); + return &loadInfo; } }; struct ChatChannelsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -600,13 +627,14 @@ struct ChatChannelsLoadInfo { false, FT_STRING, "Shortcut" }, { false, FT_BYTE, "FactionGroup" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS); + return &loadInfo; } }; struct ChrClassesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -630,13 +658,14 @@ struct ChrClassesLoadInfo { false, FT_BYTE, "Unk1" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES); + return &loadInfo; } }; struct ChrClassesXPowerTypesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -644,13 +673,14 @@ struct ChrClassesXPowerTypesLoadInfo { false, FT_BYTE, "ClassID" }, { false, FT_BYTE, "PowerType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); + return &loadInfo; } }; struct ChrRacesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -698,13 +728,14 @@ struct ChrRacesLoadInfo { false, FT_INT, "Unk2" }, { false, FT_INT, "Unk3" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES); + return &loadInfo; } }; struct ChrSpecializationLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -723,13 +754,14 @@ struct ChrSpecializationLoadInfo { false, FT_INT, "Flags" }, { false, FT_INT, "AnimReplacementSetID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION); + return &loadInfo; } }; struct CinematicCameraLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -741,13 +773,14 @@ struct CinematicCameraLoadInfo { false, FT_FLOAT, "OriginFacing" }, { false, FT_SHORT, "SoundID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA); + return &loadInfo; } }; struct CinematicSequencesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -762,13 +795,14 @@ struct CinematicSequencesLoadInfo { false, FT_SHORT, "Camera7" }, { false, FT_SHORT, "Camera8" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES); + return &loadInfo; } }; struct CreatureDisplayInfoLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -797,13 +831,14 @@ struct CreatureDisplayInfoLoadInfo { true, FT_BYTE, "Gender" }, { true, FT_BYTE, "Unk700" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO); + return &loadInfo; } }; struct CreatureDisplayInfoExtraLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -823,13 +858,14 @@ struct CreatureDisplayInfoExtraLoadInfo { false, FT_BYTE, "CustomDisplayOption3" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); + return &loadInfo; } }; struct CreatureFamilyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -845,13 +881,14 @@ struct CreatureFamilyLoadInfo { false, FT_BYTE, "MaxScaleLevel" }, { false, FT_BYTE, "PetTalentType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY); + return &loadInfo; } }; struct CreatureModelDataLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -890,13 +927,14 @@ struct CreatureModelDataLoadInfo { false, FT_INT, "SoundID" }, { false, FT_INT, "CreatureGeosetDataID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA); + return &loadInfo; } }; struct CreatureTypeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -904,13 +942,14 @@ struct CreatureTypeLoadInfo { false, FT_STRING, "Name" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE); + return &loadInfo; } }; struct CriteriaLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -927,13 +966,14 @@ struct CriteriaLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_BYTE, "EligibilityWorldStateValue" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA); + return &loadInfo; } }; struct CriteriaTreeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -946,13 +986,14 @@ struct CriteriaTreeLoadInfo { false, FT_BYTE, "Operator" }, { true, FT_INT, "OrderIndex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE); + return &loadInfo; } }; struct CurrencyTypesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -969,13 +1010,14 @@ struct CurrencyTypesLoadInfo { false, FT_BYTE, "Quality" }, { false, FT_INT, "SpellWeight" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES); + return &loadInfo; } }; struct CurveLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -983,13 +1025,14 @@ struct CurveLoadInfo { false, FT_BYTE, "Type" }, { false, FT_BYTE, "Unused" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CurveMeta::Instance(), HOTFIX_SEL_CURVE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CurveMeta::Instance(), HOTFIX_SEL_CURVE); + return &loadInfo; } }; struct CurvePointLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -999,13 +1042,14 @@ struct CurvePointLoadInfo { false, FT_SHORT, "CurveID" }, { false, FT_BYTE, "Index" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT); + return &loadInfo; } }; struct DestructibleModelDataLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1033,13 +1077,14 @@ struct DestructibleModelDataLoadInfo { false, FT_BYTE, "DoNotHighlight" }, { false, FT_BYTE, "HealEffect" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); + return &loadInfo; } }; struct DifficultyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1058,13 +1103,14 @@ struct DifficultyLoadInfo { false, FT_BYTE, "ItemBonusTreeModID" }, { false, FT_BYTE, "OrderIndex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY); + return &loadInfo; } }; struct DungeonEncounterLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1078,13 +1124,14 @@ struct DungeonEncounterLoadInfo { false, FT_BYTE, "Flags" }, { true, FT_INT, "OrderIndex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER); + return &loadInfo; } }; struct DurabilityCostsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1119,26 +1166,28 @@ struct DurabilityCostsLoadInfo { false, FT_SHORT, "ArmorSubClassCost7" }, { false, FT_SHORT, "ArmorSubClassCost8" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS); + return &loadInfo; } }; struct DurabilityQualityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_FLOAT, "QualityMod" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY); + return &loadInfo; } }; struct EmotesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1153,13 +1202,14 @@ struct EmotesLoadInfo { true, FT_INT, "ClassMask" }, { true, FT_INT, "RaceMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES); + return &loadInfo; } }; struct EmotesTextLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1167,13 +1217,14 @@ struct EmotesTextLoadInfo { false, FT_STRING, "Name" }, { false, FT_SHORT, "EmoteID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT); + return &loadInfo; } }; struct EmotesTextSoundLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1184,13 +1235,14 @@ struct EmotesTextSoundLoadInfo { false, FT_BYTE, "ClassId" }, { false, FT_INT, "SoundId" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND); + return &loadInfo; } }; struct FactionLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1227,13 +1279,14 @@ struct FactionLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_BYTE, "FriendshipRepID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION); + return &loadInfo; } }; struct FactionTemplateLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1252,13 +1305,14 @@ struct FactionTemplateLoadInfo { false, FT_BYTE, "FriendMask" }, { false, FT_BYTE, "EnemyMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE); + return &loadInfo; } }; struct GameobjectsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1287,13 +1341,14 @@ struct GameobjectsLoadInfo { false, FT_BYTE, "Type" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS); + return &loadInfo; } }; struct GameobjectDisplayInfoLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1309,13 +1364,14 @@ struct GameobjectDisplayInfoLoadInfo { false, FT_FLOAT, "OverrideNameScale" }, { false, FT_SHORT, "ObjectEffectPackageID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); + return &loadInfo; } }; struct GarrAbilityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1328,13 +1384,14 @@ struct GarrAbilityLoadInfo { false, FT_BYTE, "FollowerTypeID" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY); + return &loadInfo; } }; struct GarrBuildingLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1364,13 +1421,14 @@ struct GarrBuildingLoadInfo { true, FT_INT, "CostCurrencyAmount" }, { true, FT_INT, "BonusAmount" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING); + return &loadInfo; } }; struct GarrBuildingPlotInstLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1381,13 +1439,14 @@ struct GarrBuildingPlotInstLoadInfo { false, FT_BYTE, "GarrBuildingID" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST); + return &loadInfo; } }; struct GarrClassSpecLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1400,13 +1459,14 @@ struct GarrClassSpecLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC); + return &loadInfo; } }; struct GarrFollowerLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1442,13 +1502,14 @@ struct GarrFollowerLoadInfo { false, FT_BYTE, "AllianceFlavorTextGarrStringID" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER); + return &loadInfo; } }; struct GarrFollowerXAbilityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1457,13 +1518,14 @@ struct GarrFollowerXAbilityLoadInfo { false, FT_SHORT, "GarrAbilityID" }, { false, FT_BYTE, "FactionIndex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); + return &loadInfo; } }; struct GarrPlotLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1477,13 +1539,14 @@ struct GarrPlotLoadInfo { false, FT_INT, "MinCount" }, { false, FT_INT, "MaxCount" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT); + return &loadInfo; } }; struct GarrPlotBuildingLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1491,13 +1554,14 @@ struct GarrPlotBuildingLoadInfo { false, FT_BYTE, "GarrPlotID" }, { false, FT_BYTE, "GarrBuildingID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING); + return &loadInfo; } }; struct GarrPlotInstanceLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1505,13 +1569,14 @@ struct GarrPlotInstanceLoadInfo { false, FT_STRING, "Name" }, { false, FT_BYTE, "GarrPlotID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE); + return &loadInfo; } }; struct GarrSiteLevelLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1527,13 +1592,14 @@ struct GarrSiteLevelLoadInfo { false, FT_BYTE, "MovieID" }, { false, FT_BYTE, "Level2" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL); + return &loadInfo; } }; struct GarrSiteLevelPlotInstLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1544,13 +1610,14 @@ struct GarrSiteLevelPlotInstLoadInfo { false, FT_BYTE, "GarrPlotInstanceID" }, { false, FT_BYTE, "Unknown" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); + return &loadInfo; } }; struct GemPropertiesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1559,13 +1626,14 @@ struct GemPropertiesLoadInfo { false, FT_SHORT, "EnchantID" }, { false, FT_SHORT, "MinItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES); + return &loadInfo; } }; struct GlyphBindableSpellLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1573,13 +1641,14 @@ struct GlyphBindableSpellLoadInfo { false, FT_INT, "SpellID" }, { false, FT_SHORT, "GlyphPropertiesID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL); + return &loadInfo; } }; struct GlyphPropertiesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1589,13 +1658,14 @@ struct GlyphPropertiesLoadInfo { false, FT_BYTE, "Type" }, { false, FT_BYTE, "GlyphExclusiveCategoryID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES); + return &loadInfo; } }; struct GlyphRequiredSpecLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1603,13 +1673,14 @@ struct GlyphRequiredSpecLoadInfo { false, FT_SHORT, "GlyphPropertiesID" }, { false, FT_SHORT, "ChrSpecializationID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC); + return &loadInfo; } }; struct GuildColorBackgroundLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1618,13 +1689,14 @@ struct GuildColorBackgroundLoadInfo { false, FT_BYTE, "Green" }, { false, FT_BYTE, "Blue" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND); + return &loadInfo; } }; struct GuildColorBorderLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1633,13 +1705,14 @@ struct GuildColorBorderLoadInfo { false, FT_BYTE, "Green" }, { false, FT_BYTE, "Blue" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER); + return &loadInfo; } }; struct GuildColorEmblemLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1648,26 +1721,28 @@ struct GuildColorEmblemLoadInfo { false, FT_BYTE, "Green" }, { false, FT_BYTE, "Blue" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM); + return &loadInfo; } }; struct GuildPerkSpellsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_INT, "SpellID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS); + return &loadInfo; } }; struct HeirloomLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1684,13 +1759,14 @@ struct HeirloomLoadInfo { false, FT_BYTE, "Source" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM); + return &loadInfo; } }; struct HolidaysLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1740,13 +1816,14 @@ struct HolidaysLoadInfo { true, FT_BYTE, "CalendarFilterType" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS); + return &loadInfo; } }; struct ImportPriceArmorLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1756,52 +1833,56 @@ struct ImportPriceArmorLoadInfo { false, FT_FLOAT, "MailFactor" }, { false, FT_FLOAT, "PlateFactor" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR); + return &loadInfo; } }; struct ImportPriceQualityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_FLOAT, "Factor" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY); + return &loadInfo; } }; struct ImportPriceShieldLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_FLOAT, "Factor" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD); + return &loadInfo; } }; struct ImportPriceWeaponLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_FLOAT, "Factor" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON); + return &loadInfo; } }; struct ItemLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1815,13 +1896,14 @@ struct ItemLoadInfo { false, FT_BYTE, "Sheath" }, { false, FT_BYTE, "GroupSoundsID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM); + return &loadInfo; } }; struct ItemAppearanceLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1831,13 +1913,14 @@ struct ItemAppearanceLoadInfo { false, FT_INT, "UIOrder" }, { false, FT_BYTE, "ObjectComponentSlot" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE); + return &loadInfo; } }; struct ItemArmorQualityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1851,13 +1934,14 @@ struct ItemArmorQualityLoadInfo { false, FT_FLOAT, "QualityMod7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY); + return &loadInfo; } }; struct ItemArmorShieldLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1871,13 +1955,14 @@ struct ItemArmorShieldLoadInfo { false, FT_FLOAT, "Quality7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD); + return &loadInfo; } }; struct ItemArmorTotalLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1888,26 +1973,28 @@ struct ItemArmorTotalLoadInfo { false, FT_FLOAT, "Value4" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL); + return &loadInfo; } }; struct ItemBagFamilyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY); + return &loadInfo; } }; struct ItemBonusLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1918,26 +2005,28 @@ struct ItemBonusLoadInfo { false, FT_BYTE, "Type" }, { false, FT_BYTE, "Index" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS); + return &loadInfo; } }; struct ItemBonusListLevelDeltaLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { true, FT_SHORT, "Delta" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA); + return &loadInfo; } }; struct ItemBonusTreeNodeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1947,13 +2036,14 @@ struct ItemBonusTreeNodeLoadInfo { false, FT_SHORT, "BonusListID" }, { false, FT_BYTE, "BonusTreeModID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE); + return &loadInfo; } }; struct ItemChildEquipmentLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1962,13 +2052,14 @@ struct ItemChildEquipmentLoadInfo { false, FT_INT, "AltItemID" }, { false, FT_BYTE, "AltEquipmentSlot" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT); + return &loadInfo; } }; struct ItemClassLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -1978,26 +2069,28 @@ struct ItemClassLoadInfo { false, FT_BYTE, "OldEnumValue" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS); + return &loadInfo; } }; struct ItemCurrencyCostLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_INT, "ItemId" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST); + return &loadInfo; } }; struct ItemDamageAmmoLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2011,13 +2104,14 @@ struct ItemDamageAmmoLoadInfo { false, FT_FLOAT, "DPS7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO); + return &loadInfo; } }; struct ItemDamageOneHandLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2031,13 +2125,14 @@ struct ItemDamageOneHandLoadInfo { false, FT_FLOAT, "DPS7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); + return &loadInfo; } }; struct ItemDamageOneHandCasterLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2051,13 +2146,14 @@ struct ItemDamageOneHandCasterLoadInfo { false, FT_FLOAT, "DPS7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); + return &loadInfo; } }; struct ItemDamageTwoHandLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2071,13 +2167,14 @@ struct ItemDamageTwoHandLoadInfo { false, FT_FLOAT, "DPS7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); + return &loadInfo; } }; struct ItemDamageTwoHandCasterLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2091,13 +2188,14 @@ struct ItemDamageTwoHandCasterLoadInfo { false, FT_FLOAT, "DPS7" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); + return &loadInfo; } }; struct ItemDisenchantLootLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2109,13 +2207,14 @@ struct ItemDisenchantLootLoadInfo { true, FT_BYTE, "ItemSubClass" }, { false, FT_BYTE, "ItemQuality" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT); + return &loadInfo; } }; struct ItemEffectLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2130,13 +2229,14 @@ struct ItemEffectLoadInfo { false, FT_BYTE, "OrderIndex" }, { false, FT_BYTE, "Trigger" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT); + return &loadInfo; } }; struct ItemExtendedCostLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2168,13 +2268,14 @@ struct ItemExtendedCostLoadInfo { false, FT_BYTE, "RequirementFlags" }, { false, FT_BYTE, "RequiredAchievement" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST); + return &loadInfo; } }; struct ItemLimitCategoryLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2183,13 +2284,14 @@ struct ItemLimitCategoryLoadInfo { false, FT_BYTE, "Quantity" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY); + return &loadInfo; } }; struct ItemModifiedAppearanceLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2200,13 +2302,14 @@ struct ItemModifiedAppearanceLoadInfo { false, FT_BYTE, "SourceType" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); + return &loadInfo; } }; struct ItemPriceBaseLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2215,13 +2318,14 @@ struct ItemPriceBaseLoadInfo { false, FT_FLOAT, "WeaponFactor" }, { false, FT_SHORT, "ItemLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE); + return &loadInfo; } }; struct ItemRandomPropertiesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2233,13 +2337,14 @@ struct ItemRandomPropertiesLoadInfo { false, FT_SHORT, "Enchantment4" }, { false, FT_SHORT, "Enchantment5" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); + return &loadInfo; } }; struct ItemRandomSuffixLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2256,13 +2361,14 @@ struct ItemRandomSuffixLoadInfo { false, FT_SHORT, "AllocationPct4" }, { false, FT_SHORT, "AllocationPct5" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX); + return &loadInfo; } }; struct ItemSearchNameLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2283,13 +2389,14 @@ struct ItemSearchNameLoadInfo { false, FT_BYTE, "RequiredLevel" }, { true, FT_INT, "AllowableClass" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME); + return &loadInfo; } }; struct ItemSetLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2316,13 +2423,14 @@ struct ItemSetLoadInfo { false, FT_INT, "RequiredSkill" }, { false, FT_INT, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET); + return &loadInfo; } }; struct ItemSetSpellLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2332,13 +2440,14 @@ struct ItemSetSpellLoadInfo { false, FT_SHORT, "ChrSpecID" }, { false, FT_BYTE, "Threshold" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL); + return &loadInfo; } }; struct ItemSparseLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2447,13 +2556,14 @@ struct ItemSparseLoadInfo { false, FT_BYTE, "ArtifactID" }, { false, FT_BYTE, "RequiredExpansion" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE); + return &loadInfo; } }; struct ItemSpecLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2465,13 +2575,14 @@ struct ItemSpecLoadInfo { false, FT_BYTE, "PrimaryStat" }, { false, FT_BYTE, "SecondaryStat" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC); + return &loadInfo; } }; struct ItemSpecOverrideLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2479,13 +2590,14 @@ struct ItemSpecOverrideLoadInfo { false, FT_INT, "ItemID" }, { false, FT_SHORT, "SpecID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE); + return &loadInfo; } }; struct ItemUpgradeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2496,13 +2608,14 @@ struct ItemUpgradeLoadInfo { false, FT_BYTE, "ItemUpgradePathID" }, { false, FT_BYTE, "ItemLevelBonus" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE); + return &loadInfo; } }; struct ItemXBonusTreeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2510,13 +2623,14 @@ struct ItemXBonusTreeLoadInfo { false, FT_INT, "ItemID" }, { false, FT_SHORT, "BonusTreeID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE); + return &loadInfo; } }; struct KeyChainLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2554,13 +2668,14 @@ struct KeyChainLoadInfo { false, FT_BYTE, "Key31" }, { false, FT_BYTE, "Key32" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN); + return &loadInfo; } }; struct LfgDungeonsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2597,13 +2712,14 @@ struct LfgDungeonsLoadInfo { false, FT_BYTE, "MentorCharLevel" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS); + return &loadInfo; } }; struct LightLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2623,13 +2739,14 @@ struct LightLoadInfo { false, FT_SHORT, "LightParamsID7" }, { false, FT_SHORT, "LightParamsID8" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, LightMeta::Instance(), HOTFIX_SEL_LIGHT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LightMeta::Instance(), HOTFIX_SEL_LIGHT); + return &loadInfo; } }; struct LiquidTypeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2685,13 +2802,14 @@ struct LiquidTypeLoadInfo { false, FT_BYTE, "DepthTexCount6" }, { false, FT_INT, "SoundID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE); + return &loadInfo; } }; struct LockLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2729,26 +2847,28 @@ struct LockLoadInfo { false, FT_BYTE, "Action7" }, { false, FT_BYTE, "Action8" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, LockMeta::Instance(), HOTFIX_SEL_LOCK }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LockMeta::Instance(), HOTFIX_SEL_LOCK); + return &loadInfo; } }; struct MailTemplateLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_STRING, "Body" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE); + return &loadInfo; } }; struct MapLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2775,13 +2895,14 @@ struct MapLoadInfo { false, FT_BYTE, "MaxPlayers" }, { false, FT_BYTE, "TimeOffset" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MapMeta::Instance(), HOTFIX_SEL_MAP }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MapMeta::Instance(), HOTFIX_SEL_MAP); + return &loadInfo; } }; struct MapDifficultyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2795,13 +2916,14 @@ struct MapDifficultyLoadInfo { false, FT_BYTE, "ItemBonusTreeModID" }, { false, FT_INT, "Context" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY); + return &loadInfo; } }; struct ModifierTreeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2814,13 +2936,14 @@ struct ModifierTreeLoadInfo { false, FT_BYTE, "Operator" }, { false, FT_BYTE, "Amount" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE); + return &loadInfo; } }; struct MountLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2836,13 +2959,14 @@ struct MountLoadInfo { false, FT_BYTE, "Source" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MountMeta::Instance(), HOTFIX_SEL_MOUNT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountMeta::Instance(), HOTFIX_SEL_MOUNT); + return &loadInfo; } }; struct MountCapabilityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2855,13 +2979,14 @@ struct MountCapabilityLoadInfo { false, FT_INT, "ID" }, { false, FT_INT, "RequiredAura" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY); + return &loadInfo; } }; struct MountTypeXCapabilityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2870,13 +2995,14 @@ struct MountTypeXCapabilityLoadInfo { false, FT_SHORT, "MountCapabilityID" }, { false, FT_BYTE, "OrderIndex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); + return &loadInfo; } }; struct MovieLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2886,13 +3012,14 @@ struct MovieLoadInfo { false, FT_BYTE, "Volume" }, { false, FT_BYTE, "KeyID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, MovieMeta::Instance(), HOTFIX_SEL_MOVIE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MovieMeta::Instance(), HOTFIX_SEL_MOVIE); + return &loadInfo; } }; struct NameGenLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2901,13 +3028,14 @@ struct NameGenLoadInfo { false, FT_BYTE, "Race" }, { false, FT_BYTE, "Sex" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN); + return &loadInfo; } }; struct NamesProfanityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2915,26 +3043,28 @@ struct NamesProfanityLoadInfo { false, FT_STRING_NOT_LOCALIZED, "Name" }, { true, FT_BYTE, "Language" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY); + return &loadInfo; } }; struct NamesReservedLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_STRING_NOT_LOCALIZED, "Name" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED); + return &loadInfo; } }; struct NamesReservedLocaleLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2942,13 +3072,14 @@ struct NamesReservedLocaleLoadInfo { false, FT_STRING_NOT_LOCALIZED, "Name" }, { false, FT_BYTE, "LocaleMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED); + return &loadInfo; } }; struct OverrideSpellDataLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2966,26 +3097,28 @@ struct OverrideSpellDataLoadInfo { false, FT_INT, "PlayerActionbarFileDataID" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA); + return &loadInfo; } }; struct PhaseLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_SHORT, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PhaseMeta::Instance(), HOTFIX_SEL_PHASE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PhaseMeta::Instance(), HOTFIX_SEL_PHASE); + return &loadInfo; } }; struct PhaseXPhaseGroupLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -2993,13 +3126,14 @@ struct PhaseXPhaseGroupLoadInfo { false, FT_SHORT, "PhaseID" }, { false, FT_SHORT, "PhaseGroupID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP); + return &loadInfo; } }; struct PlayerConditionLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3150,13 +3284,14 @@ struct PlayerConditionLoadInfo { true, FT_INT, "Unknown7001" }, { true, FT_INT, "Unknown7002" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION); + return &loadInfo; } }; struct PowerDisplayLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3167,13 +3302,14 @@ struct PowerDisplayLoadInfo { false, FT_BYTE, "Green" }, { false, FT_BYTE, "Blue" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY); + return &loadInfo; } }; struct PowerTypeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3191,13 +3327,14 @@ struct PowerTypeLoadInfo { true, FT_BYTE, "RegenerationMax" }, { false, FT_BYTE, "UIModifier" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PowerTypeMeta::Instance(), HOTFIX_SEL_POWER_TYPE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PowerTypeMeta::Instance(), HOTFIX_SEL_POWER_TYPE); + return &loadInfo; } }; struct PvpDifficultyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3207,13 +3344,14 @@ struct PvpDifficultyLoadInfo { false, FT_BYTE, "MinLevel" }, { false, FT_BYTE, "MaxLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY); + return &loadInfo; } }; struct QuestFactionRewardLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3229,13 +3367,14 @@ struct QuestFactionRewardLoadInfo { true, FT_SHORT, "QuestRewFactionValue9" }, { true, FT_SHORT, "QuestRewFactionValue10" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD); + return &loadInfo; } }; struct QuestMoneyRewardLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3251,13 +3390,14 @@ struct QuestMoneyRewardLoadInfo { false, FT_INT, "Money9" }, { false, FT_INT, "Money10" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD); + return &loadInfo; } }; struct QuestPackageItemLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3267,13 +3407,14 @@ struct QuestPackageItemLoadInfo { false, FT_BYTE, "ItemCount" }, { false, FT_BYTE, "FilterType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM); + return &loadInfo; } }; struct QuestSortLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3281,26 +3422,28 @@ struct QuestSortLoadInfo { false, FT_STRING, "SortName" }, { false, FT_BYTE, "SortOrder" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT); + return &loadInfo; } }; struct QuestV2LoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_SHORT, "UniqueBitFlag" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2 }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2); + return &loadInfo; } }; struct QuestXpLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3316,13 +3459,14 @@ struct QuestXpLoadInfo { false, FT_SHORT, "Exp9" }, { false, FT_SHORT, "Exp10" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP); + return &loadInfo; } }; struct RandPropPointsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3343,13 +3487,14 @@ struct RandPropPointsLoadInfo { false, FT_INT, "UncommonPropertiesPoints4" }, { false, FT_INT, "UncommonPropertiesPoints5" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS); + return &loadInfo; } }; struct RulesetItemUpgradeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3357,13 +3502,14 @@ struct RulesetItemUpgradeLoadInfo { false, FT_INT, "ItemID" }, { false, FT_SHORT, "ItemUpgradeID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE); + return &loadInfo; } }; struct ScalingStatDistributionLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3372,13 +3518,14 @@ struct ScalingStatDistributionLoadInfo { false, FT_INT, "MinLevel" }, { false, FT_INT, "MaxLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); + return &loadInfo; } }; struct ScenarioLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3388,13 +3535,14 @@ struct ScenarioLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_BYTE, "Type" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ScenarioMeta::Instance(), HOTFIX_SEL_SCENARIO }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScenarioMeta::Instance(), HOTFIX_SEL_SCENARIO); + return &loadInfo; } }; struct ScenarioStepLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3409,13 +3557,14 @@ struct ScenarioStepLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_INT, "BonusRequiredStepID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ScenarioStepMeta::Instance(), HOTFIX_SEL_SCENARIO_STEP }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScenarioStepMeta::Instance(), HOTFIX_SEL_SCENARIO_STEP); + return &loadInfo; } }; struct SceneScriptLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3425,26 +3574,28 @@ struct SceneScriptLoadInfo { false, FT_SHORT, "PrevScriptId" }, { false, FT_SHORT, "NextScriptId" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SceneScriptMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SceneScriptMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT); + return &loadInfo; } }; struct SceneScriptPackageLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_STRING_NOT_LOCALIZED, "Name" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SceneScriptPackageMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT_PACKAGE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SceneScriptPackageMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT_PACKAGE); + return &loadInfo; } }; struct SkillLineLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3458,13 +3609,14 @@ struct SkillLineLoadInfo { false, FT_BYTE, "CanLink" }, { false, FT_INT, "ParentSkillLineID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE); + return &loadInfo; } }; struct SkillLineAbilityLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3483,13 +3635,14 @@ struct SkillLineAbilityLoadInfo { false, FT_BYTE, "NumSkillUps" }, { true, FT_INT, "ClassMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY); + return &loadInfo; } }; struct SkillRaceClassInfoLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3502,13 +3655,14 @@ struct SkillRaceClassInfoLoadInfo { false, FT_BYTE, "MinLevel" }, { true, FT_INT, "ClassMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO); + return &loadInfo; } }; struct SoundKitLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3530,13 +3684,14 @@ struct SoundKitLoadInfo { false, FT_BYTE, "Unk700" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT); + return &loadInfo; } }; struct SpecializationSpellsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3547,13 +3702,14 @@ struct SpecializationSpellsLoadInfo { false, FT_BYTE, "OrderIndex" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS); + return &loadInfo; } }; struct SpellLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3565,13 +3721,14 @@ struct SpellLoadInfo { false, FT_INT, "ID" }, { false, FT_INT, "DescriptionVariablesID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellMeta::Instance(), HOTFIX_SEL_SPELL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMeta::Instance(), HOTFIX_SEL_SPELL); + return &loadInfo; } }; struct SpellAuraOptionsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3585,13 +3742,14 @@ struct SpellAuraOptionsLoadInfo { false, FT_BYTE, "ProcChance" }, { false, FT_BYTE, "SpellProcsPerMinuteID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS); + return &loadInfo; } }; struct SpellAuraRestrictionsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3607,13 +3765,14 @@ struct SpellAuraRestrictionsLoadInfo { false, FT_BYTE, "ExcludeCasterAuraState" }, { false, FT_BYTE, "ExcludeTargetAuraState" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); + return &loadInfo; } }; struct SpellCastTimesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3622,13 +3781,14 @@ struct SpellCastTimesLoadInfo { true, FT_INT, "MinCastTime" }, { true, FT_SHORT, "CastTimePerLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES); + return &loadInfo; } }; struct SpellCastingRequirementsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3641,13 +3801,14 @@ struct SpellCastingRequirementsLoadInfo { false, FT_BYTE, "MinReputation" }, { false, FT_BYTE, "RequiredAuraVision" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); + return &loadInfo; } }; struct SpellCategoriesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3662,13 +3823,14 @@ struct SpellCategoriesLoadInfo { false, FT_BYTE, "Mechanic" }, { false, FT_BYTE, "PreventionType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES); + return &loadInfo; } }; struct SpellCategoryLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3680,13 +3842,14 @@ struct SpellCategoryLoadInfo { false, FT_BYTE, "MaxCharges" }, { false, FT_INT, "ChargeCategoryType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY); + return &loadInfo; } }; struct SpellClassOptionsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3699,13 +3862,14 @@ struct SpellClassOptionsLoadInfo { false, FT_BYTE, "SpellClassSet" }, { false, FT_INT, "ModalNextSpell" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS); + return &loadInfo; } }; struct SpellCooldownsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3716,13 +3880,14 @@ struct SpellCooldownsLoadInfo { false, FT_INT, "StartRecoveryTime" }, { false, FT_BYTE, "DifficultyID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS); + return &loadInfo; } }; struct SpellDurationLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3731,13 +3896,14 @@ struct SpellDurationLoadInfo { true, FT_INT, "MaxDuration" }, { true, FT_SHORT, "DurationPerLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION); + return &loadInfo; } }; struct SpellEffectLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3773,13 +3939,14 @@ struct SpellEffectLoadInfo { false, FT_INT, "EffectIndex" }, { false, FT_INT, "EffectAttributes" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT); + return &loadInfo; } }; struct SpellEffectScalingLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3789,13 +3956,14 @@ struct SpellEffectScalingLoadInfo { false, FT_FLOAT, "ResourceCoefficient" }, { false, FT_INT, "SpellEffectID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING); + return &loadInfo; } }; struct SpellEquippedItemsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3805,26 +3973,28 @@ struct SpellEquippedItemsLoadInfo { true, FT_INT, "EquippedItemSubClassMask" }, { true, FT_BYTE, "EquippedItemClass" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); + return &loadInfo; } }; struct SpellFocusObjectLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT); + return &loadInfo; } }; struct SpellInterruptsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3837,13 +4007,14 @@ struct SpellInterruptsLoadInfo { false, FT_SHORT, "InterruptFlags" }, { false, FT_BYTE, "DifficultyID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS); + return &loadInfo; } }; struct SpellItemEnchantmentLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3876,13 +4047,14 @@ struct SpellItemEnchantmentLoadInfo { true, FT_BYTE, "ScalingClassRestricted" }, { false, FT_INT, "PlayerConditionID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); + return &loadInfo; } }; struct SpellItemEnchantmentConditionLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3918,13 +4090,14 @@ struct SpellItemEnchantmentConditionLoadInfo { false, FT_INT, "LTOperand4" }, { false, FT_INT, "LTOperand5" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); + return &loadInfo; } }; struct SpellLearnSpellLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3933,13 +4106,14 @@ struct SpellLearnSpellLoadInfo { false, FT_INT, "SpellID" }, { false, FT_INT, "OverridesSpellID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL); + return &loadInfo; } }; struct SpellLevelsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3951,13 +4125,14 @@ struct SpellLevelsLoadInfo { false, FT_BYTE, "DifficultyID" }, { false, FT_BYTE, "MaxUsableLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS); + return &loadInfo; } }; struct SpellMiscLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -3985,13 +4160,14 @@ struct SpellMiscLoadInfo { false, FT_SHORT, "ActiveIconID" }, { false, FT_BYTE, "SchoolMask" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); + return &loadInfo; } }; struct SpellPowerLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4010,13 +4186,14 @@ struct SpellPowerLoadInfo { false, FT_INT, "PowerDisplayID" }, { false, FT_INT, "UnitPowerBarID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER); + return &loadInfo; } }; struct SpellPowerDifficultyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4024,13 +4201,14 @@ struct SpellPowerDifficultyLoadInfo { false, FT_BYTE, "PowerIndex" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY); + return &loadInfo; } }; struct SpellProcsPerMinuteLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4038,13 +4216,14 @@ struct SpellProcsPerMinuteLoadInfo { false, FT_FLOAT, "BaseProcRate" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); + return &loadInfo; } }; struct SpellProcsPerMinuteModLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4054,13 +4233,14 @@ struct SpellProcsPerMinuteModLoadInfo { false, FT_BYTE, "Type" }, { false, FT_BYTE, "SpellProcsPerMinuteID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); + return &loadInfo; } }; struct SpellRadiusLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4070,13 +4250,14 @@ struct SpellRadiusLoadInfo { false, FT_FLOAT, "RadiusMin" }, { false, FT_FLOAT, "RadiusMax" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS); + return &loadInfo; } }; struct SpellRangeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4089,13 +4270,14 @@ struct SpellRangeLoadInfo { false, FT_STRING, "DisplayNameShort" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE); + return &loadInfo; } }; struct SpellReagentsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4118,13 +4300,14 @@ struct SpellReagentsLoadInfo { false, FT_SHORT, "ReagentCount7" }, { false, FT_SHORT, "ReagentCount8" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS); + return &loadInfo; } }; struct SpellScalingLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4135,13 +4318,14 @@ struct SpellScalingLoadInfo { false, FT_INT, "MinScalingLevel" }, { false, FT_INT, "MaxScalingLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING); + return &loadInfo; } }; struct SpellShapeshiftLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4153,13 +4337,14 @@ struct SpellShapeshiftLoadInfo { false, FT_INT, "ShapeshiftMask2" }, { false, FT_BYTE, "StanceBarOrder" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT); + return &loadInfo; } }; struct SpellShapeshiftFormLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4185,13 +4370,14 @@ struct SpellShapeshiftFormLoadInfo { true, FT_BYTE, "CreatureType" }, { false, FT_BYTE, "BonusActionBar" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); + return &loadInfo; } }; struct SpellTargetRestrictionsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4205,13 +4391,14 @@ struct SpellTargetRestrictionsLoadInfo { false, FT_BYTE, "MaxAffectedTargets" }, { false, FT_INT, "MaxTargetLevel" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); + return &loadInfo; } }; struct SpellTotemsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4222,13 +4409,14 @@ struct SpellTotemsLoadInfo { false, FT_SHORT, "RequiredTotemCategoryID1" }, { false, FT_SHORT, "RequiredTotemCategoryID2" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS); + return &loadInfo; } }; struct SpellXSpellVisualLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4243,13 +4431,14 @@ struct SpellXSpellVisualLoadInfo { false, FT_BYTE, "Priority" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL); + return &loadInfo; } }; struct SummonPropertiesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4260,13 +4449,14 @@ struct SummonPropertiesLoadInfo { true, FT_INT, "Type" }, { true, FT_INT, "Slot" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES); + return &loadInfo; } }; struct TactKeyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4288,13 +4478,14 @@ struct TactKeyLoadInfo { false, FT_BYTE, "Key15" }, { false, FT_BYTE, "Key16" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TactKeyMeta::Instance(), HOTFIX_SEL_TACT_KEY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TactKeyMeta::Instance(), HOTFIX_SEL_TACT_KEY); + return &loadInfo; } }; struct TalentLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4310,13 +4501,14 @@ struct TalentLoadInfo { false, FT_BYTE, "CategoryMask2" }, { false, FT_BYTE, "ClassID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TalentMeta::Instance(), HOTFIX_SEL_TALENT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TalentMeta::Instance(), HOTFIX_SEL_TALENT); + return &loadInfo; } }; struct TaxiNodesLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4334,13 +4526,14 @@ struct TaxiNodesLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES); + return &loadInfo; } }; struct TaxiPathLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4349,13 +4542,14 @@ struct TaxiPathLoadInfo { false, FT_INT, "ID" }, { false, FT_INT, "Cost" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH); + return &loadInfo; } }; struct TaxiPathNodeLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4371,13 +4565,14 @@ struct TaxiPathNodeLoadInfo { false, FT_BYTE, "Flags" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE); + return &loadInfo; } }; struct TotemCategoryLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4386,13 +4581,14 @@ struct TotemCategoryLoadInfo { false, FT_INT, "CategoryMask" }, { false, FT_BYTE, "CategoryType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY); + return &loadInfo; } }; struct ToyLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4402,13 +4598,14 @@ struct ToyLoadInfo { false, FT_BYTE, "CategoryFilter" }, { false, FT_INT, "ID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, ToyMeta::Instance(), HOTFIX_SEL_TOY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ToyMeta::Instance(), HOTFIX_SEL_TOY); + return &loadInfo; } }; struct TransportAnimationLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4420,13 +4617,14 @@ struct TransportAnimationLoadInfo { false, FT_FLOAT, "PosZ" }, { false, FT_BYTE, "SequenceID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION); + return &loadInfo; } }; struct TransportRotationLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4438,13 +4636,14 @@ struct TransportRotationLoadInfo { false, FT_FLOAT, "Z" }, { false, FT_FLOAT, "W" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION); + return &loadInfo; } }; struct UnitPowerBarLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4476,13 +4675,14 @@ struct UnitPowerBarLoadInfo { false, FT_INT, "MinPower" }, { false, FT_INT, "MaxPower" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR); + return &loadInfo; } }; struct VehicleLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4528,13 +4728,14 @@ struct VehicleLoadInfo { false, FT_BYTE, "FlagsB" }, { false, FT_BYTE, "UILocomotionType" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE); + return &loadInfo; } }; struct VehicleSeatLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4605,13 +4806,14 @@ struct VehicleSeatLoadInfo { false, FT_INT, "EnterUISoundID" }, { false, FT_INT, "ExitUISoundID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT); + return &loadInfo; } }; struct WmoAreaTableLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4631,13 +4833,14 @@ struct WmoAreaTableLoadInfo { false, FT_INT, "ID" }, { false, FT_INT, "UWZoneMusic" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE); + return &loadInfo; } }; struct WorldMapAreaLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4659,13 +4862,14 @@ struct WorldMapAreaLoadInfo { false, FT_INT, "ID" }, { false, FT_INT, "PlayerConditionID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA); + return &loadInfo; } }; struct WorldMapOverlayLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4687,13 +4891,14 @@ struct WorldMapOverlayLoadInfo { false, FT_INT, "PlayerConditionID" }, { false, FT_INT, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY); + return &loadInfo; } }; struct WorldMapTransformsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4714,13 +4919,14 @@ struct WorldMapTransformsLoadInfo { false, FT_SHORT, "NewAreaID" }, { false, FT_BYTE, "Flags" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS); + return &loadInfo; } }; struct WorldSafeLocsLoadInfo { - static DB2LoadInfo Instance() + static DB2LoadInfo const* Instance() { static DB2FieldMeta const fields[] = { @@ -4732,7 +4938,8 @@ struct WorldSafeLocsLoadInfo { false, FT_STRING, "AreaName" }, { false, FT_SHORT, "MapID" }, }; - return { &fields[0], std::extent<decltype(fields)>::value, WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS); + return &loadInfo; } }; diff --git a/src/server/shared/DataStores/DB2DatabaseLoader.cpp b/src/server/shared/DataStores/DB2DatabaseLoader.cpp new file mode 100644 index 00000000000..a19b8a5b389 --- /dev/null +++ b/src/server/shared/DataStores/DB2DatabaseLoader.cpp @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DB2DatabaseLoader.h" +#include "Database/DatabaseEnv.h" +#include "DB2Meta.h" + +DB2LoadInfo::DB2LoadInfo() : DB2FileLoadInfo() +{ +} + +DB2LoadInfo::DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta, HotfixDatabaseStatements statement) + : DB2FileLoadInfo(fields, fieldCount, meta), Statement(statement) +{ +} + +static char const* nullStr = ""; + +char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool) +{ + // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format + PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(_loadInfo->Statement)); + if (!result) + return nullptr; + + if (_loadInfo->Meta->GetDbFieldCount() != result->GetFieldCount()) + return nullptr; + + // get struct size and index pos + uint32 indexField = _loadInfo->Meta->GetDbIndexField(); + uint32 recordSize = _loadInfo->Meta->GetRecordSize(); + + // we store flat holders pool as single memory block + std::size_t stringFields = _loadInfo->GetStringFieldCount(false); + std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true); + + // each string field at load have array of string for each locale + std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); + + if (stringFields) + { + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); + stringHolders = new char[stringHoldersPoolSize]; + + // DB2 strings expected to have at least empty string + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + ((char const**)stringHolders)[i] = nullStr; + } + else + stringHolders = nullptr; + + // Resize index table + // database query *MUST* contain ORDER BY `index_field` DESC clause + uint32 indexTableSize = (*result)[indexField].GetUInt32() + 1; + if (indexTableSize < records) + indexTableSize = records; + + if (indexTableSize > records) + { + char** tmpIdxTable = new char*[indexTableSize]; + memset(tmpIdxTable, 0, indexTableSize * sizeof(char*)); + memcpy(tmpIdxTable, indexTable, records * sizeof(char*)); + delete[] indexTable; + indexTable = tmpIdxTable; + } + + char* tempDataTable = new char[result->GetRowCount() * recordSize]; + uint32* newIndexes = new uint32[result->GetRowCount()]; + uint32 rec = 0; + uint32 newRecords = 0; + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldOffset = 0; + + uint32 indexValue = fields[indexField].GetUInt32(); + + // Attempt to overwrite existing data + char* dataValue = indexTable[indexValue]; + if (!dataValue) + { + newIndexes[newRecords] = indexValue; + dataValue = &tempDataTable[newRecords++ * recordSize]; + } + + uint32 f = 0; + if (!_loadInfo->Meta->HasIndexFieldInData()) + { + *((uint32*)(&dataValue[offset])) = indexValue; + offset += 4; + ++f; + } + + for (uint32 x = 0; x < _loadInfo->Meta->FieldCount; ++x) + { + for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) + { + switch (_loadInfo->TypesString[f]) + { + case FT_FLOAT: + *((float*)(&dataValue[offset])) = fields[f].GetFloat(); + offset += 4; + break; + case FT_INT: + *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); + offset += 4; + break; + case FT_BYTE: + *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); + offset += 1; + break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); + *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); + + stringFieldOffset += sizeof(LocalizedString); + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) + stringPool.push_back(str); + + stringFieldOffset += sizeof(char*); + offset += sizeof(char*); + break; + } + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], _storageName.c_str()); + break; + } + ++f; + } + } + + ASSERT(offset == recordSize); + ++rec; + } while (result->NextRow()); + + if (!newRecords) + { + delete[] tempDataTable; + delete[] newIndexes; + return nullptr; + } + + // Compact new data table to only contain new records not previously loaded from file + char* dataTable = new char[newRecords * recordSize]; + memcpy(dataTable, tempDataTable, newRecords * recordSize); + + // insert new records to index table + for (uint32 i = 0; i < newRecords; ++i) + indexTable[newIndexes[i]] = &dataTable[i * recordSize]; + + delete[] tempDataTable; + delete[] newIndexes; + + records = indexTableSize; + + return dataTable; +} + +void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool) +{ + PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(HotfixDatabaseStatements(_loadInfo->Statement + 1)); + stmt->setString(0, localeNames[locale]); + PreparedQueryResult result = HotfixDatabase.Query(stmt); + if (!result) + return; + + std::size_t stringFields = _loadInfo->GetStringFieldCount(true); + if (result->GetFieldCount() != stringFields + 1 /*ID*/) + return; + + uint32 fieldCount = _loadInfo->Meta->FieldCount; + uint32 recordSize = _loadInfo->Meta->GetRecordSize(); + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldNumInRecord = 0; + uint32 indexValue = fields[0].GetUInt32(); + + if (indexValue >= records) + continue; + + // Attempt to overwrite existing data + if (char* dataValue = indexTable[indexValue]) + { + uint32 fieldIndex = 0; + if (!_loadInfo->Meta->HasIndexFieldInData()) + { + offset += 4; + ++fieldIndex; + } + + for (uint32 x = 0; x < fieldCount; ++x) + { + for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) + { + switch (_loadInfo->TypesString[fieldIndex]) + { + case FT_FLOAT: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); + if (db2str->Str[locale] == nullStr) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + offset += sizeof(char*); + break; + default: + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], _storageName.c_str()); + break; + } + ++fieldIndex; + } + } + + ASSERT(offset == recordSize); + } + else + TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u locale %s!", _storageName.c_str(), indexValue, localeNames[locale]); + + } while (result->NextRow()); + + return; +} + +char* DB2DatabaseLoader::AddString(char const** holder, std::string const& value) +{ + if (!value.empty()) + { + std::size_t existingLength = strlen(*holder); + if (existingLength >= value.length()) + { + // Reuse existing storage if there is enough space + char* str = const_cast<char*>(*holder); + memcpy(str, value.c_str(), value.length()); + str[value.length()] = '\0'; + return nullptr; + } + + char* str = new char[value.length() + 1]; + memcpy(str, value.c_str(), value.length()); + str[value.length()] = '\0'; + *holder = str; + return str; + } + + return nullptr; +} diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2DatabaseLoader.h index 62361edcedd..f288b46859b 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2DatabaseLoader.h @@ -15,67 +15,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DB2_FILE_LOADER_H -#define DB2_FILE_LOADER_H +#ifndef DB2_DATABASE_LOADER_H +#define DB2_DATABASE_LOADER_H -#include "Define.h" +#include "DB2FileLoader.h" #include "Implementation/HotfixDatabase.h" -class DB2FileLoaderImpl; -struct DB2Meta; -struct DB2FieldMeta; - -#pragma pack(push, 1) -struct DB2Header -{ - uint32 Signature; - uint32 RecordCount; - uint32 FieldCount; - uint32 RecordSize; - uint32 StringTableSize; - uint32 TableHash; - uint32 LayoutHash; - uint32 MinId; - uint32 MaxId; - uint32 Locale; - uint32 CopyTableSize; - uint16 Flags; - int16 IndexField; -}; -#pragma pack(pop) - -struct TC_SHARED_API DB2LoadInfo +struct TC_SHARED_API DB2LoadInfo : public DB2FileLoadInfo { DB2LoadInfo(); DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta, HotfixDatabaseStatements statement); - uint32 GetStringFieldCount(bool localizedOnly) const; - - DB2FieldMeta const* Fields; - std::size_t FieldCount; - DB2Meta const* Meta; HotfixDatabaseStatements Statement; - std::string TypesString; -}; - -class TC_SHARED_API DB2FileLoader -{ -public: - DB2FileLoader(); - ~DB2FileLoader(); - - bool Load(char const* filename, DB2LoadInfo const* loadInfo); - char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool); - char* AutoProduceStrings(char* dataTable, uint32 locale); - void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable); - - uint32 GetCols() const { return _header.FieldCount; } - uint32 GetTableHash() const { return _header.TableHash; } - uint32 GetLayoutHash() const { return _header.LayoutHash; } - -private: - DB2FileLoaderImpl* _impl; - DB2Header _header; }; class TC_SHARED_API DB2DatabaseLoader diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp deleted file mode 100644 index 11caca97afb..00000000000 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ /dev/null @@ -1,1257 +0,0 @@ -/* - * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "DB2StorageLoader.h" -#include "Database/DatabaseEnv.h" -#include "DB2Meta.h" -#include "Utilities/ByteConverter.h" - -DB2LoadInfo::DB2LoadInfo() : Fields(nullptr), FieldCount(0), Meta(nullptr), Statement(MAX_HOTFIXDATABASE_STATEMENTS) -{ -} - -DB2LoadInfo::DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta, HotfixDatabaseStatements statement) - : Fields(fields), FieldCount(fieldCount), Meta(meta), Statement(statement) -{ - TypesString.reserve(FieldCount); - for (std::size_t i = 0; i < FieldCount; ++i) - TypesString += char(Fields[i].Type); -} - -uint32 DB2LoadInfo::GetStringFieldCount(bool localizedOnly) const -{ - uint32 stringFields = 0; - for (std::size_t i = 0; i < TypesString.length(); ++i) - if (TypesString[i] == FT_STRING || (TypesString[i] == FT_STRING_NOT_LOCALIZED && !localizedOnly)) - ++stringFields; - - return stringFields; -} - -class DB2FileLoaderImpl -{ -public: - virtual ~DB2FileLoaderImpl() { } - virtual bool Load(char const* filename, FILE* file, DB2LoadInfo const* loadInfo, DB2Header const* header) = 0; - virtual char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool) = 0; - virtual char* AutoProduceStrings(char* dataTable, uint32 locale) = 0; - virtual void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) = 0; -}; - -class DB2FileLoaderRegularImpl : public DB2FileLoaderImpl -{ -public: - DB2FileLoaderRegularImpl(); - ~DB2FileLoaderRegularImpl(); - - bool Load(char const* filename, FILE* file, DB2LoadInfo const* loadInfo, DB2Header const* header) override; - char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool) override; - char* AutoProduceStrings(char* dataTable, uint32 locale) override; - void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) override; - -private: - class Record - { - public: - float getFloat(uint32 field, uint32 arrayIndex) const; - uint32 getUInt(uint32 field, uint32 arrayIndex, bool isSigned) const; - uint8 getUInt8(uint32 field, uint32 arrayIndex) const; - uint16 getUInt16(uint32 field, uint32 arrayIndex) const; - char const* getString(uint32 field, uint32 arrayIndex) const; - - private: - uint16 GetOffset(uint32 field) const; - uint16 GetByteSize(uint32 field) const; - uint32 GetVarInt(uint32 field, uint32 arrayIndex, bool isSigned) const; - - Record(DB2FileLoaderRegularImpl &file_, unsigned char *offset_); - unsigned char *offset; - DB2FileLoaderRegularImpl &file; - - friend class DB2FileLoaderRegularImpl; - }; - - // Get record by id - Record getRecord(size_t id); - -#pragma pack(push, 1) - struct FieldEntry - { - uint16 UnusedBits; - uint16 Offset; - }; -#pragma pack(pop) - - char const* fileName; - DB2LoadInfo const* _loadInfo; - DB2Header const* _header; - - unsigned char* data; - unsigned char* stringTable; - unsigned char* idTable; - uint32 idTableSize; - unsigned char* copyTable; - FieldEntry* fields; -}; - -class DB2FileLoaderSparseImpl : public DB2FileLoaderImpl -{ -public: - DB2FileLoaderSparseImpl(); - ~DB2FileLoaderSparseImpl(); - - bool Load(char const* filename, FILE* file, DB2LoadInfo const* loadInfo, DB2Header const* header) override; - char* AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool) override; - char* AutoProduceStrings(char* dataTable, uint32 locale) override; - void AutoProduceRecordCopies(uint32 /*records*/, char** /*indexTable*/, char* /*dataTable*/) override { } - -private: -#pragma pack(push, 1) - struct OffsetTableEntry - { - uint32 FileOffset; - uint16 RecordSize; - }; - struct FieldEntry - { - uint16 UnusedBits; - uint16 Offset; - }; -#pragma pack(pop) - - char const* fileName; - DB2LoadInfo const* _loadInfo; - DB2Header const* _header; - FieldEntry* fields; - - uint32 dataStart; - unsigned char* data; - OffsetTableEntry* offsets; -}; - -float DB2FileLoaderRegularImpl::Record::getFloat(uint32 field, uint32 arrayIndex) const -{ - ASSERT(field < file._header->FieldCount); - float val = *reinterpret_cast<float*>(offset + GetOffset(field) + arrayIndex * sizeof(float)); - EndianConvert(val); - return val; -} - -uint32 DB2FileLoaderRegularImpl::Record::getUInt(uint32 field, uint32 arrayIndex, bool isSigned) const -{ - ASSERT(field < file._header->FieldCount); - return GetVarInt(field, arrayIndex, isSigned); -} - -uint8 DB2FileLoaderRegularImpl::Record::getUInt8(uint32 field, uint32 arrayIndex) const -{ - ASSERT(field < file._header->FieldCount); - ASSERT(GetByteSize(field) == 1); - return *reinterpret_cast<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); -} - -uint16 DB2FileLoaderRegularImpl::Record::getUInt16(uint32 field, uint32 arrayIndex) const -{ - ASSERT(field < file._header->FieldCount); - ASSERT(GetByteSize(field) == 2); - uint16 val = *reinterpret_cast<uint16*>(offset + GetOffset(field) + arrayIndex * sizeof(uint16)); - EndianConvert(val); - return val; -} - -char const* DB2FileLoaderRegularImpl::Record::getString(uint32 field, uint32 arrayIndex) const -{ - ASSERT(field < file._header->FieldCount); - uint32 stringOffset = *reinterpret_cast<uint32*>(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); - EndianConvert(stringOffset); - ASSERT(stringOffset < file._header->StringTableSize); - return reinterpret_cast<char*>(file.stringTable + stringOffset); -} - -uint16 DB2FileLoaderRegularImpl::Record::GetOffset(uint32 field) const -{ - ASSERT(field < file._header->FieldCount); - return file.fields[field].Offset; -} - -uint16 DB2FileLoaderRegularImpl::Record::GetByteSize(uint32 field) const -{ - ASSERT(field < file._header->FieldCount); - return 4 - file.fields[field].UnusedBits / 8; -} - -uint32 DB2FileLoaderRegularImpl::Record::GetVarInt(uint32 field, uint32 arrayIndex, bool isSigned) const -{ - ASSERT(field < file._header->FieldCount); - uint32 val = *reinterpret_cast<uint32*>(offset + GetOffset(field) + arrayIndex * (4 - file.fields[field].UnusedBits / 8)); - EndianConvert(val); - if (isSigned) - return int32(val) << file.fields[field].UnusedBits >> file.fields[field].UnusedBits; - - return val << file.fields[field].UnusedBits >> file.fields[field].UnusedBits; -} - -DB2FileLoaderRegularImpl::Record::Record(DB2FileLoaderRegularImpl &file_, unsigned char *offset_) : offset(offset_), file(file_) -{ -} - -DB2FileLoaderRegularImpl::DB2FileLoaderRegularImpl() -{ - fileName = nullptr; - _loadInfo = nullptr; - _header = nullptr; - data = nullptr; - stringTable = nullptr; - idTable = nullptr; - idTableSize = 0; - copyTable = nullptr; - fields = nullptr; -} - -bool DB2FileLoaderRegularImpl::Load(char const* filename, FILE* file, DB2LoadInfo const* loadInfo, DB2Header const* header) -{ - _loadInfo = loadInfo; - _header = header; - ASSERT(_loadInfo->Meta->IndexField == -1 || _loadInfo->Meta->IndexField == int32(header->IndexField)); - - fileName = filename; - fields = new FieldEntry[header->FieldCount]; - if (fread(fields, header->FieldCount * sizeof(FieldEntry), 1, file) != 1) - return false; - - if (!_loadInfo->Meta->HasIndexFieldInData()) - idTableSize = header->RecordCount * sizeof(uint32); - - data = new unsigned char[header->RecordSize * header->RecordCount + header->StringTableSize]; - stringTable = data + header->RecordSize * header->RecordCount; - - if (fread(data, header->RecordSize * header->RecordCount + header->StringTableSize, 1, file) != 1) - return false; - - if (idTableSize) - { - idTable = new unsigned char[idTableSize]; - if (fread(idTable, idTableSize, 1, file) != 1) - return false; - } - - if (header->CopyTableSize) - { - copyTable = new unsigned char[header->CopyTableSize]; - if (fread(copyTable, header->CopyTableSize, 1, file) != 1) - return false; - } - - return true; -} - -DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl() -{ - delete[] data; - delete[] idTable; - delete[] copyTable; - delete[] fields; -} - -DB2FileLoaderRegularImpl::Record DB2FileLoaderRegularImpl::getRecord(size_t id) -{ - assert(data); - return Record(*this, data + id * _header->RecordSize); -} - -static char const* const nullStr = ""; - -char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool) -{ - if (_loadInfo->Meta->FieldCount != _header->FieldCount) - return nullptr; - - //get struct size and index pos - uint32 indexField = _loadInfo->Meta->GetIndexField(); - uint32 recordsize = _loadInfo->Meta->GetRecordSize(); - - uint32 maxi = 0; - //find max index - if (!idTableSize) - { - for (uint32 y = 0; y < _header->RecordCount; ++y) - { - uint32 ind = getRecord(y).getUInt(indexField, 0, false); - if (ind > maxi) - maxi = ind; - } - } - else - { - for (uint32 y = 0; y < _header->RecordCount; ++y) - { - uint32 ind = ((uint32*)idTable)[y]; - if (ind > maxi) - maxi = ind; - } - } - - for (uint32 y = 0; y < _header->CopyTableSize; y += 8) - { - uint32 ind = *((uint32*)(copyTable + y)); - if (ind > maxi) - maxi = ind; - } - - using index_entry_t = char*; - - ++maxi; - records = maxi; - indexTable = new index_entry_t[maxi]; - memset(indexTable, 0, maxi * sizeof(index_entry_t)); - - char* dataTable = new char[(_header->RecordCount + (_header->CopyTableSize / 8)) * recordsize]; - - // we store flat holders pool as single memory block - std::size_t stringFields = _loadInfo->GetStringFieldCount(false); - std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true); - - // each string field at load have array of string for each locale - std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); - char* stringHoldersPool = nullptr; - if (stringFields) - { - std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * _header->RecordCount; - - stringHoldersPool = new char[stringHoldersPoolSize]; - stringPool.push_back(stringHoldersPool); - - // DB2 strings expected to have at least empty string - for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) - ((char const**)stringHoldersPool)[i] = nullStr; - } - - uint32 offset = 0; - - for (uint32 y = 0; y < _header->RecordCount; y++) - { - Record rec = getRecord(y); - uint32 indexVal = _loadInfo->Meta->HasIndexFieldInData() ? rec.getUInt(indexField, 0, false) : ((uint32*)idTable)[y]; - - indexTable[indexVal] = &dataTable[offset]; - - uint32 fieldIndex = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - *((uint32*)(&dataTable[offset])) = indexVal; - offset += 4; - ++fieldIndex; - } - - uint32 stringFieldOffset = 0; - - for (uint32 x = 0; x < _header->FieldCount; ++x) - { - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[fieldIndex]) - { - case FT_FLOAT: - *((float*)(&dataTable[offset])) = rec.getFloat(x, z); - offset += 4; - break; - case FT_INT: - *((uint32*)(&dataTable[offset])) = rec.getUInt(x, z, _loadInfo->Fields[fieldIndex].IsSigned); - offset += 4; - break; - case FT_BYTE: - *((uint8*)(&dataTable[offset])) = rec.getUInt8(x, z); - offset += 1; - break; - case FT_SHORT: - *((uint16*)(&dataTable[offset])) = rec.getUInt16(x, z); - offset += 2; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: - { - // init db2 string field slots by pointers to string holders - char const*** slot = (char const***)(&dataTable[offset]); - *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); - if (_loadInfo->TypesString[fieldIndex] == FT_STRING) - stringFieldOffset += sizeof(LocalizedString); - else - stringFieldOffset += sizeof(char*); - - offset += sizeof(char*); - break; - } - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName); - break; - } - ++fieldIndex; - } - } - } - - return dataTable; -} - -char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 locale) -{ - if (_loadInfo->Meta->FieldCount != _header->FieldCount) - return nullptr; - - if (!(_header->Locale & (1 << locale))) - { - char const* sep = ""; - std::ostringstream str; - for (uint32 i = 0; i < TOTAL_LOCALES; ++i) - { - if (_header->Locale & (1 << i)) - { - str << sep << localeNames[i]; - sep = ", "; - } - } - - TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]); - return nullptr; - } - - char* stringPool = new char[_header->StringTableSize]; - memcpy(stringPool, stringTable, _header->StringTableSize); - - uint32 offset = 0; - - for (uint32 y = 0; y < _header->RecordCount; y++) - { - uint32 fieldIndex = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - offset += 4; - ++fieldIndex; - } - - for (uint32 x = 0; x < _header->FieldCount; ++x) - { - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[fieldIndex]) - { - case FT_FLOAT: - case FT_INT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: - { - // fill only not filled entries - LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); - if (db2str->Str[locale] == nullStr) - { - char const* st = getRecord(y).getString(x, z); - db2str->Str[locale] = stringPool + (st - (char const*)stringTable); - } - - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char** db2str = (char**)(&dataTable[offset]); - char const* st = getRecord(y).getString(x, z); - *db2str = stringPool + (st - (char const*)stringTable); - offset += sizeof(char*); - break; - } - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName); - break; - } - ++fieldIndex; - } - } - } - - return stringPool; -} - -void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) -{ - uint32 recordsize = _loadInfo->Meta->GetRecordSize(); - uint32 offset = _header->RecordCount * recordsize; - uint32* copyIds = (uint32*)copyTable; - for (uint32 c = 0; c < _header->CopyTableSize / 4; c += 2) - { - uint32 to = copyIds[c]; - uint32 from = copyIds[c + 1]; - - if (from && from < records && to < records && indexTable[from]) - { - indexTable[to] = &dataTable[offset]; - memcpy(indexTable[to], indexTable[from], recordsize); - - if (_loadInfo->Meta->HasIndexFieldInData()) - *((uint32*)(&dataTable[offset + fields[_loadInfo->Meta->GetIndexField()].Offset])) = to; - else - *((uint32*)(&dataTable[offset])) = to; - - offset += recordsize; - } - } -} - -DB2FileLoaderSparseImpl::DB2FileLoaderSparseImpl() -{ - fileName = nullptr; - _loadInfo = nullptr; - _header = nullptr; - fields = nullptr; - dataStart = 0; - data = nullptr; - offsets = nullptr; -} - -bool DB2FileLoaderSparseImpl::Load(char const* filename, FILE* file, DB2LoadInfo const* loadInfo, DB2Header const* header) -{ - _loadInfo = loadInfo; - _header = header; - fileName = filename; - - fields = new FieldEntry[header->FieldCount]; - if (fread(fields, header->FieldCount * sizeof(FieldEntry), 1, file) != 1) - return false; - - dataStart = ftell(file); - - data = new unsigned char[header->StringTableSize - dataStart]; - - if (fread(data, header->StringTableSize - dataStart, 1, file) != 1) - return false; - - offsets = new OffsetTableEntry[header->MaxId - header->MinId + 1]; - if (fread(offsets, (header->MaxId - header->MinId + 1) * 6, 1, file) != 1) - return false; - - return true; -} - -DB2FileLoaderSparseImpl::~DB2FileLoaderSparseImpl() -{ - delete[] data; - delete[] offsets; - delete[] fields; -} - -char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable, std::vector<char*>& stringPool) -{ - if (_loadInfo->Meta->FieldCount != _header->FieldCount) - return NULL; - - //get struct size and index pos - uint32 recordsize = _loadInfo->Meta->GetRecordSize(); - - uint32 offsetCount = _header->MaxId - _header->MinId + 1; - uint32 records = 0; - uint32 expandedDataSize = 0; - for (uint32 i = 0; i < offsetCount; ++i) - { - if (offsets[i].FileOffset && offsets[i].RecordSize) - { - ++records; - expandedDataSize += offsets[i].RecordSize; - } - } - - using index_entry_t = char*; - - maxId = _header->MaxId + 1; - indexTable = new index_entry_t[maxId]; - memset(indexTable, 0, maxId * sizeof(index_entry_t)); - - char* dataTable = new char[records * recordsize]; - - // we store flat holders pool as single memory block - std::size_t stringFields = _loadInfo->GetStringFieldCount(false); - std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true); - - // each string field at load have array of string for each locale - std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); - std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * records; - - char* stringHoldersPool = new char[stringHoldersPoolSize]; - stringPool.push_back(stringHoldersPool); - - // DB2 strings expected to have at least empty string - for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) - ((char const**)stringHoldersPool)[i] = nullStr; - - char* stringTable = new char[expandedDataSize - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; - memset(stringTable, 0, expandedDataSize - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); - stringPool.push_back(stringTable); - char* stringPtr = stringTable; - - uint32 offset = 0; - uint32 recordNum = 0; - for (uint32 y = 0; y < offsetCount; ++y) - { - if (!offsets[y].FileOffset || !offsets[y].RecordSize) - continue; - - indexTable[y + _header->MinId] = &dataTable[offset]; - ASSERT(indexTable[y + _header->MinId]); - std::size_t fieldOffset = 0; - uint32 stringFieldOffset = 0; - - uint32 fieldIndex = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - *((uint32*)(&dataTable[offset])) = y + _header->MinId; - offset += 4; - ++fieldIndex; - } - - for (uint32 x = 0; x < _header->FieldCount; ++x) - { - uint16 fieldBytes = 4 - fields[x].UnusedBits / 8; - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[fieldIndex]) - { - case FT_FLOAT: - { - float val = *reinterpret_cast<float*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - EndianConvert(val); - *((float*)(&dataTable[offset])) = val; - offset += 4; - fieldOffset += 4; - break; - } - case FT_INT: - { - ASSERT(fieldBytes && fieldBytes <= 4); - uint32 val = 0; - switch (fieldBytes) - { - case 1: - val = *reinterpret_cast<uint8*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - break; - case 2: - { - uint16 val16 = *reinterpret_cast<uint16*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - EndianConvert(val16); - val = val16; - break; - } - case 3: - { -#pragma pack(push, 1) - struct dbcint24 { uint8 v[3]; }; -#pragma pack(pop) - dbcint24 i24v = *reinterpret_cast<dbcint24*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - EndianConvert(i24v); - val = uint32(i24v.v[0]) | (uint32(i24v.v[1]) << 8) | (uint32(i24v.v[2]) << 16); - break; - } - case 4: - val = *reinterpret_cast<uint32*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - EndianConvert(val); - break; - default: - break; - } - *((uint32*)(&dataTable[offset])) = val; - offset += 4; - fieldOffset += fieldBytes; - break; - } - case FT_BYTE: - { - ASSERT(fieldBytes == 1); - *((uint8*)(&dataTable[offset])) = *reinterpret_cast<uint8*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - offset += 1; - fieldOffset += 1; - break; - } - case FT_SHORT: - { - ASSERT(fieldBytes == 2); - uint16 val = *reinterpret_cast<uint16*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); - EndianConvert(val); - *((uint16*)(&dataTable[offset])) = val; - offset += 2; - fieldOffset += 2; - break; - } - case FT_STRING: - { - LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); - *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); - for (uint32 locale = 0; locale < TOTAL_LOCALES; ++locale) - if (_header->Locale & (1 << locale)) - (*slot)->Str[locale] = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - stringFieldOffset += sizeof(LocalizedString); - offset += sizeof(LocalizedString*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const*** slot = (char const***)(&dataTable[offset]); - *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); - **slot = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - stringFieldOffset += sizeof(char*); - offset += sizeof(char*); - break; - } - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName); - break; - } - ++fieldIndex; - } - } - - ++recordNum; - } - - return dataTable; -} - -char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale) -{ - if (_loadInfo->Meta->FieldCount != _header->FieldCount) - return nullptr; - - if (!(_header->Locale & (1 << locale))) - { - char const* sep = ""; - std::ostringstream str; - for (uint32 i = 0; i < TOTAL_LOCALES; ++i) - { - if (_header->Locale & (1 << i)) - { - str << sep << localeNames[i]; - sep = ", "; - } - } - - TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]); - return nullptr; - } - - uint32 offsetCount = _header->MaxId - _header->MinId + 1; - uint32 records = 0; - for (uint32 i = 0; i < offsetCount; ++i) - if (offsets[i].FileOffset && offsets[i].RecordSize) - ++records; - - uint32 recordsize = _loadInfo->Meta->GetRecordSize(); - std::size_t stringFields = _loadInfo->GetStringFieldCount(true); - char* stringTable = new char[_header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; - memset(stringTable, 0, _header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); - char* stringPtr = stringTable; - - uint32 offset = 0; - - for (uint32 y = 0; y < offsetCount; y++) - { - if (!offsets[y].FileOffset || !offsets[y].RecordSize) - continue; - - uint32 fieldIndex = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - offset += 4; - ++fieldIndex; - } - - std::size_t fieldOffset = 0; - for (uint32 x = 0; x < _header->FieldCount; ++x) - { - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[fieldIndex]) - { - case FT_FLOAT: - offset += 4; - fieldOffset += 4; - break; - case FT_INT: - offset += 4; - fieldOffset += 4 - fields[x].UnusedBits / 8; - break; - case FT_BYTE: - offset += 1; - fieldOffset += 1; - break; - case FT_SHORT: - offset += 2; - fieldOffset += 2; - break; - case FT_STRING: - { - LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); - db2str->Str[locale] = stringPtr; - strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); - fieldOffset += strlen(stringPtr) + 1; - stringPtr += strlen(stringPtr) + 1; - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - fieldOffset += strlen((char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]) + 1; - offset += sizeof(char*); - break; - } - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName); - break; - } - ++fieldIndex; - } - } - } - - return stringTable; -} - -char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool) -{ - // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format - PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(_loadInfo->Statement)); - if (!result) - return nullptr; - - if (_loadInfo->Meta->GetDbFieldCount() != result->GetFieldCount()) - return nullptr; - - // get struct size and index pos - uint32 indexField = _loadInfo->Meta->GetDbIndexField(); - uint32 recordSize = _loadInfo->Meta->GetRecordSize(); - - // we store flat holders pool as single memory block - std::size_t stringFields = _loadInfo->GetStringFieldCount(false); - std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true); - - // each string field at load have array of string for each locale - std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); - - if (stringFields) - { - std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); - stringHolders = new char[stringHoldersPoolSize]; - - // DB2 strings expected to have at least empty string - for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) - ((char const**)stringHolders)[i] = nullStr; - } - else - stringHolders = nullptr; - - // Resize index table - // database query *MUST* contain ORDER BY `index_field` DESC clause - uint32 indexTableSize = (*result)[indexField].GetUInt32() + 1; - if (indexTableSize < records) - indexTableSize = records; - - if (indexTableSize > records) - { - char** tmpIdxTable = new char*[indexTableSize]; - memset(tmpIdxTable, 0, indexTableSize * sizeof(char*)); - memcpy(tmpIdxTable, indexTable, records * sizeof(char*)); - delete[] indexTable; - indexTable = tmpIdxTable; - } - - char* tempDataTable = new char[result->GetRowCount() * recordSize]; - uint32* newIndexes = new uint32[result->GetRowCount()]; - uint32 rec = 0; - uint32 newRecords = 0; - - do - { - Field* fields = result->Fetch(); - uint32 offset = 0; - uint32 stringFieldOffset = 0; - - uint32 indexValue = fields[indexField].GetUInt32(); - - // Attempt to overwrite existing data - char* dataValue = indexTable[indexValue]; - if (!dataValue) - { - newIndexes[newRecords] = indexValue; - dataValue = &tempDataTable[newRecords++ * recordSize]; - } - - uint32 f = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - *((uint32*)(&dataValue[offset])) = indexValue; - offset += 4; - ++f; - } - - for (uint32 x = 0; x < _loadInfo->Meta->FieldCount; ++x) - { - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[f]) - { - case FT_FLOAT: - *((float*)(&dataValue[offset])) = fields[f].GetFloat(); - offset += 4; - break; - case FT_INT: - *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); - offset += 4; - break; - case FT_BYTE: - *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); - offset += 1; - break; - case FT_SHORT: - *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); - offset += 2; - break; - case FT_STRING: - { - LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); - *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); - ASSERT(*slot); - - // Value in database in main table field must be for enUS locale - if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) - stringPool.push_back(str); - - stringFieldOffset += sizeof(LocalizedString); - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const** slot = (char const**)(&dataValue[offset]); - *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); - ASSERT(*slot); - - // Value in database in main table field must be for enUS locale - if (char* str = AddString(slot, fields[f].GetString())) - stringPool.push_back(str); - - stringFieldOffset += sizeof(char*); - offset += sizeof(char*); - break; - } - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], _storageName.c_str()); - break; - } - ++f; - } - } - - ASSERT(offset == recordSize); - ++rec; - } while (result->NextRow()); - - if (!newRecords) - { - delete[] tempDataTable; - delete[] newIndexes; - return nullptr; - } - - // Compact new data table to only contain new records not previously loaded from file - char* dataTable = new char[newRecords * recordSize]; - memcpy(dataTable, tempDataTable, newRecords * recordSize); - - // insert new records to index table - for (uint32 i = 0; i < newRecords; ++i) - indexTable[newIndexes[i]] = &dataTable[i * recordSize]; - - delete[] tempDataTable; - delete[] newIndexes; - - records = indexTableSize; - - return dataTable; -} - -void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool) -{ - PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(HotfixDatabaseStatements(_loadInfo->Statement + 1)); - stmt->setString(0, localeNames[locale]); - PreparedQueryResult result = HotfixDatabase.Query(stmt); - if (!result) - return; - - std::size_t stringFields = _loadInfo->GetStringFieldCount(true); - if (result->GetFieldCount() != stringFields + 1 /*ID*/) - return; - - uint32 fieldCount = _loadInfo->Meta->FieldCount; - uint32 recordSize = _loadInfo->Meta->GetRecordSize(); - - do - { - Field* fields = result->Fetch(); - uint32 offset = 0; - uint32 stringFieldNumInRecord = 0; - uint32 indexValue = fields[0].GetUInt32(); - - if (indexValue >= records) - continue; - - // Attempt to overwrite existing data - if (char* dataValue = indexTable[indexValue]) - { - uint32 fieldIndex = 0; - if (!_loadInfo->Meta->HasIndexFieldInData()) - { - offset += 4; - ++fieldIndex; - } - - for (uint32 x = 0; x < fieldCount; ++x) - { - for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z) - { - switch (_loadInfo->TypesString[fieldIndex]) - { - case FT_FLOAT: - case FT_INT: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_SHORT: - offset += 2; - break; - case FT_STRING: - { - // fill only not filled entries - LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); - if (db2str->Str[locale] == nullStr) - if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) - stringPool.push_back(str); - - ++stringFieldNumInRecord; - offset += sizeof(LocalizedString*); - break; - } - case FT_STRING_NOT_LOCALIZED: - offset += sizeof(char*); - break; - default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], _storageName.c_str()); - break; - } - ++fieldIndex; - } - } - - ASSERT(offset == recordSize); - } - else - TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u locale %s!", _storageName.c_str(), indexValue, localeNames[locale]); - - } while (result->NextRow()); - - return; -} - -char* DB2DatabaseLoader::AddString(char const** holder, std::string const& value) -{ - if (!value.empty()) - { - std::size_t existingLength = strlen(*holder); - if (existingLength >= value.length()) - { - // Reuse existing storage if there is enough space - char* str = const_cast<char*>(*holder); - memcpy(str, value.c_str(), value.length()); - str[value.length()] = '\0'; - return nullptr; - } - - char* str = new char[value.length() + 1]; - memcpy(str, value.c_str(), value.length()); - str[value.length()] = '\0'; - *holder = str; - return str; - } - - return nullptr; -} - -DB2FileLoader::DB2FileLoader() : _impl(nullptr) -{ -} - -DB2FileLoader::~DB2FileLoader() -{ - delete _impl; -} - -bool DB2FileLoader::Load(char const* filename, DB2LoadInfo const* loadInfo) -{ - FILE* f = fopen(filename, "rb"); - if (!f) - return false; - - if (fread(&_header.Signature, 4, 1, f) != 1) // Signature - { - fclose(f); - return false; - } - - EndianConvert(_header.Signature); - - if (_header.Signature != 0x35424457) - { - fclose(f); - return false; //'WDB5' - } - - if (fread(&_header.RecordCount, 4, 1, f) != 1) // Number of records - { - fclose(f); - return false; - } - - EndianConvert(_header.RecordCount); - - if (fread(&_header.FieldCount, 4, 1, f) != 1) // Number of fields - { - fclose(f); - return false; - } - - EndianConvert(_header.FieldCount); - - if (fread(&_header.RecordSize, 4, 1, f) != 1) // Size of a record - { - fclose(f); - return false; - } - - EndianConvert(_header.RecordSize); - - if (fread(&_header.StringTableSize, 4, 1, f) != 1) // String size - { - fclose(f); - return false; - } - - EndianConvert(_header.StringTableSize); - - if (fread(&_header.TableHash, 4, 1, f) != 1) // Table hash - { - fclose(f); - return false; - } - - EndianConvert(_header.TableHash); - - if (fread(&_header.LayoutHash, 4, 1, f) != 1) // Layout hash - { - fclose(f); - return false; - } - - EndianConvert(_header.LayoutHash); - - if (_header.LayoutHash != loadInfo->Meta->LayoutHash) - { - fclose(f); - return false; - } - - if (fread(&_header.MinId, 4, 1, f) != 1) // MinIndex WDB2 - { - fclose(f); - return false; - } - - EndianConvert(_header.MinId); - - if (fread(&_header.MaxId, 4, 1, f) != 1) // MaxIndex WDB2 - { - fclose(f); - return false; - } - - EndianConvert(_header.MaxId); - - if (fread(&_header.Locale, 4, 1, f) != 1) // Locales - { - fclose(f); - return false; - } - - EndianConvert(_header.Locale); - - if (fread(&_header.CopyTableSize, 4, 1, f) != 1) - { - fclose(f); - return false; - } - - EndianConvert(_header.CopyTableSize); - - if (fread(&_header.Flags, 4, 1, f) != 1) - { - fclose(f); - return false; - } - - EndianConvert(_header.Flags); - - if (!(_header.Flags & 0x1)) - _impl = new DB2FileLoaderRegularImpl(); - else - _impl = new DB2FileLoaderSparseImpl(); - - bool result = _impl->Load(filename, f, loadInfo, &_header); - fclose(f); - return result; -} - -char* DB2FileLoader::AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool) -{ - return _impl->AutoProduceData(count, indexTable, stringPool); -} - -char* DB2FileLoader::AutoProduceStrings(char* dataTable, uint32 locale) -{ - return _impl->AutoProduceStrings(dataTable, locale); -} - -void DB2FileLoader::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) -{ - _impl->AutoProduceRecordCopies(records, indexTable, dataTable); -} diff --git a/src/server/shared/DataStores/DB2Store.cpp b/src/server/shared/DataStores/DB2Store.cpp new file mode 100644 index 00000000000..bb36ed6b61b --- /dev/null +++ b/src/server/shared/DataStores/DB2Store.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DB2Store.h" +#include "ByteBuffer.h" +#include "DB2DatabaseLoader.h" +#include "DB2Meta.h" + +struct DB2FileSystemSource : public DB2FileSource +{ + DB2FileSystemSource(std::string const& fileName) + { + _fileName = fileName; + _file = fopen(_fileName.c_str(), "rb"); + } + + ~DB2FileSystemSource() + { + if (_file) + fclose(_file); + } + + bool IsOpen() const override + { + return _file != nullptr; + } + + bool Read(void* buffer, std::size_t numBytes) override + { + return fread(buffer, numBytes, 1, _file) == 1; + } + + std::size_t GetPosition() const override + { + return ftell(_file); + } + + char const* GetFileName() const override + { + return _fileName.c_str(); + } + +private: + std::string _fileName; + FILE* _file; +}; + +DB2StorageBase::DB2StorageBase(char const* fileName, DB2LoadInfo const* loadInfo) + : _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(loadInfo), _dataTable(nullptr), _dataTableEx(nullptr), _indexTableSize(0) +{ +} + +DB2StorageBase::~DB2StorageBase() +{ + delete[] _dataTable; + delete[] _dataTableEx; + for (char* strings : _stringPool) + delete[] strings; +} + +void DB2StorageBase::WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const +{ + std::size_t i = 0; + if (!_loadInfo->Meta->HasIndexFieldInData()) + { + entry += 4; + ++i; + } + + for (; i < _loadInfo->FieldCount; ++i) + { + switch (_loadInfo->TypesString[i]) + { + case FT_INT: + buffer << *(uint32*)entry; + entry += 4; + break; + case FT_FLOAT: + buffer << *(float*)entry; + entry += 4; + break; + case FT_BYTE: + buffer << *(uint8*)entry; + entry += 1; + break; + case FT_SHORT: + buffer << *(uint16*)entry; + entry += 2; + break; + case FT_STRING: + { + LocalizedString* locStr = *(LocalizedString**)entry; + if (locStr->Str[locale][0] == '\0') + locale = 0; + + buffer << locStr->Str[locale]; + entry += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + buffer << *(char const**)entry; + entry += sizeof(char const*); + break; + } + } + } +} + +bool DB2StorageBase::Load(std::string const& path, uint32 locale, char**& indexTable) +{ + indexTable = nullptr; + DB2FileLoader db2; + { + DB2FileSystemSource source(path + _fileName); + // Check if load was successful, only then continue + if (!db2.Load(&source, _loadInfo)) + return false; + } + + _fieldCount = db2.GetCols(); + _tableHash = db2.GetTableHash(); + _layoutHash = db2.GetLayoutHash(); + + // load raw non-string data + _dataTable = db2.AutoProduceData(_indexTableSize, indexTable, _stringPool); + + // load strings from db2 data + if (!_stringPool.empty()) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) + _stringPool.push_back(stringBlock); + + db2.AutoProduceRecordCopies(_indexTableSize, indexTable, _dataTable); + + // error in db2 file at loading if NULL + return indexTable != nullptr; +} + +bool DB2StorageBase::LoadStringsFrom(std::string const& path, uint32 locale, char** indexTable) +{ + // DB2 must be already loaded using Load + if (!indexTable) + return false; + + DB2FileLoader db2; + { + DB2FileSystemSource source(path + _fileName); + // Check if load was successful, only then continue + if (!db2.Load(&source, _loadInfo)) + return false; + } + + // load strings from another locale db2 data + if (_loadInfo->GetStringFieldCount(true)) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) + _stringPool.push_back(stringBlock); + + return true; +} + +void DB2StorageBase::LoadFromDB(char**& indexTable) +{ + char* extraStringHolders = nullptr; + _dataTableEx = DB2DatabaseLoader(_fileName, _loadInfo).Load(_indexTableSize, indexTable, extraStringHolders, _stringPool); + if (extraStringHolders) + _stringPool.push_back(extraStringHolders); +} + +void DB2StorageBase::LoadStringsFromDB(uint32 locale, char** indexTable) +{ + if (!_loadInfo->GetStringFieldCount(true)) + return; + + DB2DatabaseLoader(_fileName, _loadInfo).LoadStrings(locale, _indexTableSize, indexTable, _stringPool); +} diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index 7011a3b6e61..68cd888cd05 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -19,41 +19,29 @@ #define DB2STORE_H #include "Common.h" -#include "DB2Meta.h" -#include "DB2StorageLoader.h" #include "DBStorageIterator.h" -#include "ByteBuffer.h" +#include <vector> + +class ByteBuffer; +struct DB2LoadInfo; /// Interface class for common access -class DB2StorageBase +class TC_SHARED_API DB2StorageBase { public: - DB2StorageBase(char const* fileName, DB2LoadInfo&& loadInfo) - : _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(std::move(loadInfo)), _dataTable(nullptr), _dataTableEx(nullptr) { } - - virtual ~DB2StorageBase() - { - delete[] _dataTable; - delete[] _dataTableEx; - for (char* strings : _stringPool) - delete[] strings; - } + DB2StorageBase(char const* fileName, DB2LoadInfo const* loadInfo); + virtual ~DB2StorageBase(); uint32 GetTableHash() const { return _tableHash; } - uint32 GetLayoutHash() const { return _layoutHash; } virtual bool HasRecord(uint32 id) const = 0; - virtual void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const = 0; - virtual void EraseRecord(uint32 id) = 0; std::string const& GetFileName() const { return _fileName; } - uint32 GetFieldCount() const { return _fieldCount; } - - DB2LoadInfo const* GetLoadInfo() const { return &_loadInfo; } + DB2LoadInfo const* GetLoadInfo() const { return _loadInfo; } virtual bool Load(std::string const& path, uint32 locale) = 0; virtual bool LoadStringsFrom(std::string const& path, uint32 locale) = 0; @@ -61,63 +49,21 @@ public: virtual void LoadStringsFromDB(uint32 locale) = 0; protected: - void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const - { - std::size_t i = 0; - if (!_loadInfo.Meta->HasIndexFieldInData()) - { - entry += 4; - ++i; - } - - for (; i < _loadInfo.FieldCount; ++i) - { - switch (_loadInfo.TypesString[i]) - { - case FT_INT: - buffer << *(uint32*)entry; - entry += 4; - break; - case FT_FLOAT: - buffer << *(float*)entry; - entry += 4; - break; - case FT_BYTE: - buffer << *(uint8*)entry; - entry += 1; - break; - case FT_SHORT: - buffer << *(uint16*)entry; - entry += 2; - break; - case FT_STRING: - { - LocalizedString* locStr = *(LocalizedString**)entry; - if (locStr->Str[locale][0] == '\0') - locale = 0; - - buffer << locStr->Str[locale]; - entry += sizeof(LocalizedString*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - buffer << *(char const**)entry; - entry += sizeof(char const*); - break; - } - } - } - } + void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const; + bool Load(std::string const& path, uint32 locale, char**& indexTable); + bool LoadStringsFrom(std::string const& path, uint32 locale, char** indexTable); + void LoadFromDB(char**& indexTable); + void LoadStringsFromDB(uint32 locale, char** indexTable); uint32 _tableHash; uint32 _layoutHash; std::string _fileName; uint32 _fieldCount; - DB2LoadInfo _loadInfo; + DB2LoadInfo const* _loadInfo; char* _dataTable; char* _dataTableEx; std::vector<char*> _stringPool; + uint32 _indexTableSize; }; template<class T> @@ -128,10 +74,9 @@ class DB2Storage : public DB2StorageBase public: typedef DBStorageIterator<T> iterator; - DB2Storage(char const* fileName, DB2LoadInfo&& loadInfo) : DB2StorageBase(fileName, std::move(loadInfo)), - _indexTableSize(0) + DB2Storage(char const* fileName, DB2LoadInfo const* loadInfo) : DB2StorageBase(fileName, loadInfo) { - _indexTable.AsT = NULL; + _indexTable.AsT = nullptr; } ~DB2Storage() @@ -153,61 +98,22 @@ public: uint32 GetNumRows() const { return _indexTableSize; } bool Load(std::string const& path, uint32 locale) override { - DB2FileLoader db2; - // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), &_loadInfo)) - return false; - - _fieldCount = db2.GetCols(); - _tableHash = db2.GetTableHash(); - _layoutHash = db2.GetLayoutHash(); - - // load raw non-string data - _dataTable = db2.AutoProduceData(_indexTableSize, _indexTable.AsChar, _stringPool); - - // load strings from db2 data - if (!_stringPool.empty()) - if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) - _stringPool.push_back(stringBlock); - - db2.AutoProduceRecordCopies(_indexTableSize, _indexTable.AsChar, _dataTable); - - // error in db2 file at loading if NULL - return _indexTable.AsT != NULL; + return DB2StorageBase::Load(path, locale, _indexTable.AsChar); } bool LoadStringsFrom(std::string const& path, uint32 locale) override { - // DB2 must be already loaded using Load - if (!_indexTable.AsT) - return false; - - DB2FileLoader db2; - // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), &_loadInfo)) - return false; - - // load strings from another locale db2 data - if (_loadInfo.GetStringFieldCount(true)) - if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) - _stringPool.push_back(stringBlock); - return true; + return DB2StorageBase::LoadStringsFrom(path, locale, _indexTable.AsChar); } void LoadFromDB() override { - char* extraStringHolders = nullptr; - _dataTableEx = DB2DatabaseLoader(_fileName, &_loadInfo).Load(_indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); - if (extraStringHolders) - _stringPool.push_back(extraStringHolders); + DB2StorageBase::LoadFromDB(_indexTable.AsChar); } void LoadStringsFromDB(uint32 locale) override { - if (!_loadInfo.GetStringFieldCount(true)) - return; - - DB2DatabaseLoader(_fileName, &_loadInfo).LoadStrings(locale, _indexTableSize, _indexTable.AsChar, _stringPool); + DB2StorageBase::LoadStringsFromDB(locale, _indexTable.AsChar); } iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } @@ -219,7 +125,6 @@ private: T** AsT; char** AsChar; } _indexTable; - uint32 _indexTableSize; }; #endif |
