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