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(); }
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); } }
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(); }
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(); }
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(); }
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); } }
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(); }
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(); }
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()); } } } }
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); } } }