Esempio n. 1
0
        public string Run(ActionType compareType, TableName[] N1, TableName[] N2, ApplicationCommand cmd)
        {
            string[] exceptColumns = cmd.Columns;

            DatabaseName dname1 = Side1.DatabaseName;
            DatabaseName dname2 = Side2.DatabaseName;

            cout.WriteLine("server1: {0} default database:{1}", Side1.Provider.DataSource, dname1.Name);
            cout.WriteLine("server2: {0} default database:{1}", Side2.Provider.DataSource, dname2.Name);

            if (!Exists(dname1) || !Exists(dname2))
            {
                return(string.Empty);
            }

            StringBuilder builder = new StringBuilder();

            builder.AppendFormat("-- sqlcon:", Side1.Provider.DataSource, dname1.Name).AppendLine();
            builder.AppendFormat("-- compare server={0} db={1}", Side1.Provider.DataSource, dname1.Name).AppendLine();
            builder.AppendFormat("--         server={0} db={1} @ {2}", Side2.Provider.DataSource, dname2.Name, DateTime.Now).AppendLine();

            Wildcard <TableName> match = MatchedDatabase.CreateWildcard(cmd);

            CancelableWork.CanCancel(cts =>
            {
                int i = 0;
                foreach (var tname1 in N1)
                {
                    if (cts.IsCancellationRequested)
                    {
                        return;
                    }

                    TableName tname2 = N2.Where(t => t.Name == tname1.Name).FirstOrDefault();
                    if (tname2 == null)
                    {
                        //when compare tables in the same database, the table name could be different
                        if (i < N2.Length && N2[i].DatabaseName == tname1.DatabaseName)
                        {
                            tname2 = N2[i];
                        }
                        else
                        {
                            tname2 = new TableName(dname2, tname1.SchemaName, tname1.Name);
                        }
                    }

                    if (compareType == ActionType.CompareData && !match.Contains(tname1))
                    {
                        cout.WriteLine("{0} is excluded", tname1);
                        continue;
                    }

                    if (tname2.Exists())
                    {
                        try
                        {
                            builder.Append(CompareTable(compareType, CompareSideType.compare, tname1, tname2, cmd.PK, exceptColumns));
                        }
                        catch (Exception ex)
                        {
                            cerr.WriteLine(ex.Message);
                        }
                    }
                    else
                    {
                        if (compareType == ActionType.CompareSchema)
                        {
                            string sql = tname1.GenerateCreateTableClause(appendGO: false);
                            cout.WriteLine(sql);
                            builder
                            .Append(sql)
                            .AppendLine(SqlScript.GO);
                        }
                        else
                        {
                            cout.WriteLine("{0} doesn't exist", tname2);
                        }
                    }

                    i++;
                }
            });

            return(builder.ToString());
        }