예제 #1
0
        public override IDatabaseDelta GetDatabaseDelta(IDatabaseDef currentDatabaseDef, IDatabaseDef targetDatabaseDef)
        {
            // テーブル毎の比較
            var tablesa        = currentDatabaseDef.Tables;
            var tablest        = targetDatabaseDef.Tables;
            var tablesToDrop   = new List <ITableDef>(from ta in tablesa where !(from tt in tablest where tt.Name == ta.Name select tt).Any() select ta);
            var tablesToAdd    = new List <ITableDef>();
            var tablesToModify = new List <ITableDelta>();

            foreach (var tt in tablest)
            {
                var tableName = tt.Name;
                var ta        = (from t in tablesa where t.Name == tableName select t).FirstOrDefault();
                if (ta == null)
                {
                    tablesToAdd.Add(tt);
                }
                else
                {
                    var tableDelta = new PgTableDelta();
                    tableDelta.Name = tableName;

                    // 列毎の比較
                    var columnsa      = ta.ColumnDefs;
                    var columnst      = tt.ColumnDefs;
                    var columnsToDrop = new List <IColumnDef>(from ca in columnsa where !(from ct in columnst where ct.Name == ca.Name select ct).Any() select ca);
                    var columnsToAdd  = new List <IColumnDef>();
                    foreach (var ct in columnst)
                    {
                        var columnName = ct.Name;
                        var ca         = (from c in columnsa where c.Name == columnName select c).FirstOrDefault();
                        if (ca == null)
                        {
                            columnsToAdd.Add(ct);
                        }
                    }
                    tableDelta.ColumnsToDrop = columnsToDrop;
                    tableDelta.ColumnsToAdd  = columnsToAdd;

                    // プライマリキーの比較
                    var pka = ta.GetPrimaryKey();
                    var pkt = tt.GetPrimaryKey();
                    if (pka != null && pkt == null)
                    {
                        tableDelta.PrimaryKeyToDrop = pka;
                    }
                    else if (pka == null && pkt != null)
                    {
                        tableDelta.PrimaryKeyToAdd = pkt;
                    }
                    else
                    {
                        if (pka.Name != pkt.Name || !EqualColumnDefs(pka.Columns, pkt.Columns))
                        {
                            tableDelta.PrimaryKeyToDrop = pka;
                            tableDelta.PrimaryKeyToAdd  = pkt;
                        }
                    }

                    // インデックス毎の比較
                    var indicesa      = ta.GetIndices();
                    var indicest      = tt.GetIndices();
                    var indicesToDrop = new List <IIndexDef>(from a in indicesa where !(from t in indicest where a.Name == t.Name select t).Any() select a);
                    var indicesToAdd  = new List <IIndexDef>();
                    foreach (var it in indicest)
                    {
                        var indexName = it.Name;
                        var ia        = (from i in indicesa where i.Name == indexName select i).FirstOrDefault();
                        if (ia == null)
                        {
                            indicesToAdd.Add(it);
                        }
                        else
                        {
                            if (ia.Name != it.Name || ia.Flags != it.Flags || !EqualColumnDefs(ia.Columns, it.Columns))
                            {
                                indicesToDrop.Add(ia);
                                indicesToAdd.Add(it);
                            }
                        }
                    }
                    tableDelta.IndicesToDrop = indicesToDrop;
                    tableDelta.IndicesToAdd  = indicesToAdd;

                    // ユニーク制約毎の比較
                    var uniquesa      = ta.GetUniques();
                    var uniquest      = tt.GetUniques();
                    var uniquesToDrop = new List <IUniqueDef>(from a in uniquesa where !(from t in uniquest where a.Name == t.Name select t).Any() select a);
                    var uniquesToAdd  = new List <IUniqueDef>();
                    foreach (var ut in uniquest)
                    {
                        var uniqueName = ut.Name;
                        var ua         = (from u in uniquesa where u.Name == uniqueName select u).FirstOrDefault();
                        if (ua == null)
                        {
                            uniquesToAdd.Add(ut);
                        }
                        else
                        {
                            if (ua.Name != ut.Name || !EqualColumnDefs(ua.Columns, ut.Columns))
                            {
                                uniquesToDrop.Add(ua);
                                uniquesToAdd.Add(ut);
                            }
                        }
                    }
                    tableDelta.UniquesToDrop = uniquesToDrop;
                    tableDelta.UniquesToAdd  = uniquesToAdd;


                    if (tableDelta.ColumnsToDrop.Any() || tableDelta.ColumnsToAdd.Any() ||
                        tableDelta.PrimaryKeyToDrop != null || tableDelta.PrimaryKeyToAdd != null ||
                        tableDelta.IndicesToDrop.Any() || tableDelta.IndicesToAdd.Any() ||
                        tableDelta.UniquesToDrop.Any() || tableDelta.UniquesToAdd.Any())
                    {
                        tablesToModify.Add(tableDelta);
                    }
                }
            }

            return(new PgDatabaseDelta {
                Name = targetDatabaseDef.Name, TablesToDrop = tablesToDrop, TablesToAdd = tablesToAdd, TablesToModify = tablesToModify
            });
        }
예제 #2
0
 /// <summary>
 /// データベース変化分情報の取得
 /// </summary>
 /// <param name="currentDatabaseDef">現在のデータベース定義、<see cref="ReadDatabaseDef"/>で取得可能</param>
 /// <param name="targetDatabaseDef">目標とするデータベース定義、<see cref="GenerateDatabaseDef"/>で取得可能</param>
 /// <returns>データベース変化分情報</returns>
 public abstract IDatabaseDelta GetDatabaseDelta(IDatabaseDef currentDatabaseDef, IDatabaseDef targetDatabaseDef);