public static string GetName(StoreNameType type, int entry, bool withEntry = true) { if (!SQLConnector.Enabled) return entry.ToString(CultureInfo.InvariantCulture); if (type != StoreNameType.Map && entry == 0) return "0"; // map can be 0 if (!SQLDatabase.NameStores.ContainsKey(type)) return entry.ToString(CultureInfo.InvariantCulture); string name; if (!SQLDatabase.NameStores[type].TryGetValue(entry, out name)) if (!withEntry) return "-Unknown-"; if (!String.IsNullOrEmpty(name)) { if (withEntry) return entry + " (" + name + ")"; return name; } return entry.ToString(CultureInfo.InvariantCulture); }
public static string GetName(StoreNameType type, int entry, bool withEntry = true) { if (type != StoreNameType.Map && entry <= 0) { return("0"); // map can be 0 } var name = (type == StoreNameType.Unit || type == StoreNameType.GameObject || type == StoreNameType.Item || type == StoreNameType.Quest) ? GetExistingDatabaseString(type, entry) : GetExistingDBCString(type, entry); if (!String.IsNullOrEmpty(name)) { if (withEntry) { return(entry + " (" + name + ")"); } return(name); } if (!withEntry) { return("-Unknown-"); } return(entry.ToString()); }
public int ReadEntryWithName <T>(StoreNameType type, string name, params int[] values) { var val = (int)ReadValue(Type.GetTypeCode(typeof(T))); Writer.WriteLine("{0}{1}: {2}{3}", GetIndexString(values), name, StoreGetters.GetName(type, val), (debug ? " (0x" + val.ToString("X4") + ")" : "")); return(val); }
private T ReadEntry <T>(StoreNameType type, string name, params object[] indexes) where T : struct { var val = ReadValue <T>(); int val32; if (val > Int32.MaxValue) { val32 = unchecked ((int)Convert.ToUInt32(val)); } else { val32 = Convert.ToInt32(val); } if (type == StoreNameType.Spell && Settings.ParseSpellInfos) { ReadSpellEntry((uint)val32, name, indexes); } else { AddValue(name, FormatInteger(val32, StoreGetters.GetName(type, val32, false)), indexes); } return((T)Convert.ChangeType(val, typeof(T))); }
public void AddSniffData(StoreNameType type, int id, string data) { if (type == StoreNameType.None) { return; } if (id == 0 && type != StoreNameType.Map) { return; // Only maps can have id 0 } if (type == StoreNameType.Opcode && !SniffDataOpcodes) { return; // Don't add opcodes if its config is not enabled } if (type != StoreNameType.Opcode && !SniffData) { return; } var item = new SniffData { FileName = FileName, TimeStamp = Utilities.GetUnixTimeFromDateTime(Time), ObjectType = type, Id = id, Data = data, Number = Number, }; Storage.SniffData.Add(item); }
private uint ReadEntry(StoreNameType type, string name, int bits, params object[] indexes) { var val = ReadBits(bits); AddValue(name, FormatInteger(val, StoreGetters.GetName(type, (int)val, false)), indexes); return(val); }
public void AddSniffData(StoreNameType type, int id, string data) { if (type == StoreNameType.None) { return; } if (id == 0 && type != StoreNameType.Map) { return; // Only maps can have id 0 } if (type == StoreNameType.Opcode && !SniffDataOpcodes) { return; // Don't add opcodes if its config is not enabled } if (type != StoreNameType.Opcode && !SniffData) { return; } var item = new SniffData { FileName = FileName, ObjectType = type, Id = id, Data = data, }; Storage.SniffData.Add(item, TimeSpan); }
public override string ToString() { if (Low == 0 && High == 0) { return("Full: 0x0"); } if (HasEntry()) { StoreNameType type = Utilities.ObjectTypeToStore(GetObjectType()); // ReSharper disable once UseStringInterpolation return(string.Format("Full: 0x{0}{1} {2}/{3} R{4}/S{5} Map: {6} Entry: {7} Low: {8}", High.ToString("X16"), Low.ToString("X16"), GetHighType(), GetSubType(), GetRealmId(), GetServerId(), StoreGetters.GetName(StoreNameType.Map, GetMapId()), StoreGetters.GetName(type, (int)GetEntry()), GetLow())); } // TODO: Implement extra format for battleground, see WowGuid64.ToString() string name = StoreGetters.GetName(this); // ReSharper disable once UseStringInterpolation return(string.Format("Full: 0x{0}{1} {2}/{3} R{4}/S{5} Map: {6} Low: {7}", High.ToString("X16"), Low.ToString("X16"), GetHighType(), GetSubType(), GetRealmId(), GetServerId(), StoreGetters.GetName(StoreNameType.Map, GetMapId()), GetLow() + (String.IsNullOrEmpty(name) ? String.Empty : (" Name: " + name)))); }
private T ReadEntry <T>(StoreNameType type, string name, params object[] indexes) where T : struct { var val = ReadValue <T>(); var val32 = Convert.ToInt32(val); AddValue(name, FormatInteger(val32, StoreGetters.GetName(type, val32, false)), indexes); return((T)Convert.ChangeType(val, typeof(T))); }
public T ReadEntry <T>(StoreNameType type, string name, params object[] indexes) where T : struct { var val = ReadStruct <T>(); var val32 = Convert.ToInt32(val); AddValue(name, StoreGetters.GetName(type, val32) + (Settings.DebugReads ? " (0x" + val32.ToString("X4") + ")" : String.Empty), indexes); return(val); }
public static bool CheckFilter(StoreNameType type, int entry) { var result = true; List<int> filters; if (NameStores.TryGetValue(type, out filters)) result = !filters.Contains(entry); return result; }
public int ReadEntryWithName <T>(StoreNameType type, string name, params int[] values) { var val = (int)ReadValue(Type.GetTypeCode(typeof(T))); WriteLine("{0}{1}: {2}{3}", GetIndexString(values), name, StoreGetters.GetName(type, val), (Settings.DebugReads ? " (0x" + val.ToString("X4") + ")" : String.Empty)); if (WriteToFile) { WriteToFile = Filters.CheckFilter(type, val); } return(val); }
public static string GetExistingDBCString(StoreNameType type, int entry) { if (entry <= 0 || !DBC.DBCStore.DBC.Enabled) { return(string.Empty); } switch (type) { case StoreNameType.Spell: { SpellEntry spell; if (DBC.DBCStore.DBC.Spell.TryGetValue((uint)entry, out spell)) { return(spell.GetSpellName()); } break; } case StoreNameType.Map: { MapEntry map; if (DBC.DBCStore.DBC.Map.TryGetValue((uint)entry, out map)) { return(map.GetMapName()); } break; } case StoreNameType.LFGDungeon: { LFGDungeonsEntry dungeon; if (DBC.DBCStore.DBC.LFGDungeons.TryGetValue((uint)entry, out dungeon)) { return(dungeon.GetName()); } break; } case StoreNameType.Battleground: { BattlemasterListEntry data; if (DBC.DBCStore.DBC.BattlemasterList.TryGetValue((uint)entry, out data)) { return(data.GetName()); } break; } default: return(string.Empty); } return("-Unknown-"); }
public static bool CheckFilter(StoreNameType type, int entry) { var result = true; List <int> filters; if (NameStores.TryGetValue(type, out filters)) { result = !filters.Contains(entry); } return(result); }
public static string GetExistingDatabaseString(StoreNameType type, int entry) { if (entry <= 0 || !SQLConnector.Enabled) { return(string.Empty); } string name = "-Unknown-"; switch (type) { case StoreNameType.Unit: { if (SQLDatabase.UnitNames.TryGetValue((uint)entry, out name)) { return(name); } break; } case StoreNameType.GameObject: { if (SQLDatabase.GameObjectNames.TryGetValue((uint)entry, out name)) { return(name); } break; } case StoreNameType.Item: { if (SQLDatabase.ItemNames.TryGetValue((uint)entry, out name)) { return(name); } break; } case StoreNameType.Quest: { if (SQLDatabase.QuestNames.TryGetValue((uint)entry, out name)) { return(name); } break; } default: return(string.Empty); } return(name); }
public static string GetExistingDBCString(StoreNameType type, int entry) { if (entry <= 0 || !DBC.DBCStore.DBC.Enabled) return string.Empty; switch (type) { case StoreNameType.Spell: { SpellEntry spell; if (DBC.DBCStore.DBC.Spell.TryGetValue((uint)entry, out spell)) return spell.GetSpellName(); break; } case StoreNameType.Map: { MapEntry map; if (DBC.DBCStore.DBC.Map.TryGetValue((uint)entry, out map)) return map.GetMapName(); break; } case StoreNameType.LFGDungeon: { LFGDungeonsEntry dungeon; if (DBC.DBCStore.DBC.LFGDungeons.TryGetValue((uint)entry, out dungeon)) return dungeon.GetName(); break; } case StoreNameType.Battleground: { BattlemasterListEntry data; if (DBC.DBCStore.DBC.BattlemasterList.TryGetValue((uint)entry, out data)) return data.GetName(); break; } default: return string.Empty; } return "-Unknown-"; }
public static string GetName(StoreNameType type, int entry, bool withEntry = true) { var entryStr = entry.ToString(CultureInfo.InvariantCulture); if (!SQLConnector.Enabled) { return(entryStr); } if (type != StoreNameType.Map && entry == 0) { return("0"); // map can be 0 } if (!SQLDatabase.NameStores.ContainsKey(type)) { return(entryStr); } string name; if (!SQLDatabase.NameStores[type].TryGetValue(entry, out name)) { if (!withEntry) { return("-Unknown-"); } } if (!String.IsNullOrEmpty(name)) { if (withEntry) { return(entry + " (" + name + ")"); } return(name); } return(entryStr); }
public static string GetExistingDatabaseString(StoreNameType type, int entry) { if (entry <= 0 || !SQLConnector.Enabled) return string.Empty; string name = "-Unknown-"; switch (type) { case StoreNameType.Unit: { if (SQLDatabase.UnitNames.TryGetValue((uint)entry, out name)) return name; break; } case StoreNameType.GameObject: { if (SQLDatabase.GameObjectNames.TryGetValue((uint)entry, out name)) return name; break; } case StoreNameType.Item: { if (SQLDatabase.ItemNames.TryGetValue((uint)entry, out name)) return name; break; } case StoreNameType.Quest: { if (SQLDatabase.QuestNames.TryGetValue((uint)entry, out name)) return name; break; } default: return string.Empty; } return name; }
public override string ToString() { if (Full == 0) { return("0x0"); } // If our guid has an entry and it is an unit or a GO, print its // name next to the entry (from a database, if enabled) if (HasEntry()) { StoreNameType type = StoreNameType.None; if (GetObjectType() == ObjectType.Unit) { type = StoreNameType.Unit; } if (GetObjectType() == ObjectType.GameObject) { type = StoreNameType.GameObject; } return("Full: 0x" + Full.ToString("X8") + " Type: " + GetHighType() + " Entry: " + StoreGetters.GetName(type, (int)GetEntry()) + " Low: " + GetLow()); } if (GetHighType() == HighGuidType.BattleGround) { var bgType = (Full & 0x00FF0000) >> 16; var UnkId = (Full & 0x0000FF00) >> 8; var arenaType = (Full & 0x000000FF) >> 0; return("Full: 0x" + Full.ToString("X8") + " Type: " + GetHighType() + " BgType: " + StoreGetters.GetName(StoreNameType.Battleground, (int)bgType) + " Unk: " + UnkId + (arenaType > 0 ? (" ArenaType: " + arenaType) : "")); } return("Full: 0x" + Full.ToString("X8") + " Type: " + GetHighType() + " Low: " + GetLow()); }
public static string GetName(StoreNameType type, int entry, bool withEntry = true) { var entryStr = entry.ToString(CultureInfo.InvariantCulture); string name = string.Empty; if (Settings.UseDBC) { switch (type) { case StoreNameType.Achievement: if (DBC.DBC.Achievement.ContainsKey(entry)) { name = DBC.DBC.Achievement[entry].Title; } break; case StoreNameType.Area: if (DBC.DBC.AreaTable.ContainsKey(entry)) { name = DBC.DBC.AreaTable[entry].AreaName; } break; case StoreNameType.Unit: if (DBC.DBC.Creature.ContainsKey(entry)) { name = DBC.DBC.Creature[entry].Name; } break; case StoreNameType.CreatureFamily: if (DBC.DBC.CreatureFamily.ContainsKey(entry)) { name = DBC.DBC.CreatureFamily[entry].Name; } break; case StoreNameType.Criteria: if (DBC.DBC.CriteriaStores.ContainsKey((ushort)entry)) { name = DBC.DBC.CriteriaStores[(ushort)entry]; } break; case StoreNameType.Difficulty: if (DBC.DBC.Difficulty.ContainsKey(entry)) { name = DBC.DBC.Difficulty[entry].Name; } break; case StoreNameType.Faction: if (DBC.DBC.FactionStores.ContainsKey((uint)entry)) { name = DBC.DBC.FactionStores[(uint)entry].Name; } break; case StoreNameType.Item: if (DBC.DBC.ItemSparse.ContainsKey(entry)) { name = DBC.DBC.ItemSparse[entry].Display; } break; case StoreNameType.Map: if (DBC.DBC.Map.ContainsKey(entry)) { name = DBC.DBC.Map[entry].MapName; } break; case StoreNameType.Spell: if (DBC.DBC.SpellName.ContainsKey(entry)) { name = DBC.DBC.SpellName[entry].Name; } break; case StoreNameType.Zone: if (DBC.DBC.Zones.ContainsKey((uint)entry)) { name = DBC.DBC.Zones[(uint)entry]; } break; } if (name != string.Empty) { if (withEntry) { return(entry + " (" + name + ")"); } return(name); } } if (!SQLConnector.Enabled) { return(entryStr); } if (type != StoreNameType.Map && entry == 0) { return("0"); // map can be 0 } if (!SQLDatabase.NameStores.ContainsKey(type)) { return(entryStr); } if (!SQLDatabase.NameStores[type].TryGetValue(entry, out name)) { if (!withEntry) { return("-Unknown-"); } } if (!String.IsNullOrEmpty(name)) { if (withEntry) { return(entry + " (" + name + ")"); } return(name); } return(entryStr); }
public void AddSniffData(StoreNameType type, int id, string data) { if (type == StoreNameType.None) return; if (id == 0 && type != StoreNameType.Map) return; // Only maps can have id 0 if (type == StoreNameType.Opcode && !SniffDataOpcodes) return; // Don't add opcodes if its config is not enabled if (type != StoreNameType.Opcode && !SniffData) return; var item = new SniffData { FileName = FileName, ObjectType = type, Id = id, Data = data, }; Storage.SniffData.Add(item, TimeSpan); }
/// <summary> /// <para>Compare two dictionaries (of the same types) and creates SQL inserts /// or updates accordingly.</para> /// <remarks>Second dictionary can be null (only inserts queries will be produced)</remarks> /// <remarks>Use DBTableName and DBFieldName attributes to specify table and field names, in TK</remarks> /// </summary> /// <typeparam name="T">Type of the first primary key</typeparam> /// /// <typeparam name="TG">Type of the second primary key</typeparam> /// <typeparam name="TK">Type of the WDB struct (field names and types must match DB field name and types)</typeparam> /// <typeparam name="TH"></typeparam> /// <param name="dict1">Dictionary retrieved from parser</param> /// <param name="dict2">Dictionary retrieved from DB</param> /// <param name="storeType1">(T) Are we dealing with Spells, Quests, Units, ...?</param> /// <param name="storeType2">(TG) Are we dealing with Spells, Quests, Units, ...?</param> /// <param name="storeType3">(TH) Are we dealing with Spells, Quests, Units, ...?</param> /// <param name="primaryKeyName1">The name of the first primary key</param> /// <param name="primaryKeyName2">The name of the second primary key</param> /// <param name="primaryKeyName3">The name of the third primary key</param> /// <returns>A string containing full SQL queries</returns> public static string CompareDicts <T, TG, TH, TK>(StoreDictionary <Tuple <T, TG, TH>, TK> dict1, StoreDictionary <Tuple <T, TG, TH>, TK> dict2, StoreNameType storeType1, StoreNameType storeType2, StoreNameType storeType3, string primaryKeyName1, string primaryKeyName2, string primaryKeyName3) { /*var tableAttrs = (DBTableNameAttribute[])typeof(TK).GetCustomAttributes(typeof(DBTableNameAttribute), false); * if (tableAttrs.Length <= 0) * return string.Empty; * var tableName = tableAttrs[0].Name; * * var fields = Utilities.GetFieldsAndAttributes<TK, DBFieldNameAttribute>(); * if (fields == null) * return string.Empty; * * fields.RemoveAll(field => field.Item2.Name == null); * * var rowsIns = new List<SQLInsertRow>(); * var rowsUpd = new List<SQLUpdateRow>(); * * foreach (var elem1 in Settings.SQLOrderByKey ? dict1.OrderBy(blub => blub.Key).ToList() : dict1.ToList()) * { * if (dict2 != null && dict2.ContainsKey(elem1.Key)) // update * { * var row = new SQLUpdateRow(); * * foreach (var field in fields) * { * var elem2 = dict2[elem1.Key]; * * var val1 = field.Item1.GetValue(elem1.Value.Item1); * var val2 = field.Item1.GetValue(elem2.Item1); * * var arr1 = val1 as Array; * if (arr1 != null) * { * var arr2 = (Array)val2; * * var isString = arr1.GetType().GetElementType() == typeof(string); * * for (var i = 0; i < field.Item2.Count; i++) * { * var value1 = i >= arr1.Length ? (isString ? (object)string.Empty : 0) : arr1.GetValue(i); * var value2 = i >= arr2.Length ? (isString ? (object)string.Empty : 0) : arr2.GetValue(i); * * if (!Utilities.EqualValues(value1, value2)) * row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), value1); * } * * continue; * } * * if (!Utilities.EqualValues(val1, val2)) * row.AddValue(field.Item2.Name, val1); * } * * var key1 = Convert.ToUInt32(elem1.Key.Item1); * var key2 = Convert.ToUInt32(elem1.Key.Item2); * var key3 = Convert.ToUInt32(elem1.Key.Item3); * * row.AddWhere(primaryKeyName1, key1); * row.AddWhere(primaryKeyName2, key2); * row.AddWhere(primaryKeyName3, key3); * * var key1Name = storeType1 != StoreNameType.None ? * StoreGetters.GetName(storeType1, (int)key1, false) : * elem1.Key.Item1.ToString(); * var key2Name = storeType2 != StoreNameType.None ? * StoreGetters.GetName(storeType2, (int)key2, false) : * elem1.Key.Item2.ToString(); * var key3Name = storeType3 != StoreNameType.None ? * StoreGetters.GetName(storeType3, (int)key3, false) : * elem1.Key.Item2.ToString(); * * row.Comment = key1Name + " - " + key2Name + " - " + key3Name; * row.Table = tableName; * * if (row.ValueCount == 0) * continue; * * var lastField = fields[fields.Count - 1]; * if (lastField.Item2.Name == "VerifiedBuild") * { * var buildvSniff = (int)lastField.Item1.GetValue(elem1.Value.Item1); * var buildvDB = (int)lastField.Item1.GetValue(dict2[elem1.Key].Item1); * * if (buildvDB > buildvSniff) // skip update if DB already has a VerifiedBuild higher than this one * continue; * } * * rowsUpd.Add(row); * } * else // insert new * { * var row = new SQLInsertRow(); * row.AddValue(primaryKeyName1, elem1.Key.Item1); * row.AddValue(primaryKeyName2, elem1.Key.Item2); * row.AddValue(primaryKeyName3, elem1.Key.Item3); * * var key1 = Convert.ToUInt32(elem1.Key.Item1); * var key2 = Convert.ToUInt32(elem1.Key.Item2); * var key3 = Convert.ToUInt32(elem1.Key.Item3); * * var key1Name = storeType1 != StoreNameType.None ? * StoreGetters.GetName(storeType1, (int)key1, false) : * elem1.Key.Item1.ToString(); * var key2Name = storeType2 != StoreNameType.None ? * StoreGetters.GetName(storeType2, (int)key2, false) : * elem1.Key.Item2.ToString(); * var key3Name = storeType3 != StoreNameType.None ? * StoreGetters.GetName(storeType3, (int)key3, false) : * elem1.Key.Item2.ToString(); * * row.Comment = key1Name + " - " + key2Name + " - " + key3Name; * * foreach (var field in fields) * { * if (field.Item1.FieldType.BaseType == typeof(Array)) * { * var arr = (Array)field.Item1.GetValue(elem1.Value.Item1); * if (arr == null) * continue; * * for (var i = 0; i < arr.Length; i++) * row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), arr.GetValue(i)); * * continue; * } * * var val = field.Item1.GetValue(elem1.Value.Item1); * if (val == null && field.Item1.FieldType == typeof(string)) * val = string.Empty; * * row.AddValue(field.Item2.Name, val); * } * rowsIns.Add(row); * } * } * * var result = new SQLInsert(tableName, rowsIns, deleteDuplicates: false, primaryKeyNumber: 3).Build() + * new SQLUpdate(rowsUpd).Build(); * * return result;*/ return(string.Empty); }
/// <param name="storeList"><see cref="DataBag{T}"/> with items form sniff.</param> /// <param name="dbList"><see cref="DataBag{T}"/> with items from database.</param> /// <param name="storeType">Are we dealing with Spells, Quests, Units, ...?</param> public static string Compare <T>(IEnumerable <Tuple <T, TimeSpan?> > storeList, RowList <T> dbList, StoreNameType storeType) where T : IDataModel, new() { var primaryKey = GetFirstPrimaryKey <T>(); return(Compare(storeList, dbList, t => StoreGetters.GetName(storeType, Convert.ToInt32(primaryKey.GetValue(t)), false))); }
/// <summary> /// <para>Compare two dictionaries (of the same types) and creates SQL inserts /// or updates accordingly.</para> /// <remarks>Second dictionary can be null (only inserts queries will be produced)</remarks> /// <remarks>Use DBTableName and DBFieldName attributes to specify table and field names, in TK</remarks> /// </summary> /// <typeparam name="T">Type of the primary key (uint)</typeparam> /// <typeparam name="TK">Type of the WDB struct (field types must match DB field)</typeparam> /// <param name="dict1">Dictionary retrieved from parser</param> /// <param name="dict2">Dictionary retrieved from DB</param> /// <param name="storeType">Are we dealing with Spells, Quests, Units, ...?</param> /// <param name="primaryKeyName">The name of the primary key, usually "entry"</param> /// <returns>A string containing full SQL queries</returns> public static string CompareDicts <T, TK>(StoreDictionary <T, TK> dict1, StoreDictionary <T, TK> dict2, StoreNameType storeType, string primaryKeyName = "entry") { var tableAttrs = (DBTableNameAttribute[])typeof(TK).GetCustomAttributes(typeof(DBTableNameAttribute), false); if (tableAttrs.Length <= 0) { return(string.Empty); } var tableName = tableAttrs[0].Name; var fields = Utilities.GetFieldsAndAttribute <TK, DBFieldNameAttribute>(); if (fields == null) { return(string.Empty); } fields.RemoveAll(field => field.Item2.Name == null); var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var elem1 in Settings.SQLOrderByKey ? dict1.OrderBy(blub => blub.Key).ToList() : dict1.ToList()) { if (dict2 != null && dict2.ContainsKey(elem1.Key)) // update { var row = new QueryBuilder.SQLUpdateRow(); foreach (var field in fields) { var elem2 = dict2[elem1.Key]; var val1 = field.Item1.GetValue(elem1.Value.Item1); var val2 = field.Item1.GetValue(elem2.Item1); var arr1 = val1 as Array; if (arr1 != null) { var arr2 = (Array)val2; var isString = arr1.GetType().GetElementType() == typeof(string); for (var i = 0; i < field.Item2.Count; i++) { var value1 = i >= arr1.Length ? (isString ? (object)string.Empty : 0) : arr1.GetValue(i); var value2 = i >= arr2.Length ? (isString ? (object)string.Empty : 0) : arr2.GetValue(i); if (!Utilities.EqualValues(value1, value2)) { row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), value1); } } continue; } if ((val2 is Array) && val1 == null) { continue; } if (!Utilities.EqualValues(val1, val2)) { row.AddValue(field.Item2.Name, val1); } } var key = Convert.ToUInt32(elem1.Key); row.AddWhere(primaryKeyName, key); row.Comment = StoreGetters.GetName(storeType, (int)key, false); row.Table = tableName; if (row.ValueCount == 0) { continue; } var lastField = fields[fields.Count - 1]; if (lastField.Item2.Name == "VerifiedBuild") { var buildvSniff = (int)lastField.Item1.GetValue(elem1.Value.Item1); var buildvDB = (int)lastField.Item1.GetValue(dict2[elem1.Key].Item1); if (buildvDB > buildvSniff) // skip update if DB already has a VerifiedBuild higher than this one { continue; } } rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue(primaryKeyName, elem1.Key); row.Comment = StoreGetters.GetName(storeType, Convert.ToInt32(elem1.Key), false); foreach (var field in fields) { if (field.Item1.FieldType.BaseType == typeof(Array)) { var arr = (Array)field.Item1.GetValue(elem1.Value.Item1); if (arr == null) { continue; } for (var i = 0; i < arr.Length; i++) { row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), arr.GetValue(i)); } continue; } var val = field.Item1.GetValue(elem1.Value.Item1); if (val == null && field.Item1.FieldType == typeof(string)) { val = string.Empty; } row.AddValue(field.Item2.Name, val); } rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return(result); }
public static string GetName(StoreNameType type, int entry, bool withEntry = true) { if (type != StoreNameType.Map && entry <= 0) return "0"; // map can be 0 var name = (type == StoreNameType.Unit || type == StoreNameType.GameObject || type == StoreNameType.Item || type == StoreNameType.Quest) ? GetExistingDatabaseString(type, entry) : GetExistingDBCString(type, entry); if (!String.IsNullOrEmpty(name)) { if (withEntry) return entry + " (" + name + ")"; return name; } if (!withEntry) return "-Unknown-"; return entry.ToString(); }
/// <summary> /// <para>Compare two dictionaries (of the same types) and creates SQL inserts /// or updates accordingly.</para> /// <remarks>Second dictionary can be null (only inserts queries will be produced)</remarks> /// </summary> /// <typeparam name="T">Type of the primary key (uint)</typeparam> /// <typeparam name="TK">Type of the WDB struct (field names and types must match DB field name and types)</typeparam> /// <param name="dict1">Dictionary retrieved from parser</param> /// <param name="dict2">Dictionary retrieved from DB</param> /// <param name="storeType">Are we dealing with Spells, Quests, Units, ...?</param> /// <param name="primaryKeyName">The name of the primary key, usually "entry"</param> /// <returns>A string containing full SQL queries</returns> public static string CompareDicts <T, TK>(StoreDictionary <T, TK> dict1, StoreDictionary <T, TK> dict2, StoreNameType storeType, string primaryKeyName = "entry") { var tableAttrs = (DBTableNameAttribute[])typeof(TK).GetCustomAttributes(typeof(DBTableNameAttribute), false); if (tableAttrs.Length <= 0) { return(string.Empty); } var tableName = tableAttrs[0].Name; var fields = Utilities.GetFieldsAndAttribute <TK, DBFieldNameAttribute>(); if (fields == null) { return(string.Empty); } var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var elem1 in dict1) { if (dict2 != null && dict2.ContainsKey(elem1.Key)) // update { var row = new QueryBuilder.SQLUpdateRow(); foreach (var field in fields) { var elem2 = dict2[elem1.Key]; var val1 = field.Item1.GetValue(elem1.Value.Item1); var val2 = field.Item1.GetValue(elem2.Item1); var arr1 = val1 as Array; if (arr1 != null) { var arr2 = (Array)val2; var isString = arr1.GetType().GetElementType() == typeof(string); for (var i = 0; i < field.Item2.Count; i++) { var value1 = i >= arr1.Length ? (isString ? (object)string.Empty : 0) : arr1.GetValue(i); var value2 = i >= arr2.Length ? (isString ? (object)string.Empty : 0) : arr2.GetValue(i); if (!Utilities.EqualValues(value1, value2)) { row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), value1); } } continue; } if (!Utilities.EqualValues(val1, val2)) { row.AddValue(field.Item2.Name, val1); } } var key = Convert.ToUInt32(elem1.Key); row.AddWhere(primaryKeyName, key); row.Comment = StoreGetters.GetName(storeType, (int)key, false); row.Table = tableName; if (row.ValueCount != 0) { rowsUpd.Add(row); } } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue(primaryKeyName, elem1.Key); row.Comment = StoreGetters.GetName(storeType, Convert.ToInt32(elem1.Key), false); foreach (var field in fields) { if (field.Item1.FieldType.BaseType == typeof(Array)) { var arr = (Array)field.Item1.GetValue(elem1.Value.Item1); for (var i = 0; i < arr.Length; i++) { row.AddValue(field.Item2.Name + (field.Item2.StartAtZero ? i : i + 1), arr.GetValue(i)); } continue; } row.AddValue(field.Item2.Name, field.Item1.GetValue(elem1.Value.Item1)); } rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return(result); }
public void AddSniffData(StoreNameType type, int id, string data) { if (type == StoreNameType.None) return; if (id == 0 && type != StoreNameType.Map) return; // Only maps can have id 0 if (type == StoreNameType.Opcode && !SniffDataOpcodes) return; // Don't add opcodes if its config is not enabled if (type != StoreNameType.Opcode && !SniffData) return; var item = new SniffData { FileName = FileName, TimeStamp = Utilities.GetUnixTimeFromDateTime(Time), ObjectType = type, Id = id, Data = data, Number = Number, }; Storage.SniffData.Add(item); }
public static string Loot() { if (Stuffing.Loots.IsEmpty) { return(string.Empty); } var sqlQuery = new StringBuilder(String.Empty); // Not TDB structure const string tableName = "LootTemplate"; string[] primaryKey = { "Id", "Type" }; string[] tableStructure = { "Id", "Type", "ItemId", "Count" }; // Can't cast the collection directly ICollection <Tuple <uint, uint> > lootKeys = new Collection <Tuple <uint, uint> >(); foreach (var tuple in Stuffing.Loots.Keys) { lootKeys.Add(new Tuple <uint, uint>(tuple.Item1, (uint)tuple.Item2)); } // Delete sqlQuery.Append(SQLUtil.DeleteQueryDouble(lootKeys, primaryKey, tableName)); // Insert sqlQuery.Append(SQLUtil.InsertQueryHeader(tableStructure, tableName)); // Insert rows foreach (var loot in Stuffing.Loots) { StoreNameType storeType = StoreNameType.None; switch (Stuffing.Loots.Keys.First().Item2) { case ObjectType.Item: storeType = StoreNameType.Item; break; case ObjectType.Corpse: case ObjectType.Unit: storeType = StoreNameType.Unit; break; case ObjectType.Container: case ObjectType.GameObject: storeType = StoreNameType.GameObject; break; } sqlQuery.Append("-- " + StoreGetters.GetName(storeType, (int)loot.Key.Item1) + "(" + loot.Value.Gold + " gold)" + Environment.NewLine); foreach (var lootItem in loot.Value.LootItems) { sqlQuery.Append( "(" + loot.Key.Item1 + cs + (int)loot.Key.Item2 + cs + lootItem.ItemId + cs + lootItem.Count + ")," + " -- " + StoreGetters.GetName(StoreNameType.Item, (int)lootItem.ItemId, false) + Environment.NewLine); } } return(sqlQuery.ReplaceLast(',', ';').ToString()); }
/// <param name="storeList"><see cref="DataBag{T}"/> with items form sniff.</param> /// <param name="dbList"><see cref="DataBag{T}"/> with items from database.</param> /// <param name="storeType">Are we dealing with Spells, Quests, Units, ...?</param> public static string Compare <T>(DataBag <T> storeList, RowList <T> dbList, StoreNameType storeType) where T : IDataModel, new() { return(Compare(storeList, dbList, t => StoreGetters.GetName(storeType, Convert.ToInt32(GetFirstPrimaryKey <T>().GetValue(t)), false))); }