예제 #1
0
 static void Drop(ElementCode context, string tableName, IIndexDef index)
 {
     if (index == null)
     {
         return;
     }
     context.Add(SqlKeyword.DropIndex, SqlKeyword.IfExists);
     context.Concat(index.Name);
     context.Go();
 }
예제 #2
0
 public override void CreateDatabase(ICodeDbConnection connection, string databaseName, string owner)
 {
     using (var cmd = connection.CreateCommand()) {
         var context = new ElementCode();
         context.Add(SqlKeyword.CreateDatabase);
         context.Concat(Quote(databaseName));
         context.Add(SqlKeyword.Owner);
         context.Concat(Quote(owner));
         context.Go();
         context.Build().Execute(cmd);
     }
 }
예제 #3
0
 static void Drop(ElementCode context, string tableName, IColumnDef column)
 {
     if (column == null)
     {
         return;
     }
     context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists);
     context.Concat(tableName);
     context.Add(SqlKeyword.DropColumn, SqlKeyword.IfExists);
     context.Concat(column.Name);
     context.Go();
 }
예제 #4
0
 static void Drop(ElementCode context, string tableName, IUniqueDef unique)
 {
     if (unique == null)
     {
         return;
     }
     context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists);
     context.Concat(tableName);
     context.Add(SqlKeyword.DropConstraint, SqlKeyword.IfExists);
     context.Concat(unique.Name);
     context.Go();
 }
예제 #5
0
 static void Drop(ElementCode context, string tableName, IPrimaryKeyDef primaryKey)
 {
     if (primaryKey == null)
     {
         return;
     }
     context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists);
     context.Concat(tableName);
     context.Add(SqlKeyword.DropConstraint, SqlKeyword.IfExists);
     context.Concat(primaryKey.Name);
     context.Go();
 }
예제 #6
0
 public override void CreateRole(ICodeDbConnection connection, string roleName, string password)
 {
     using (var cmd = connection.CreateCommand()) {
         var context = new ElementCode();
         context.Add(SqlKeyword.CreateRole);
         context.Concat(Quote(roleName));
         context.Add(SqlKeyword.Password);
         context.Concat(string.Concat("'", password, "'"));
         context.Concat("LOGIN");
         context.Go();
         context.Build().Execute(cmd);
     }
 }
예제 #7
0
 static void Add(ElementCode context, string tableName, IColumnDef column, Action <IColumnDef> columnOption)
 {
     if (column == null)
     {
         return;
     }
     context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists);
     context.Concat(tableName);
     context.Add(SqlKeyword.AddColumn);
     context.Concat(column.Name);
     if (columnOption != null)
     {
         columnOption(column);
     }
     context.Go();
 }
예제 #8
0
 static void Add(ElementCode context, string tableName, IIndexDef index)
 {
     if (index == null)
     {
         return;
     }
     context.Add(SqlKeyword.CreateIndex, SqlKeyword.IfNotExists);
     context.Concat(index.Name);
     context.Add(SqlKeyword.On);
     context.Concat(tableName);
     if ((index.Flags & IndexFlags.Gin) != 0)
     {
         context.Add(SqlKeyword.Using);
         context.Concat("gin");
     }
     context.AddColumnDefs(index.Columns);
     context.Go();
 }
예제 #9
0
파일: Program.cs 프로젝트: nQuantums/tips
        static void Main(string[] args)
        {
            var E = TestDb.E;

            using (var con = E.CreateConnection("User ID=postgres;Password=wertyu89?;Host=localhost;Port=5432;Database=postgres;")) {
                con.Open();

                try {
                    E.CreateRole(con, RoleName, "Passw0rd!");
                } catch (CodeDbEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateObject)
                    {
                        throw;
                    }
                }
                try {
                    E.CreateDatabase(con, DbName, RoleName);
                } catch (CodeDbEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateDatabase)
                    {
                        throw;
                    }
                }
            }

            using (var con = E.CreateConnection($"User ID={RoleName};Password='******';Host=localhost;Port=5432;Database={DbName};")) {
                con.Open();
                var cmd = con.CreateCommand();
                cmd.CommandTimeout = 0;

                {
                    var s = TestDb.E.NewSql();
                    s.DropTable(TestDb.User);
                    s.Build().Execute(cmd);
                }

                // データベースの状態を取得
                var current = E.ReadDatabaseDef(con);
                // クラスからデータベース定義を生成する
                var target = E.GenerateDatabaseDef(typeof(TestDb), "test_db");
                // 差分を生成
                var delta = E.GetDatabaseDelta(current, target);

                // 差分を適用する
                var context = new ElementCode();
                E.ApplyDatabaseDelta(context, delta);
                context.Build().Execute(cmd);

                {
                    var sql = TestDb.E.NewSql();
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "a" });
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "b" });
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "c" });
                    sql.BuildAction().Execute(cmd);
                }
                {
                    var sql    = TestDb.E.NewSql();
                    var select = sql.From(TestDb.User).Where(t => t.UserName == "a").Select(t => new { t.UserName, t.UserID, t.CreateDateTime });
                    var f      = sql.BuildSelectFunc(select);
                    using (var reader = f.Execute(cmd)) {
                        foreach (var record in reader.Records)
                        {
                            Console.WriteLine($"{record.UserID} {record.UserName} {record.CreateDateTime}");
                        }
                    }
                }

                {
                    var code = new ElementCode();
                    var arg1 = new Argument(0);
                    var arg2 = new Argument(0);
                    code.Concat("SELECT ARRAY[1, 2, 3], '{8EA22A18-EB0A-49E5-B61D-F026CA7773FF}'::uuid, now(),");
                    code.Add(arg1);
                    code.Go();
                    code.Concat("SELECT ARRAY[1, 2, 3], '{8EA22A18-EB0A-49E5-B61D-F026CA7773FF}'::uuid, now(),");
                    code.Add(arg2);
                    code.Go();
                    var s = TestDb.E.NewSql();
                    s.Code(code);
                    var commandable = s.BuildFunc <int, int, Tuple <int[], Guid, DateTime, int> >(arg1, arg2);
                    using (var reader = commandable.Execute(cmd, 16, 32)) {
                        do
                        {
                            foreach (var record in reader.Records)
                            {
                                Console.WriteLine(record);
                            }
                        } while (reader.DataReader.NextResult());
                    }
                }
            }
        }
예제 #10
0
        public override void ApplyDatabaseDelta(ElementCode context, IDatabaseDelta databaseDelta)
        {
            // 列の型など付与するデリゲート
            Action <IColumnDef> columnOption = (column) => {
                context.Concat(column.DbType.ToDbTypeString((column.Flags & ColumnFlags.Serial) != 0 ? DbTypeStringFlags.Serial : 0));
                if ((column.Flags & ColumnFlags.Nullable) != 0)
                {
                    context.Add(SqlKeyword.Null);
                }
                else
                {
                    context.Add(SqlKeyword.NotNull);
                }
                if ((column.Flags & ColumnFlags.DefaultCurrentTimestamp) != 0)
                {
                    context.Add(SqlKeyword.Default, SqlKeyword.CurrentTimestamp);
                }
            };

            // 捨てるべきテーブルを捨てる
            foreach (var table in databaseDelta.TablesToDrop)
            {
                context.Add(SqlKeyword.DropTable, SqlKeyword.IfExists);
                context.Concat(table.Name);
                context.Go();
            }

            // 新たに増えるテーブルを作成する
            foreach (var table in databaseDelta.TablesToAdd)
            {
                var tableName = table.Name;

                // テーブル本体
                context.Add(SqlKeyword.CreateTable, SqlKeyword.IfNotExists);
                context.Concat(tableName);
                context.AddColumnDefs(table.ColumnDefs, null, columnOption);
                context.Go();

                // プライマリキー
                Add(context, tableName, table.GetPrimaryKey());

                // インデックス
                foreach (var index in table.GetIndices())
                {
                    Add(context, tableName, index);
                }

                // ユニークキー
                foreach (var unique in table.GetUniques())
                {
                    Add(context, tableName, unique);
                }
            }

            // 変化するテーブルに対応する
            foreach (var table in databaseDelta.TablesToModify)
            {
                var tableName = table.Name;

                // 先にプライマリキー等の制約を捨てる
                Drop(context, tableName, table.PrimaryKeyToDrop);
                foreach (var index in table.IndicesToDrop)
                {
                    Drop(context, tableName, index);
                }
                foreach (var unique in table.UniquesToDrop)
                {
                    Drop(context, tableName, unique);
                }

                // 列を捨てる
                foreach (var column in table.ColumnsToDrop)
                {
                    Drop(context, tableName, column);
                }

                // 列を追加する
                foreach (var column in table.ColumnsToAdd)
                {
                    Add(context, tableName, column, columnOption);
                }

                // プライマリキー追加
                Add(context, tableName, table.PrimaryKeyToAdd);

                // インデックス追加
                foreach (var index in table.IndicesToAdd)
                {
                    Add(context, tableName, index);
                }

                // ユニークキー追加
                foreach (var unique in table.UniquesToAdd)
                {
                    Add(context, tableName, unique);
                }
            }
        }