static void Add(ElementCode context, string tableName, IUniqueDef unique) { if (unique == null) { return; } context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists); context.Concat(tableName); context.Add(SqlKeyword.AddConstraint); context.Concat(unique.Name); context.Add(SqlKeyword.Unique); context.AddColumnDefs(unique.Columns); context.Go(); }
static void Add(ElementCode context, string tableName, IPrimaryKeyDef primaryKey) { if (primaryKey == null) { return; } context.Add(SqlKeyword.AlterTable, SqlKeyword.IfExists); context.Concat(tableName); context.Add(SqlKeyword.AddConstraint); context.Concat(primaryKey.Name); context.Add(SqlKeyword.PrimaryKey); context.AddColumnDefs(primaryKey.Columns); context.Go(); }
/// <summary> /// SQL文を生成する /// </summary> /// <param name="context">生成先のコンテキスト</param> public void ToElementCode(ElementCode context) { var environment = this.Table.Environment; context.Add(SqlKeyword.InsertInto); context.Concat(this.Table.Name); context.AddColumnDefs(this.ColumnMap); var valueNode = this.ValueNode; if (valueNode != null) { valueNode.ToElementCode(context); return; } throw new ApplicationException(); }
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(); }
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); } } }