コード例 #1
0
ファイル: Table.cs プロジェクト: tohosnet/schemazen
        public TableDiff Compare(Table t)
        {
            var diff = new TableDiff {
                Owner = t.Owner,
                Name  = t.Name
            };

            //get additions and compare mutual columns
            foreach (var c in Columns.Items)
            {
                var c2 = t.Columns.Find(c.Name);
                if (c2 == null)
                {
                    diff.ColumnsAdded.Add(c);
                }
                else
                {
                    //compare mutual columns
                    var cDiff = c.Compare(c2);
                    if (cDiff.IsDiff)
                    {
                        diff.ColumnsDiff.Add(cDiff);
                    }
                }
            }

            //get deletions
            foreach (var c in t.Columns.Items.Where(c => Columns.Find(c.Name) == null))
            {
                diff.ColumnsDropped.Add(c);
            }

            if (!t.IsType)
            {
                //get added and compare mutual constraints
                foreach (var c in Constraints)
                {
                    var c2 = t.FindConstraint(c.Name);
                    if (c2 == null)
                    {
                        diff.ConstraintsAdded.Add(c);
                    }
                    else
                    {
                        if (c.ScriptCreate() != c2.ScriptCreate())
                        {
                            diff.ConstraintsChanged.Add(c);
                        }
                    }
                }
                //get deleted constraints
                foreach (var c in t.Constraints.Where(c => FindConstraint(c.Name) == null))
                {
                    diff.ConstraintsDeleted.Add(c);
                }
            }
            else
            {
                // compare constraints on table types, which can't be named in the script, but have names in the DB
                var dest = Constraints.ToList();
                var src  = t.Constraints.ToList();

                var j = from c1 in dest
                        join c2 in src on c1.ScriptCreate() equals c2.ScriptCreate() into match                         //new { c1.Type, c1.Unique, c1.Clustered, Columns = string.Join(",", c1.Columns.ToArray()), IncludedColumns = string.Join(",", c1.IncludedColumns.ToArray()) } equals new { c2.Type, c2.Unique, c2.Clustered, Columns = string.Join(",", c2.Columns.ToArray()), IncludedColumns = string.Join(",", c2.IncludedColumns.ToArray()) } into match
                        from m in match.DefaultIfEmpty()
                        select new { c1, m };

                foreach (var c in j)
                {
                    if (c.m == null)
                    {
                        diff.ConstraintsAdded.Add(c.c1);
                    }
                    else
                    {
                        src.Remove(c.m);
                    }
                }
                foreach (var c in src)
                {
                    diff.ConstraintsDeleted.Add(c);
                }
            }

            return(diff);
        }
コード例 #2
0
ファイル: Table.cs プロジェクト: Zocdoc/schemazen
		public TableDiff Compare(Table t) {
			var diff = new TableDiff();
			diff.Owner = t.Owner;
			diff.Name = t.Name;

			//get additions and compare mutual columns
			foreach (var c in Columns.Items) {
				var c2 = t.Columns.Find(c.Name);
				if (c2 == null) {
					diff.ColumnsAdded.Add(c);
				} else {
					//compare mutual columns
					var cDiff = c.Compare(c2);
					if (cDiff.IsDiff) {
						diff.ColumnsDiff.Add(cDiff);
					}
				}
			}

			//get deletions
			foreach (var c in t.Columns.Items.Where(c => Columns.Find(c.Name) == null)) {
				diff.ColumnsDropped.Add(c);
			}

			if (!t.IsType) {
				//get added and compare mutual constraints
				foreach (var c in Constraints) {
					var c2 = t.FindConstraint(c.Name);
					if (c2 == null) {
						diff.ConstraintsAdded.Add(c);
					} else {
						if (c.ScriptCreate() != c2.ScriptCreate()) {
							diff.ConstraintsChanged.Add(c);
						}
					}
				}
				//get deleted constraints
				foreach (var c in t.Constraints.Where(c => FindConstraint(c.Name) == null)){
					diff.ConstraintsDeleted.Add(c);
				}
			} else {
				// compare constraints on table types, which can't be named in the script, but have names in the DB
				var dest = Constraints.ToList();
				var src = t.Constraints.ToList();

				var j = from c1 in dest
						join c2 in src on c1.ScriptCreate() equals c2.ScriptCreate() into match //new { c1.Type, c1.Unique, c1.Clustered, Columns = string.Join(",", c1.Columns.ToArray()), IncludedColumns = string.Join(",", c1.IncludedColumns.ToArray()) } equals new { c2.Type, c2.Unique, c2.Clustered, Columns = string.Join(",", c2.Columns.ToArray()), IncludedColumns = string.Join(",", c2.IncludedColumns.ToArray()) } into match
						from m in match.DefaultIfEmpty()
						select new { c1, m };

				foreach (var c in j) {
					if (c.m == null) {
						diff.ConstraintsAdded.Add(c.c1);
					} else {
						src.Remove(c.m);
					}
				}
				foreach (var c in src) {
					diff.ConstraintsDeleted.Add(c);
				}
			}

			return diff;
		}