Пример #1
0
        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();
        }
Пример #2
0
        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();
                }
            }
        }