コード例 #1
0
ファイル: TableComparerTests.cs プロジェクト: tonychue/public
            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]);
            }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: TableComparerTests.cs プロジェクト: tonychue/public
            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);
            }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: ServiceAccess.cs プロジェクト: maziart/DataCompare
        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));
        }
コード例 #7
0
        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;
                }
            }
        }
コード例 #8
0
        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;
                }
            }
        }