static void Main(string[] args) { var bin = new DatabaseBuilder().Append(new Monster[] { new Monster(MonsterId: 1, Name: "Foo", MaxHp: 100) }).Build(); // new DatabaseBuilderBase( //new DatabaseBuilder( var db = new MemoryDatabase(File.ReadAllBytes("db.bin")); // .PersonTable.FindByPersonIdもコード生成により型が付いてる Person person = db.PersonTable.FindByPersonId(10); // 女性の23歳を取得。戻り値は複数。 RangeView <Person> result = db.PersonTable.FindByGenderAndAge((Gender.Female, 23)); // 31歳に最も近い人を取得 RangeView <Person> age1 = db.PersonTable.FindClosestByAge(31); // 20歳から29際の人を取得 RangeView <Person> age2 = db.PersonTable.FindRangeByAge(20, 29); }
static void Main(string[] args) { var csv = @"monster_id,name,max_hp 1,foo,100 2,bar,200"; var fileName = "monster"; var builder = new DatabaseBuilder(); var meta = MemoryDatabase.GetMetaDatabase(); var table = meta.GetTableInfo(fileName); var tableData = new List <object>(); using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(csv))) using (var sr = new StreamReader(ms, Encoding.UTF8)) using (var reader = new TinyCsvReader(sr)) { while ((reader.ReadValuesWithHeader() is Dictionary <string, string> values)) { // create data without call constructor var data = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(table.DataType); foreach (var prop in table.Properties) { if (values.TryGetValue(prop.NameSnakeCase, out var rawValue)) { var value = ParseValue(prop.PropertyInfo.PropertyType, rawValue); if (prop.PropertyInfo.SetMethod == null) { throw new Exception("Target property does not exists set method. If you use {get;}, please change to { get; private set; }, Type:" + prop.PropertyInfo.DeclaringType + " Prop:" + prop.PropertyInfo.Name); } prop.PropertyInfo.SetValue(data, value); } else { throw new KeyNotFoundException($"Not found \"{prop.NameSnakeCase}\" in \"{fileName}.csv\" header."); } } tableData.Add(data); } } // add dynamic collection. builder.AppendDynamic(table.DataType, tableData); var bin = builder.Build(); var database = new MemoryDatabase(bin, maxDegreeOfParallelism: Environment.ProcessorCount); }
static void Main(string[] args) { var bin = new DatabaseBuilder().Append(new Monster[] { new Monster(MonsterId: 1, Name: "Foo", MaxHp: 100) }).Append(new Person[] { new Person { PersonId = 0, Age = 13, Gender = Gender.Male, Name = "Dana Terry" }, new Person { PersonId = 1, Age = 17, Gender = Gender.Male, Name = "Kirk Obrien" }, new Person { PersonId = 2, Age = 31, Gender = Gender.Male, Name = "Wm Banks" }, new Person { PersonId = 3, Age = 44, Gender = Gender.Male, Name = "Karl Benson" }, new Person { PersonId = 4, Age = 23, Gender = Gender.Male, Name = "Jared Holland" }, new Person { PersonId = 5, Age = 27, Gender = Gender.Female, Name = "Jeanne Phelps" }, new Person { PersonId = 6, Age = 25, Gender = Gender.Female, Name = "Willie Rose" }, new Person { PersonId = 7, Age = 11, Gender = Gender.Female, Name = "Shari Gutierrez" }, new Person { PersonId = 8, Age = 63, Gender = Gender.Female, Name = "Lori Wilson" }, new Person { PersonId = 9, Age = 34, Gender = Gender.Female, Name = "Lena Ramsey" }, }) .Append(new Quest[] { new Quest { Id = 1, Name = "foo", Cost = 10, RewardId = 100 }, new Quest { Id = 2, Name = "bar", Cost = 20, RewardId = 101 }, new Quest { Id = 3, Name = "baz", Cost = 30, RewardId = 0 }, new Quest { Id = 3, Name = "too", Cost = 40, RewardId = 0 }, }) .Append(new Item[] { new Item { ItemId = 100 }, new Item { ItemId = 101 }, new Item { ItemId = 199 }, }) .Build(); var db = new MemoryDatabase(bin); // テーブル情報、プロパティ情報、インデックス情報が取れるので自由に加工する var metaDb = MemoryDatabase.GetMetaDatabase(); foreach (var table in metaDb.GetTableInfos()) { // CSVのヘッダ生成 var sb = new StringBuilder(); foreach (var prop in table.Properties) { if (sb.Length != 0) { sb.Append(","); } // そのまま, LowerCamelCase, SnakeCaseに変換した名前が取得可能 sb.Append(prop.NameSnakeCase); } Console.WriteLine(sb.ToString()); File.WriteAllText(table.TableName + ".csv", sb.ToString(), new UTF8Encoding(false)); } // 検証結果取得。データベースの構築自体は検証とは無関係に構築ができるので、 // (開発時用などに)不整合のまま出してもいいし、(リリース時では)弾くなどご自由に。 var validateResult = db.Validate(); if (validateResult.IsValidationFailed) { // 検証失敗データを文字列形式でフォーマットして出力 Console.WriteLine(validateResult.FormatFailedResults()); // List<(Type, string)> で検証データを取得して、自分でカスタムで出力することも可能 // MDやHTMLに整形してSlackやレポーターに投げるなど自由に // validateResult.FailedResults } // new MetaMemoryDatabase() }