static void Main(string[] args) { if (args.Length > 0) { DebugOutput = args.Any(n => n.ToLower() == "/debug"); foreach (var arg in args) { if (arg.IndexOf("/p") != -1) definitionPath = arg.Substring(2); } } Console.Title = "WoW data file parser"; AppDomain.CurrentDomain.UnhandledException += (o, ex) => { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("╔═══════════════════════════════════════════════════════════════════════╗"); Console.WriteLine("║ ERROR: {0,-63}║", (ex.ExceptionObject as Exception).Message); Console.WriteLine("╚═══════════════════════════════════════════════════════════════════════╝"); Console.ForegroundColor = ConsoleColor.Cyan; }; if (!File.Exists(definitionPath)) throw new FileNotFoundException("File not found", definitionPath); Console.ForegroundColor = ConsoleColor.Red; using (var stream = File.OpenRead(definitionPath)) { var serialiser = new XmlSerializer(typeof(Definition)); serialiser.UnknownAttribute += (o, e) => { Console.WriteLine($"Unknown attribute: '{e.Attr.Name}' at line: {e.LineNumber} position: {e.LinePosition}"); }; serialiser.UnknownElement += (o, e) => { Console.WriteLine($"Unknown Element: '{e.Element.Name}' at line: {e.LineNumber} position: {e.LinePosition}"); }; definition = (Definition)serialiser.Deserialize(stream); } if (definition.Build > 0) outputPath = string.Format($"output_{definition.Build}.sql"); File.Delete(outputPath); var version = Assembly.GetExecutingAssembly().GetName().Version; Console.ForegroundColor = ConsoleColor.Magenta; Console.WriteLine("╔═══════════════════════════════════════════════════════════════════════╗"); Console.WriteLine("║ Parser wow cached data files v{0}.{1} for build {2,-6} ║", version.Major, version.Minor, definition.Build); Console.WriteLine("╚═══════════════════════════════════════════════════════════════════════╝"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("╔═══════════════════════════════╦═════════╦═════════╦═════════╦═════════╗"); Console.WriteLine("║ Name ║ Locale ║ Build ║ Count ║ Status ║"); Console.WriteLine("╠═══════════════════════════════╬═════════╬═════════╬═════════╬═════════╣"); Program.Parse(); Console.WriteLine("╚═══════════════════════════════╩═════════╩═════════╩═════════╩═════════╝"); Console.ReadKey(); }
public static void CreateStructure(StreamWriter writer, Definition definition) { var db_name = "wdb"; if (definition.Build > 0) db_name += "_" + definition.Build; writer.WriteLine("-- DB structure"); writer.WriteLine($"CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET utf8 COLLATE utf8_general_ci;"); writer.WriteLine($"USE `{db_name}`;"); writer.WriteLine(); // create main tables foreach (var file in definition.Files) { if (string.IsNullOrWhiteSpace(file.Table)) throw new NullReferenceException("Table name missing or empty for " + file.Name); var keys = new List<string> { "locale" }; writer.WriteLine($"CREATE TABLE IF NOT EXISTS `{file.Table}` ("); writer.WriteLine(" `locale` CHAR(4) NOT NULL DEFAULT 'xxXX',"); foreach (var field in file.Fields.Where(n => n.Type != DataType.TableList)) CreateFieldByType(writer, keys, field); var key_list = string.Join(", ", keys.Select(key => "`" + key + "`")); writer.WriteLine($" PRIMARY KEY ({key_list})"); writer.WriteLine(") ENGINE = MyISAM DEFAULT CHARSET = utf8;"); writer.WriteLine(); } // create sub tables foreach (var file in definition.Files) { if (string.IsNullOrWhiteSpace(file.Table)) throw new NullReferenceException("Table name missing or empty for " + file.Name); var keys = new List<string> { "locale", "m_entry", "m_index" }; foreach (var field in file.Fields.Where(n => n.Type == DataType.TableList)) { if (string.IsNullOrWhiteSpace(field.Name)) throw new NullReferenceException("TableList: field name is empty!"); writer.WriteLine($"CREATE TABLE IF NOT EXISTS `{field.Name.ToLower()}` ("); writer.WriteLine(" `locale` CHAR(4) NOT NULL DEFAULT 'xxXX',"); writer.WriteLine(" `m_entry` INT UNSIGNED NOT NULL DEFAULT '0',"); writer.WriteLine(" `m_index` INT UNSIGNED NOT NULL DEFAULT '0',"); foreach (var subField in field.Fields) { CreateFieldByType(writer, keys, subField); } var key_list = string.Join(", ", keys.Select(key => "`" + key + "`")); writer.WriteLine($" PRIMARY KEY ({key_list})"); writer.WriteLine(") ENGINE = MyISAM DEFAULT CHARSET = utf8;"); writer.WriteLine(); } } }