Example #1
0
        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);
        }
Example #2
0
        public void ReplaceAll(System.Collections.Generic.IList <Person> data)
        {
            var newData = CloneAndSortBy(data, x => x.PersonId, System.Collections.Generic.Comparer <int> .Default);
            var table   = new PersonTable(newData);

            memory = new MemoryDatabase(
                memory.MonsterTable,
                table

                );
        }
Example #3
0
        public void Diff(Person[] addOrReplaceData)
        {
            var data    = DiffCore(memory.PersonTable.GetRawDataUnsafe(), addOrReplaceData, x => x.PersonId, System.Collections.Generic.Comparer <int> .Default);
            var newData = CloneAndSortBy(data, x => x.PersonId, System.Collections.Generic.Comparer <int> .Default);
            var table   = new PersonTable(newData);

            memory = new MemoryDatabase(
                memory.MonsterTable,
                table

                );
        }
Example #4
0
        public void RemovePerson(int[] keys)
        {
            var data    = RemoveCore(memory.PersonTable.GetRawDataUnsafe(), keys, x => x.PersonId, System.Collections.Generic.Comparer <int> .Default);
            var newData = CloneAndSortBy(data, x => x.PersonId, System.Collections.Generic.Comparer <int> .Default);
            var table   = new PersonTable(newData);

            memory = new MemoryDatabase(
                memory.MonsterTable,
                table

                );
        }
Example #5
0
        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);
        }
        public void ReplaceAll(System.Collections.Generic.IList <Quest> data)
        {
            var newData = CloneAndSortBy(data, x => x.Id, System.Collections.Generic.Comparer <int> .Default);
            var table   = new QuestTable(newData);

            memory = new MemoryDatabase(
                table,
                memory.ItemTable,
                memory.MonsterTable,
                memory.PersonTable,
                memory.Test1Table,
                memory.Test2Table

                );
        }
        public void Diff(EnumKeyTable[] addOrReplaceData)
        {
            var data    = DiffCore(memory.EnumKeyTableTable.GetRawDataUnsafe(), addOrReplaceData, x => x.Gender, System.Collections.Generic.Comparer <Gender> .Default);
            var newData = CloneAndSortBy(data, x => x.Gender, System.Collections.Generic.Comparer <Gender> .Default);
            var table   = new EnumKeyTableTable(newData);

            memory = new MemoryDatabase(
                table,
                memory.ItemTable,
                memory.MonsterTable,
                memory.PersonTable,
                memory.QuestTable,
                memory.Test1Table,
                memory.Test2Table

                );
        }
        public void RemoveEnumKeyTable(Gender[] keys)
        {
            var data    = RemoveCore(memory.EnumKeyTableTable.GetRawDataUnsafe(), keys, x => x.Gender, System.Collections.Generic.Comparer <Gender> .Default);
            var newData = CloneAndSortBy(data, x => x.Gender, System.Collections.Generic.Comparer <Gender> .Default);
            var table   = new EnumKeyTableTable(newData);

            memory = new MemoryDatabase(
                table,
                memory.ItemTable,
                memory.MonsterTable,
                memory.PersonTable,
                memory.QuestTable,
                memory.Test1Table,
                memory.Test2Table

                );
        }
Example #9
0
        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()
        }
Example #10
0
 public ImmutableBuilder(MemoryDatabase memory)
 {
     this.memory = memory;
 }