internal void Connect(int[] serverObjectIds)
        {
            SqlConnectionStringBuilder scsb;

            _confirmedServerObjectIds.Clear();
            LongRunningOperationManager.NewOperationBatch(true, false, new[] { new LongRunningOperation(string.Format("Connecting to all server objects...")) });

            if (!LongRunningOperationManager.IsBusy)
            {
                foreach (int serverObjectId in serverObjectIds)
                {
                    scsb = new SqlConnectionStringBuilder(_pool[serverObjectId].ConnectionString);
                    //lro.Add(new LongRunningOperation(string.Format("Connecting to '{0}'", scsb.DataSource), 1.0 / serverObjectIds.Length));
                }

                LongRunningOperationManager.DoWork += lrom_DoWorkConnectToSqlServer;
                LongRunningOperationManager.RunAsync(_pool);
            }

            _confirmedServerObjectIds.AddRange((int[])LongRunningOperationManager.ProcessResult);

            /*
             * if (LongRunningOperationManager.ProcessResult == null)
             * {
             *  _unconfirmedConnections.Remove(serverObjectId);
             *  MyOutput.NewMessage(EOutputMessageType.ERROR, string.Format("Cannot establish connection to '{0}'", scsb.DataSource), true);
             *  return false;
             * }
             * else
             * {
             *  _confirmedConnections.Add(serverObjectId, _unconfirmedConnections[serverObjectId]);
             *  MyOutput.NewMessage(EOutputMessageType.ERROR, string.Format("Connected to '{0}'", scsb.DataSource), true);
             *  return true;
             * }*/
        }
        private void button1_Click(object sender, EventArgs e)
        {
            LongRunningOperationManager.NewOperationBatch(true, true, new [] { new LongRunningOperation("a", 0.6), new LongRunningOperation("b", 0.3), new LongRunningOperation("c", 0.1) });

            LongRunningOperationManager.DoWork += LongRunningOperationManager_DoWork;

            LongRunningOperationManager.RunAsync();
        }
Example #3
0
 private void tsbShowInThisWindow_Click(object sender, EventArgs e)
 {
     LongRunningOperationManager.NewOperationBatch(true, true, new[] { new LongRunningOperation("Executing query") });
     LongRunningOperationManager.DoWork          += LongRunningOperationManager_DoWorkExecQuery;
     LongRunningOperationManager.WorkCompleted   += LongRunningOperationManager_ExecQueryCompleted;
     LongRunningOperationManager.WorkerPreCancel += LongRunningOperationManager_WorkerPreCancel;
     LongRunningOperationManager.RunAsync();
 }
Example #4
0
        public void DrawObjects()
        {
            if (_dependencyObjectList.Count > 0)
            {
                LongRunningOperationManager.ReportProgress(-1);

                DateTime dt = DateTime.Now;
                MyOutput.NewMessage(EOutputMessageType.PROGRESS, string.Format("Drawing objects..."));

                this.treeListView1.Roots = _dependencyObjectList.Where(m => m.SystemParentId == -1).OrderBy(m => m.ObjectName);
                tsslObjectCount.Text     = string.Format("{0:n0} total, {1:n0} root, {2:n0} dependency, {3:n0} unique", _dependencyObjectList.Count(), _dependencyObjectList.Count(d => d.HierarchyLevel == 0), _dependencyObjectList.Count(d => d.HierarchyLevel > 0), _dependencyObjectList.Distinct(new MySqlObjectEqualityComparer()).Count());

                MyOutput.AppendToLastMessage(EOutputMessageType.INFORMATION, string.Format("Done. {0:n0} objects drawn.", _dependencyObjectList.Count()), (DateTime.Now - dt).TotalSeconds);
            }
        }
        void LongRunningOperationManager_DoWork(object sender, DoWorkEventArgs e)
        {
            LongRunningOperationManager.StartNextStep();
            for (int i = 0; i < 100; i++)
            {
                LongRunningOperationManager.ReportProgress(i + 1);
                Thread.Sleep(100);

                //if (LongRunningOperationManager.CancellationPending)
                //{
                //    e.Cancel = true;
                //    return;
                //}
            }


            LongRunningOperationManager.StartNextStep();
            for (int i = 0; i < 100; i++)
            {
                LongRunningOperationManager.ReportProgress(i + 1);
                Thread.Sleep(50);

                if (LongRunningOperationManager.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
            //LongRunningOperationManager.ReportProgress(100);

            LongRunningOperationManager.StartNextStep();
            for (int i = 0; i < 100; i++)
            {
                LongRunningOperationManager.ReportProgress(i + 1);
                Thread.Sleep(20);

                if (LongRunningOperationManager.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
        }
        private void lrom_DoWorkConnectToSqlServer(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            Dictionary <int, SqlConnection> pool = (Dictionary <int, SqlConnection>)e.Argument;
            List <int> succServerObjects         = new List <int>();
            int        counter = 0;

            LongRunningOperationManager.StartNextStep();

            foreach (var c in pool)
            {
                counter++;

                LongRunningOperationManager.ReportProgress(counter / pool.Count);
                SqlConnection conn = c.Value;


                if (conn.State == System.Data.ConnectionState.Open)
                {
                    succServerObjects.Add(c.Key);
                }
                else
                {
                    try
                    {
                        conn.Open();
                        succServerObjects.Add(c.Key);
                    }
                    catch (Exception ex)
                    {
                        MyOutput.NewMessage(EOutputMessageType.ERROR, ex.Message, true);
                    }
                }
            }

            e.Result = succServerObjects.ToArray();
        }
Example #7
0
        private void LongRunningOperationManager_DoWorkExecQuery(object sender, DoWorkEventArgs e)
        {
            LongRunningOperationManager.StartNextStep();
            LongRunningOperationManager.ReportProgress(-1);

            MyOutput.NewMessage(EOutputMessageType.PROGRESS, string.Format("Reading data from {0}... ", this._mySqlObject.ObjectNameFull));

            DateTime dt = DateTime.Now;

            string query = string.Format("SELECT TOP 1000 * FROM [{0}].[{1}] WITH (NOLOCK)", _mySqlObject.SchemaName, _mySqlObject.ObjectName);

            _mySqlServer.ConnectionPool.GetConnection(_mySqlObject.ServerObjectId).ChangeDatabase(_mySqlObject.DatabaseName);
            cmd                = (SqlCommand)_mySqlServer.ConnectionPool.GetConnection(_mySqlObject.ServerObjectId).CreateCommand();
            cmd.CommandText    = query;
            cmd.CommandTimeout = UserSettings.Default.CommandTimeout;
            cmd.CommandType    = CommandType.Text;

            SqlDataReader rdr = null;

            try
            {
                rdr = cmd.ExecuteReader(CommandBehavior.SingleResult);
            }
            catch (Exception ex1)
            {
                if (!LongRunningOperationManager.CancellationPending)
                {
                    MyOutput.AppendToLastMessage(EOutputMessageType.ERROR, string.Format("{0}", ex1.Message));
                    MessageBox.Show(ex1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MyOutput.AppendToLastMessage(EOutputMessageType.WARNING, string.Format("Done. Cancelled by user."), (DateTime.Now - dt).TotalSeconds);
                }
            }

            if (rdr == null)
            {
                e.Cancel = true;
                return;
            }

            DataTable dataTable = new DataTable();

            dataTable.Load(rdr);
            rdr.Close();

            // Get all byte columns
            List <DataColumn> byteColumns = dataTable.Columns.Cast <DataColumn>().Where(dc => dc.DataType == typeof(byte[])).ToList();

            foreach (DataColumn dc in byteColumns)
            {
                int    colOrdinal = dc.Ordinal;
                string colName    = String.Format("{0} (Hex)", dc.ColumnName);

                DataColumn tmpCol = new DataColumn(colName, typeof(String));
                dataTable.Columns.Add(tmpCol);
                foreach (DataRow row in dataTable.Rows)
                {
                    row[tmpCol] = byteArrayToHexString((byte[])row[dc]);
                }
                dataTable.Columns.Remove(dc);
                dataTable.Columns[colName].SetOrdinal(colOrdinal);
            }

            e.Result = dataTable;

            MyOutput.AppendToLastMessage(EOutputMessageType.INFORMATION, string.Format("Done. Loaded {0} rows.", dataTable.Rows.Count), (DateTime.Now - dt).TotalSeconds);
        }
Example #8
0
 private void buttonCancel_Click(object sender, EventArgs e)
 {
     buttonCancel.Enabled = false;
     buttonCancel.Text    = "Cancelling...";
     LongRunningOperationManager.CancelAsync();
 }
Example #9
0
        void lrom_DoWorkViewDependencies(object sender, DoWorkEventArgs e)
        {
            BwObject bwo = (BwObject)e.Argument;

            LongRunningOperationManager.StartNextStep();
            mySqlServer1.Load(bwo.IsForceReload);
            //inMemoryDatabase1.Load(bwo.CheckedDatabases, bwo.IsForceReload);

            //
            if (LongRunningOperationManager.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            //
            LongRunningOperationManager.StartNextStep();
            DependencyBrowserDockForm dbdf = new DependencyBrowserDockForm(ref mySqlServer1, bwo.SearchObjectFullDescription, bwo.ObjectTypes, bwo.IsTopDownDiscovery, this._windowId++);

            dbdf.LoadDependencies(bwo.ObjectName, bwo.ObjectTypes, bwo.IsTopDownDiscovery, bwo.MatchMethod, bwo.IsForceReload, bwo.SearchDatabases);

            //
            if (LongRunningOperationManager.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            //
            LongRunningOperationManager.StartNextStep();
            dbdf.DrawObjects();



            if (dbdf.RecommendedDatabases.Count > 0)
            {
                var v1 = dbdf.RecommendedDatabases.Select(d => d.Value.ToString().ToUpper()).ToArray();
                var v2 = mySqlServer1.SqlDatabases.Select(d => d.ToString().ToUpper()).ToArray();
                var v3 = v1.Except(v2);

                if (v3 != null && v3.Any())
                {
                    var v4 = from rd in dbdf.RecommendedDatabases.AsEnumerable()
                             where v3.Contains(rd.Value.ToString().ToUpper())
                             select rd;

                    new InvalidDatabaseReferencesForm(v4.ToArray()).ShowDialog();
                }


                MySqlDatabase[] recommendedDatabasesWithAllAttributesSet =
                    dbdf.RecommendedDatabases.Select(
                        db =>
                        //this.DatabaseBrowserDockForm.AllDatabases.First(
                        mySqlServer1.SqlDatabases.FirstOrDefault(
                            db1 =>
                            db1.ServerObjectName.Equals(db.Value.ServerObjectName, StringComparison.InvariantCultureIgnoreCase) &&
                            db1.DatabaseName.Equals(db.Value.DatabaseName, StringComparison.InvariantCultureIgnoreCase)))
                    .Where(db => db != null).ToArray();

                string missingDbs     = string.Join(", ", recommendedDatabasesWithAllAttributesSet.Select(db => "[" + db.DatabaseName + "]").Distinct());
                string missingDbsText = string.Format("Results might be incomplete! Include database{0} " + missingDbs + " to get more accurate results.", (recommendedDatabasesWithAllAttributesSet.Length == 1) ? string.Empty : "s");
                dbdf.SetInfo(missingDbsText, Resources.StatusAnnotations_Warning_16xLG_color);

                var f = new RecommendedDatabasesForm(recommendedDatabasesWithAllAttributesSet);
                if (f.ShowDialog() == DialogResult.OK)
                {
                    e.Result = new DependencyBackgroundWorkerResult {
                        ResultType = EResultType.RERUN, ResultObject = f.CheckedRecommendedDatabases
                    };
                }
                else
                {
                    e.Result = new DependencyBackgroundWorkerResult {
                        ResultType = EResultType.SHOW_RESULTS, ResultObject = dbdf
                    };
                }
            }
            else
            {
                e.Result = new DependencyBackgroundWorkerResult {
                    ResultType = EResultType.SHOW_RESULTS, ResultObject = dbdf
                }
            };
        }

        void lrom_ViewDependenciesCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                return;
            }

            if (e.Result.GetType().IsAssignableFrom(typeof(DependencyBackgroundWorkerResult)))
            {
                var res = ((DependencyBackgroundWorkerResult)e.Result);

                if (res.ResultType == EResultType.SHOW_RESULTS)
                {
                    var d = ((DependencyBrowserDockForm)res.ResultObject);
                    if (d.AreDependenciesInitialized)
                    {
                        d.Show(this.dockPanel, DockState.Document);
                        d.AutoResizeColumns();
                    }
                }
                else if (res.ResultType == EResultType.RERUN)
                {
                    MySqlDatabase[] checkedRecommendedDatabases = new MySqlDatabase[((List <MySqlDatabase>)res.ResultObject).Count];
                    ((List <MySqlDatabase>)res.ResultObject).CopyTo(checkedRecommendedDatabases);

                    this.DatabaseBrowserDockForm.CheckDatabases(checkedRecommendedDatabases.Select(db => mySqlServer1.SqlDatabases.First(db1 => db1.ServerObjectName.Equals(db.ServerObjectName, StringComparison.InvariantCultureIgnoreCase) && db1.DatabaseName.Equals(db.DatabaseName, StringComparison.InvariantCultureIgnoreCase))).ToArray());
                }
            }

            /*
             * if (d.RecommendedDatabases.Count > 0)
             * {
             *  var recommendedDatabasesCleaned =
             *      d.RecommendedDatabases.Select(
             *          db =>
             *              this.DatabaseBrowserDockForm.AllDatabases.First(
             *                  db1 =>
             *                      db1.ServerName.Equals(db.ServerName, StringComparison.InvariantCultureIgnoreCase) &&
             *                      db1.DatabaseName.Equals(db.DatabaseName, StringComparison.InvariantCultureIgnoreCase)))
             *          .ToArray();
             *
             *  string missingDbs = string.Join(", ", recommendedDatabasesCleaned.Select(db => "[" + db.DatabaseName + "]").Distinct());
             *  string missingDbsText = string.Format("Results might be incomplete! Include database{0} " + missingDbs + " to get more accurate results.", (recommendedDatabasesCleaned.Length == 1) ? string.Empty : "s");
             *  d.SetInfo(missingDbsText, Resources.StatusAnnotations_Warning_16xLG_color);
             *
             *  var f = new RecommendedDatabasesForm(recommendedDatabasesCleaned);
             *  if (f.ShowDialog() == DialogResult.OK)
             *  {
             *      this.DatabaseBrowserDockForm.CheckDatabases(f.CheckedRecommendedDatabases.Select(db => this.DatabaseBrowserDockForm.AllDatabases.First(db1 => db1.ServerName.Equals(db.ServerName, StringComparison.InvariantCultureIgnoreCase) && db1.DatabaseName.Equals(db.DatabaseName, StringComparison.InvariantCultureIgnoreCase))).ToArray());
             *
             *      d.Close();
             *      //newDependencyCheck(sender, e);
             *  }
             * }
             * */
        }
Example #10
0
        public void newDependencyCheck(object sender, EventArgs e)
        {
            bool useWizard = sender.ToString().Contains("Wizard");

            if (mySqlServer1.ConnectionPool.GetConnection(0).State == ConnectionState.Open && mySqlServer1.SqlCheckedDatabases.Any())
            {
                NewDependencyCheckForm   ndcf = null;
                NewDependencyCheckWizard ndcw = null;

                if (sender.ToString().Contains("Wizard"))
                {
                    ndcw = new NewDependencyCheckWizard(mySqlServer1.SqlCheckedDatabases);
                }
                else
                {
                    ndcf = new NewDependencyCheckForm();
                }

                if ((!useWizard && ndcf.ShowDialog() == DialogResult.OK) || (useWizard && ndcw.ShowDialog() == DialogResult.OK))
                {
                    if (!LongRunningOperationManager.IsBusy)
                    {
                        do
                        {
                            LongRunningOperationManager.NewOperationBatch(true, true, new[] { new LongRunningOperation("Initializing objects and dependencies", 0.45), new LongRunningOperation("Searching for dependencies", 0.45), new LongRunningOperation("Drawing objects", 0.10) });

                            string[]        objTypes = (useWizard) ? ndcw.ObjectTypes : null;
                            string          objName  = (useWizard) ? ndcw.ObjectName : ndcf.ObjectName;
                            bool            topDown  = (useWizard) ? ndcw.IsTopDownDiscovery : ndcf.IsTopDownDiscovery;
                            EMatchMethod    mm       = (useWizard) ? ndcw.MatchMethod : EMatchMethod.Contains;
                            bool            forceInternalDbReload = (useWizard) ? ndcw.IsForceReload : false;
                            string          title     = (useWizard) ? ndcw.SearchObjectFullDescription : ndcf.SearchObjectFullDescription;
                            MySqlDatabase[] searchDbs = (useWizard) ? ndcw.SearchDatabases : null;

                            BwObject bwo = new BwObject {
                                CheckedDatabases = mySqlServer1.SqlCheckedDatabases, ObjectTypes = objTypes, ObjectName = objName, IsTopDownDiscovery = topDown, MatchMethod = mm, IsForceReload = forceInternalDbReload, SearchDatabases = searchDbs, SearchObjectFullDescription = title
                            };

                            LongRunningOperationManager.DoWork        += lrom_DoWorkViewDependencies;
                            LongRunningOperationManager.WorkCompleted += lrom_ViewDependenciesCompleted;
                            LongRunningOperationManager.RunAsync(bwo);
                        }while (LongRunningOperationManager.ProcessResult != null && ((DependencyBackgroundWorkerResult)LongRunningOperationManager.ProcessResult).ResultType == EResultType.RERUN);
                    }
                    else
                    {
                        MessageBox.Show("Please wait for background process to finish.");
                    }
                }
            }
            else
            {
                if (mySqlServer1.ConnectionPool.GetConnection(0).State != ConnectionState.Open)
                {
                    MessageBox.Show("Please connect to SQL Server and then select at least one database from the list to search for dependencies.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }

                if (mySqlServer1.ConnectionPool.GetConnection(0).State == ConnectionState.Open && !mySqlServer1.SqlCheckedDatabases.Any())
                {
                    MessageBox.Show("Please select at least one database from the list to search for dependencies.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
        }
Example #11
0
        public void Load(bool forceReload)
        {
            DateTime dt;
            int      dbCount;
            int      counter;

            this._status = ESqlServerStatus.REFRESHING;

            OnDataChanged?.Invoke(this, null);

            // Make backup of all lists in case of use cancells execution
            MySqlDatabase[]             oldLoadedDatabases           = new MySqlDatabase[_sqlLoadedDatabases.Count];
            MySqlObject[]               oldSqlObjects                = new MySqlObject[_sqlObjects.Count];
            MySqlExpressionDependency[] oldSqlExpressionDependencies = new MySqlExpressionDependency[_sqlExpressionDependencies.Count];

            _sqlLoadedDatabases.CopyTo(oldLoadedDatabases);
            _sqlObjects.CopyTo(oldSqlObjects);
            _sqlExpressionDependencies.CopyTo(oldSqlExpressionDependencies);


            if (forceReload)
            {
                _sqlLoadedDatabases.Clear();
                _sqlObjects.Clear();
                _sqlExpressionDependencies.Clear();
            }

            MySqlDatabase[] newSqlDatabases = SqlCheckedDatabases.Except(SqlLoadedDatabases).ToArray();
            MySqlDatabase[] oldSqlDatabases = SqlLoadedDatabases.Except(SqlCheckedDatabases).ToArray();

            counter = 0;
            dbCount = newSqlDatabases.Length * 2 + oldSqlDatabases.Length;

            // Remove unnecessary objects from unused database
            if (oldSqlDatabases.Length > 0)
            {
                foreach (MySqlDatabase oldDb in oldSqlDatabases)
                {
                    if (LongRunningOperationManager.CancellationPending)
                    {
                        break;
                    }

                    dt = DateTime.Now;
                    MyOutput.NewMessage(EOutputMessageType.PROGRESS, string.Format("Removing unnecessary objects for server '{0}', database '{1}' from internal database... ", oldDb.ServerObjectName, oldDb.DatabaseName));
                    int deletedObjectCount = _sqlObjects.RemoveAll(o => o.ServerObjectId == oldDb.ServerObjectId && o.DatabaseId == oldDb.DatabaseId);
                    MyOutput.AppendToLastMessage(EOutputMessageType.INFORMATION, string.Format("Done. Removed {0:n0} objects.", deletedObjectCount), (DateTime.Now - dt).TotalSeconds);

                    dt = DateTime.Now;
                    MyOutput.NewMessage(EOutputMessageType.PROGRESS, string.Format("Removing unnecessary dependencies for server '{0}', database '{1}' from internal database... ", oldDb.ServerObjectName, oldDb.DatabaseName));
                    int deletedExpressionDependencyCount = _sqlExpressionDependencies.RemoveAll(o => o.ServerObjectId == oldDb.ServerObjectId && o.DatabaseId == oldDb.DatabaseId);
                    MyOutput.AppendToLastMessage(EOutputMessageType.INFORMATION, string.Format("Done. Removed {0:n0} dependencies.", deletedExpressionDependencyCount), (DateTime.Now - dt).TotalSeconds);

                    LongRunningOperationManager.ReportProgress(100 * ++counter / dbCount);
                }
            }

            if (newSqlDatabases.Length > 0)
            {
                foreach (MySqlDatabase newDb in newSqlDatabases)
                {
                    if (LongRunningOperationManager.CancellationPending)
                    {
                        break;
                    }

                    initSqlObjects(newDb.ServerObjectId, newDb.DatabaseId);
                    //loadDatabaseObjects(newDb.ServerObjectName, newDb.DatabaseName);

                    LongRunningOperationManager.ReportProgress(100 * ++counter / dbCount);
                }
                MyOutput.NewMessage(EOutputMessageType.INFORMATION, string.Format("Totally {0:n0} objects loaded from {1:n0} server(s) and {2:n0} database(s).", _sqlObjects.Count, SqlCheckedDatabases.Select(s => s.ServerObjectName).Distinct().Count(), SqlCheckedDatabases.Length));

                // ALL OBJECTS FROM ALL SERVERS / DATABASES MUST BE LOADED FIRST!
                foreach (MySqlDatabase newDb in newSqlDatabases)
                {
                    if (LongRunningOperationManager.CancellationPending)
                    {
                        break;
                    }

                    initSqlExpressionDependencies(newDb.ServerObjectId, newDb.DatabaseId);

                    LongRunningOperationManager.ReportProgress(100 * ++counter / dbCount);
                }
                MyOutput.NewMessage(EOutputMessageType.INFORMATION, string.Format("Totally {0:n0} dependencies loaded from {1:n0} server(s) and {2:n0} database(s).", _sqlExpressionDependencies.Count, SqlCheckedDatabases.Select(s => s.ServerObjectName).Distinct().Count(), SqlCheckedDatabases.Length));
            }

            if (!LongRunningOperationManager.CancellationPending)
            {
                _sqlLoadedDatabases.Clear();
                _sqlLoadedDatabases.AddRange(SqlCheckedDatabases);

                if (oldSqlDatabases.Length > 0 || newSqlDatabases.Length > 0)
                {
                    this._lastDataLoad = DateTime.Now;
                }
            }
            else
            {
                _sqlLoadedDatabases.Clear();
                _sqlObjects.Clear();
                _sqlExpressionDependencies.Clear();

                _sqlLoadedDatabases.AddRange(oldLoadedDatabases);
                _sqlObjects.AddRange(oldSqlObjects);
                _sqlExpressionDependencies.AddRange(oldSqlExpressionDependencies);
            }

            this._status = ESqlServerStatus.READY;


            // Prepare EX lists

            /*
             * SqlExpressionDependenciesEx.Clear();
             * foreach (var ed in _sqlExpressionDependencies)
             * {
             *  var keys = new MyKeyList();
             *  keys.Add(ed.ParentServerObjectId);
             *  keys.Add(ed.ParentDatabaseId);
             *  keys.Add(ed.ParentObjectId);
             *  keys.Add(ed.ChildServerObjectId);
             *  keys.Add(ed.ChildDatabaseId);
             *  keys.Add(ed.ChildObjectId);
             *  SqlExpressionDependenciesEx.Add(keys, ed);
             * }
             */

            OnDataChanged?.Invoke(this, null);
        }
Example #12
0
        private int loadDependentObjects(MySqlObject masterParentObject, MySqlObject[] objs, bool isTopDown, ref int refObjectId, int level)
        {
            int  totalMaxLevel  = -1;
            bool hasNextObjects = false;
            int  counter        = 0;

            IEnumerable <MySqlObject> nextObjects;
            IEnumerable <MySqlObject> nextSynonymObjects;


            foreach (MySqlObject obj in objs)
            {
                if (LongRunningOperationManager.CancellationPending)
                {
                    //e.Cancel = true;
                    break;
                }

                var singleObjectMaxLevel = -1;

                // Get next objects which are NOT synonyms
                if (isTopDown)
                {
                    nextObjects = from o in _mySqlServer.SqlObjects
                                  join d in _mySqlServer.SqlExpressionDependencies.Where(d => d.ChildObjectExists).Where(d => d.ChildObjectId != d.ParentObjectId)
                                  on      new { ServerId = o.ServerObjectId, DatabaseId = o.DatabaseId, ObjectId = o.ObjectId }
                    equals  new { ServerId = d.ChildServerObjectId, DatabaseId = d.ChildDatabaseId, ObjectId = d.ChildObjectId }
                    where obj.ServerObjectId == d.ParentServerObjectId &&
                    obj.DatabaseId == d.ParentDatabaseId &&
                    obj.ObjectId == d.ParentObjectId &&
                    obj.ObjectType != "SYNONYM"
                    select o;

                    var nonExistingNextObjects = from d in _mySqlServer.SqlExpressionDependencies.Where(d => !d.ChildObjectExists).Where(d => d.ChildObjectId != d.ParentObjectId)
                                                 where obj.ServerObjectId == d.ParentServerObjectId &&
                                                 obj.DatabaseId == d.ParentDatabaseId &&
                                                 obj.ObjectId == d.ParentObjectId &&
                                                 obj.ObjectType != "SYNONYM"
                                                 select new MySqlObject
                    {
                        ServerObjectName = d.ChildServerObjectName,
                        DatabaseName     = d.ChildDatabaseName,
                        SchemaName       = d.ChildSchemaName,
                        ObjectName       = d.ChildObjectName,

                        ServerObjectId = -1,
                        DatabaseId     = -1,
                        SchemaId       = -1,
                        ObjectId       = -1,
                        ObjectNameFull = string.Format("[{0}].[{1}].[{2}].[{3}]", d.ChildServerObjectName, d.ChildDatabaseName, d.ChildSchemaName, d.ChildObjectName),
                        ObjectTypeId   = "UNRESOLVED_ENTITY",
                        ObjectType     = "UNRESOLVED_ENTITY"
                    };

                    nextObjects = nextObjects.Union(nonExistingNextObjects);

                    if (!string.IsNullOrEmpty(obj.BaseObjectNameFull))
                    {
                        string[] bo           = obj.BaseObjectNameFull.Replace("[", string.Empty).Replace("]", string.Empty).Split('.');
                        string   serverName   = bo[0];
                        string   databaseName = bo[1];

                        if (
                            !_mySqlServer.SqlLoadedDatabases.Any(
                                db => db.ServerObjectName.Equals(serverName, StringComparison.InvariantCultureIgnoreCase) &&
                                db.DatabaseName.Equals(databaseName, StringComparison.InvariantCultureIgnoreCase)))
                        {
                            _recommendedDatabases.Add(new KeyValuePair <MySqlObject, MySqlDatabase>(obj, new MySqlDatabase {
                                ServerObjectId = -1, ServerObjectName = serverName, DatabaseId = -1, DatabaseName = databaseName
                            }));
                        }
                    }

                    nextSynonymObjects = from o in _mySqlServer.SqlObjects
                                         where o.ObjectNameFull.Equals(obj.BaseObjectNameFull, StringComparison.InvariantCultureIgnoreCase) &&
                                         obj.ObjectType == "SYNONYM"
                                         select o;
                }
                else
                {
                    nextObjects = from o in _mySqlServer.SqlObjects
                                  join d in _mySqlServer.SqlExpressionDependencies.Where(d => d.ChildObjectId != d.ParentObjectId) on new { ServerId = o.ServerObjectId, o.DatabaseId, o.ObjectId } equals new { ServerId = d.ParentServerObjectId, DatabaseId = d.ParentDatabaseId, ObjectId = d.ParentObjectId }
                    where obj.ServerObjectId == d.ChildServerObjectId &&
                    obj.DatabaseId == d.ChildDatabaseId &&
                    obj.ObjectId == d.ChildObjectId &&
                    o.ObjectType != "SYNONYM"
                    select o;

                    // non-existing objects

                    //var a1 = from d in _inMemoryDatabase.SqlDependencyList.Where(d => !d.ChildObjectExists).Where(d => d.ChildObjectId != d.ParentObjectId)
                    //         where obj.ServerName.Equals(d.ChildServerName, StringComparison.InvariantCultureIgnoreCase) &&
                    //         obj.DatabaseName.Equals(d.ChildDatabaseName, StringComparison.InvariantCultureIgnoreCase) &&
                    //         obj.SchemaName.Equals(d.ChildSchemaName, StringComparison.InvariantCultureIgnoreCase) &&
                    //         obj.ObjectName.Equals(d.ChildObjectName, StringComparison.InvariantCultureIgnoreCase)
                    //         select d;



                    var nonExistingNextObjects = from o in _mySqlServer.SqlObjects
                                                 join d in _mySqlServer.SqlExpressionDependencies.Where(d => !d.ChildObjectExists).Where(d => d.ChildObjectId != d.ParentObjectId) on new { ServerId = o.ServerObjectId, o.DatabaseId, o.ObjectId } equals new { ServerId = d.ParentServerObjectId, DatabaseId = d.ParentDatabaseId, ObjectId = d.ParentObjectId }
                    where obj.ServerObjectName.Equals(d.ChildServerObjectName, StringComparison.InvariantCultureIgnoreCase) &&
                    obj.DatabaseName.Equals(d.ChildDatabaseName, StringComparison.InvariantCultureIgnoreCase) &&
                    obj.SchemaName.Equals(d.ChildSchemaName, StringComparison.InvariantCultureIgnoreCase) &&
                    obj.ObjectName.Equals(d.ChildObjectName, StringComparison.InvariantCultureIgnoreCase) &&
                    o.ObjectType != "SYNONYM"
                    select o;

                    nextObjects = nextObjects.Union(nonExistingNextObjects);

                    nextSynonymObjects = from o in _mySqlServer.SqlObjects
                                         where obj.ObjectNameFull.Equals(o.BaseObjectNameFull, StringComparison.InvariantCultureIgnoreCase) &&
                                         o.ObjectType == "SYNONYM"
                                         select o;
                }


                var allNextObjects = nextObjects.Union(nextSynonymObjects);

                if (allNextObjects.Any())
                {
                    hasNextObjects = true;
                }

                if (masterParentObject == null && allNextObjects.Any() || masterParentObject != null)
                {
                    obj.SystemId          = ++refObjectId;
                    obj.SystemParentId    = (masterParentObject == null) ? -1 : masterParentObject.SystemId;
                    obj.HierarchyLevel    = (masterParentObject == null) ? 0 : masterParentObject.HierarchyLevel + 1;
                    obj.IsSelfReferencing = _mySqlServer.SqlExpressionDependencies.Any(d => d.ParentObjectId == obj.ObjectId && d.ParentObjectId == d.ChildObjectId) ? "Yes" : "No";

                    int nextObjectsMaxLevel = loadDependentObjects(obj, allNextObjects.ToArray(), isTopDown, ref refObjectId, level + 1);

                    if (nextObjectsMaxLevel > totalMaxLevel)
                    {
                        totalMaxLevel = nextObjectsMaxLevel;
                    }
                    if (nextObjectsMaxLevel > singleObjectMaxLevel)
                    {
                        singleObjectMaxLevel = nextObjectsMaxLevel;
                    }

                    obj.MaximumUnderlyingLevels = singleObjectMaxLevel - obj.HierarchyLevel;
                    _dependencyObjectList.Add((MySqlObject)obj.Clone());
                }

                if (level == 0)
                {
                    LongRunningOperationManager.ReportProgress(100 * ++counter / objs.Length);
                }
            }
            return(Math.Max(totalMaxLevel, (hasNextObjects) ? level : level - 1));

            //MyOutput.NewMessage(EOutputMessageType.INFORMATION, string.Format("Done. Loaded {0:n0} dependencies in {1:0.00} seconds.", _sqlDependencyList.Count - initialNumberOfRows, (DateTime.Now - dt).TotalSeconds));
        }