Example #1
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);
                }
            }
        }
Example #2
0
 /// <summary>
 /// データベースに変化分を適用する
 /// </summary>
 /// <param name="context">コマンド生成先のバッファ</param>
 /// <param name="databaseDelta">データベース変化分</param>
 public abstract void ApplyDatabaseDelta(ElementCode context, IDatabaseDelta databaseDelta);