public void ReturnsRowsThatDifferInMultipleColumns() { var table1 = new MemoryTable(new[] { new[] { "A", "B" }, new[] { "1", "0" }, new[] { "1", "2" }, new[] { "1", "4" }, new[] { "1", "6" }, new[] { "1", "8" }, }); var table2 = new MemoryTable(new[] { new[] { "A", "B" }, new[] { "1", "2" }, new[] { "2", "0" }, new[] { "1", "0" }, }); var sut = new TableComparer(new[] { "A", "B" }); var result = sut.Compare(table1, table2); Assert.AreEqual(3, result.RowCount); CollectionAssert.AreEqual(new[] { "1", "4" }, result.Data[0]); CollectionAssert.AreEqual(new[] { "1", "6" }, result.Data[1]); CollectionAssert.AreEqual(new[] { "1", "8" }, result.Data[2]); }
private static void Main(string[] args) { if (args.Length < 3) { Console.WriteLine("Syntax: CompareExcelFiles file1 file2 column [column...]"); Console.WriteLine(" file1 first file to compare"); Console.WriteLine(" file2 second file to compare"); Console.WriteLine(" column name of column(s) to sort / compare by"); return; } var excel = new ExcelLoader(); var table1 = excel.Load(args[0]); var table2 = excel.Load(args[1]); var columns = args.Skip(2).ToArray(); var comparer = new TableComparer(columns); var diff1 = comparer.Compare(table1, table2); var diff2 = comparer.Compare(table2, table1); DumpResult(1, args[0], diff1, table1.RowCount, columns); DumpResult(2, args[1], diff2, table2.RowCount, columns); }
public void ReturnsAllRowsWhenTheOtherTableIsEmpty() { var table1 = new MemoryTable(new[] { new[] { "A", "B" }, new[] { "1", "2" }, new[] { "3", "4" } }); var table2 = new MemoryTable(new[] { new[] { "A", "B" } }); var sut = new TableComparer(new[] { "A" }); var result = sut.Compare(table1, table2); Assert.AreEqual(2, result.RowCount); }
private static bool Compare(Database current, Database database1) { database1.Tables = database1.Tables.OrderBy(o => o.Name).ToList(); current.Tables = current.Tables.OrderBy(o => o.Name).ToList(); var json1 = JsonConvert.SerializeObject(database1); var json2 = JsonConvert.SerializeObject(current); var hasSchemaChanged = TableComparer.HasSchemaChanged(json1, json2); return(hasSchemaChanged); }
private TableCell CreateCell(Key key, Column column, Dictionary <Key, Dictionary <string, object> > aList, Dictionary <Key, Dictionary <string, object> > bList, CompareResult compareResult) { var td = new TableCell { CssClass = "_" + column.Name + " " + compareResult }; switch (compareResult) { case CompareResult.NotFoundInA: td.Controls.AddLiteral(GetValueString(bList[key][column.Name], column.DataType)); break; case CompareResult.NotFoundInB: td.Controls.AddLiteral(GetValueString(aList[key][column.Name], column.DataType)); break; case CompareResult.NotEqual: var aValue = aList[key][column.Name]; var bValue = bList[key][column.Name]; if (!TableComparer.ObjectsEqual(aValue, bValue)) { var p1 = new HtmlGenericControl("p"); p1.Attributes["class"] = "OldValue"; p1.Controls.AddLiteral(GetValueString(bValue, column.DataType)); td.Controls.Add(p1); var p2 = new HtmlGenericControl("p"); p2.Attributes["class"] = "NewValue"; p2.Controls.AddLiteral(GetValueString(aValue, column.DataType)); td.Controls.Add(p2); } else { td.Controls.AddLiteral(GetValueString(aValue, column.DataType)); } break; default: break; } return(td); }
private static void FillUpdate(RowComparisonResult change, DetailedTableComparisonResult result, Script script) { var rowA = result.TableA[change.Key]; var rowB = result.TableB[change.Key]; script.AddScript(string.Format("UPDATE [{0}].[{1}] SET\r\n", result.SchemaName, result.TableName)); var comma = ""; foreach (var column in result.Columns.Except(result.PrimaryKey.Columns)) { var columnName = column.Name; var aValue = rowA[columnName]; var bValue = rowB[columnName]; if (!TableComparer.ObjectsEqual(aValue, bValue)) { script.AddToken(comma); script.AddScript(string.Format("[{0}] = {1}", columnName, DataAccess.GetDatabaseValue(aValue, column.DataType))); comma = ",\r\n"; } } script.AddToken("\r\n WHERE"); script.AddScript(GetPrimaryKeyCondition(change, result)); }
public void Execute(Instance ins, IStopStatus status) { this.status = status; foreach (Common.Task t in ins.Tasks) { if (status.Stopped) { break; } if (t is MigrationTask task && task.Tables.Length > 0) { task.StartTick = WinAPI.GetTickCount(); task.Status = DataStates.Running; // 构建待迁移表清单:lst[0] = 独立表,lst[1+] = 依赖树 List <List <MigrationTable> > lst = new List <List <MigrationTable> > { new List <MigrationTable>(task.Tables[0]), new List <MigrationTable>() }; for (int i = 1; i < task.Tables.Length; i++) { for (int j = 0; j < task.Tables[i].Length; j++) { MigrationTable ta = task.Tables[i][j]; for (int k = 0; k < ta.References.Length; k++) { for (int l = 0; l < lst[0].Count; l++) { if (ta.References[k].Equals(lst[0][l].DestName)) { lst[1].Add(lst[0][l]); lst[0].RemoveAt(l); break; } } } } lst.Add(new List <MigrationTable>(task.Tables[i])); } TableComparer comparer = new TableComparer(); foreach (List <MigrationTable> tables in lst) { tables.Sort(comparer); } List <MigrationTable> runList = new List <MigrationTable>(); // 开始迁移 try { Parallel.ForEach(CreateThreadAction((int)task.Threads), i => { MigrationTable table = GetTable(lst, runList); while (table != null) { Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.DestName}", "迁移开始..."); MigrateTable(task, table, out string reason); if (table.Status == DataStates.Done) { Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.DestName}", "迁移成功。"); Logger.WriteRpt(task.Dest.Server, task.Dest.DB, table.DestName, "成功", table.Progress.ToString("#,##0")); } else { task.Status = DataStates.RunningError; task.ErrorMsg = reason; task.Progress -= table.Progress; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.DestName}", $"迁移失败!{reason}"); Logger.WriteRpt(task.Dest.Server, task.Dest.DB, table.DestName, "失败", reason); } lock (runList) { runList.Remove(table); } table = GetTable(lst, runList); } }); if (status.Stopped || task.Status == DataStates.RunningError || task.Status == DataStates.Error) { task.Status = DataStates.Error; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", "迁移失败!"); } else { task.Status = DataStates.Done; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", "迁移成功!"); } } catch (Exception ex) { task.Status = DataStates.Error; task.ErrorMsg = ex.Message; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", $"迁移失败!{ex.Message}"); } task.StartTick = WinAPI.GetTickCount() - task.StartTick; } } }
public void Execute(Instance ins, IStopStatus status) { this.status = status; foreach (Common.Task t in ins.Tasks) { if (status.Stopped) { break; } if (t is MaskingTask task && task.Tables.Length > 0) { task.StartTick = WinAPI.GetTickCount(); task.Status = DataStates.Running; // 构建待脱敏表清单 List <MaskingTable> lst = new List <MaskingTable>(); TableComparer comparer = new TableComparer(); foreach (Table tt in task.Tables) { if (tt is MaskingTable table) { lst.Add(table); } } lst.Sort(comparer); // 开始脱敏 try { Parallel.ForEach(CreateThreadAction((int)task.Threads), i => { MaskingTable table = GetTable(lst); while (table != null) { Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.SourceName}", "脱敏开始..."); MaskTable(task, table, out string reason); if (table.Status == DataStates.Done) { Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.SourceName}", "脱敏成功。"); Logger.WriteRpt(task.Dest.Server, task.Dest.DB, table.SourceName, "成功", table.Progress.ToString("#,##0")); } else { task.Status = DataStates.RunningError; task.ErrorMsg = reason; task.Progress -= table.Progress; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}.{table.SourceName}", $"脱敏失败!{reason}"); Logger.WriteRpt(task.Dest.Server, task.Dest.DB, table.SourceName, "失败", reason); } table = GetTable(lst); } }); if (status.Stopped || task.Status == DataStates.RunningError || task.Status == DataStates.Error) { task.Status = DataStates.Error; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", "脱敏失败!"); } else { task.Status = DataStates.Done; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", "脱敏成功!"); } } catch (Exception ex) { task.Status = DataStates.Error; task.ErrorMsg = ex.Message; Logger.WriteLog($"{task.Dest.Server}/{task.Dest.DB}", $"脱敏失败!{ex.Message}"); } task.StartTick = WinAPI.GetTickCount() - task.StartTick; } } }