示例#1
0
        private void DoDiff()
        {
            // TODO IMM HI: refucktor
              ThreadPool.QueueUserWorkItem(
            state =>
              {
            try
            {
              ToggleIndeterminateProgress(true, pic_indeterminateProgress);

              var selectedEnvironments = new List<EnvironmentInfo>();

              for (int i = 0; i < dgv_environments.SelectedRows.Count; i++)
              {
                DataGridViewRow dataGridViewRow = dgv_environments.SelectedRows[i];
                var dataBoundItem = (EnvironmentInfoRow)dataGridViewRow.DataBoundItem;
                EnvironmentInfo environmentInfo = dataBoundItem.EnvironmentInfo;

                selectedEnvironments.Add(environmentInfo);
              }

              if (selectedEnvironments.Count < 2)
              {
                throw new InternalException("At least 2 environments should've been selected.");
              }

              selectedEnvironments.Sort((ei1, ei2) => string.CompareOrdinal(ei1.Name, ei2.Name));

              var dbVersionsModel = new DbVersionsModel();

              foreach (EnvironmentInfo selectedEnvironment in selectedEnvironments)
              {
                string databaseServerMachineName = selectedEnvironment.DatabaseServerMachineName;
                string connectionString = string.Format("Server={0};Integrated Security=SSPI", databaseServerMachineName);

                using (var dbConnection = new SqlConnection(connectionString))
                {
                  dbConnection.Open();

                  IEnumerable<dynamic> databases =
                    dbConnection.Query("select * from sys.databases");

                  foreach (dynamic database in databases)
                  {
                    string databaseName = database.name.ToUpper();

                    if (_IgnoredDatabaseNames.Contains(databaseName))
                    {
                      continue;
                    }

                    IEnumerable<dynamic> tables;

                    try
                    {
                      tables = dbConnection.Query(
                        string.Format(
                          "use [{0}]" + "\r\n" +
                          "select * from sys.tables",
                          databaseName));
                    }
                    catch (SqlException)
                    {
                      tables = new List<dynamic>();
                    }

                    IEnumerable<string> tableNames = tables.Select(t => ((string)t.name).ToUpper());
                    List<string> dbVersions;

                    // TODO IMM HI: parameterize
                    if (tableNames.Contains("VERSIONHISTORY") && TableContainsColumn(dbConnection, databaseName, "VERSIONHISTORY", "DBLabel"))
                    {
                      dbVersions = ObtainDbVersions(dbConnection, databaseName, "VERSIONHISTORY", "DBLabel");
                    }
                    else if (tableNames.Contains("VERSION") && TableContainsColumn(dbConnection, databaseName, "VERSION", "dbVersion"))
                    {
                      dbVersions = ObtainDbVersions(dbConnection, databaseName, "VERSION", "dbVersion");
                    }
                    else
                    {
                      dbVersions = new List<string>();
                    }

                    dbVersionsModel.AddDatabase(selectedEnvironment.Name, databaseName, dbVersions);
                  }
                }
              }

              var databasesDataTable = new DataTable("Databases");

              foreach (EnvironmentInfo selectedEnvironment in selectedEnvironments)
              {
                databasesDataTable.Columns.Add(selectedEnvironment.Name);
              }

              bool differencesOnly = cb_differencesOnly.Checked;
              List<string> allSortedDatabaseNames = dbVersionsModel.GetAllSortedDatabaseNames().ToList();
              var addedDatabaseNames = new List<string>();

              foreach (string databaseName in allSortedDatabaseNames)
              {
                if (differencesOnly)
                {
                  bool areDatabasesConsistent =
                    dbVersionsModel.AreDatabasesConsistentAcrossEnvironments(databaseName);

                  if (areDatabasesConsistent)
                  {
                    continue;
                  }
                }

                object[] values = new object[selectedEnvironments.Count];
                int i = 0;

                foreach (EnvironmentInfo selectedEnvironment in selectedEnvironments)
                {
                  values[i++] = dbVersionsModel.IsDatabasePresentInEnvironment(selectedEnvironment.Name, databaseName) ? "V" : "X";
                }

                addedDatabaseNames.Add(databaseName);
                databasesDataTable.Rows.Add(values);
              }

              GuiUtils.BeginInvoke(
                this,
                () =>
                  {
                    _currentDbVersionsModel = dbVersionsModel;

                    dgv_databasesInEnvironments.DataSource = databasesDataTable;

                    int i = 0;

                    foreach (string databaseName in addedDatabaseNames)
                    {
                      dgv_databasesInEnvironments.Rows[i++].HeaderCell.Value = databaseName;
                    }

                    dgv_databasesInEnvironments.RowHeadersWidth = dgv_databasesInEnvironments.Width / 2;

                    if (dgv_databasesInEnvironments.Rows.Count > 0)
                    {
                      // trigger SelectionChanged event
                      dgv_databasesInEnvironments.Rows[0].Selected = false;
                      dgv_databasesInEnvironments.Rows[0].Selected = true;
                    }
                  });
            }
            catch (Exception exc)
            {
              HandleThreadException(exc);
            }
            finally
            {
              ToggleIndeterminateProgress(false, pic_indeterminateProgress);
            }
              });
        }