Ejemplo n.º 1
0
        private void RemoveClosedTask(
            TreeTask completeTask
            )
        {
            long taskHandle     = completeTask.Info.Handle;
            bool executingTasks = false;

            lock (this._runningTasksLock)
            {
                if (this.RunningTasks.ContainsKey(taskHandle))
                {
                    TreeTask removedTask;

                    this.RunningTasks.TryRemove(taskHandle, out removedTask);
                }

                completeTask.JobChanged -= OnTaskJobChanged;
            }

            lock (this._runningTasksLock)
            {
                executingTasks = this.RunningTasks.Any();
            }

            this._treeControl.SetInProgress(completeTask.Info, false, executingTasks);
        }
Ejemplo n.º 2
0
        private void RunningTasksOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
        {
            if (args.NewItems != null)
            {
                foreach (KeyValuePair <long, TreeTask> ti in args.NewItems)
                {
                    TreeTask treeTask = ti.Value;

                    treeTask.JobChanged += (s, e) =>
                    {
                        string val = null;

                        switch (e.Event)
                        {
                        case TreeJobChangedEvent.WaitingAdded:
                            this.Waiting.TryAdd(e.Job.GetHashCode(), e.Job.Title);
                            break;

                        case TreeJobChangedEvent.WaitingScheduled:
                            this.Waiting.TryRemove(e.Job.GetHashCode(), out val);
                            break;

                        case TreeJobChangedEvent.RunningAdded:
                            this.Running.TryAdd(e.Job.GetHashCode(), e.Job.Title);
                            break;

                        case TreeJobChangedEvent.RunningCompleted:
                            this.Running.TryRemove(e.Job.GetHashCode(), out val);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }

                        RaiseOnChanged();
                    };

                    treeTask.Canceled += (o, eventArgs) =>
                    {
                        this.IsCancelRequested = true;
                        this.Waiting.Clear();
                        RaiseOnChanged();
                    };
                }
            }
        }
Ejemplo n.º 3
0
        public void EnsureChildrenReady(TreeNode node)
        {
            TreeTask treeTask = BeginRefreshTask(node, false, NodeUpdatingSource.FromServerIfNotSavedLocally);

            if (treeTask != null)
            {
                EventWaitHandle alarm = new EventWaitHandle(false, EventResetMode.ManualReset);
                EventHandler    taskCompleteHandler = null;

                taskCompleteHandler = (sender, args) =>
                {
                    alarm.Set();
                    treeTask.Completed -= taskCompleteHandler;
                };

                treeTask.Completed += taskCompleteHandler;

                alarm.WaitOne();
            }
        }
Ejemplo n.º 4
0
		private void RefreshQueries(
			TreeTask                       treeTask,
			ConcreteTemplateNodeDefinition nodeDefinition,
			ProgressItem                   progress
		)
		{
			log.DebugFormat("taskInfo.Connection:'{0}';nodeDefinition:'{1}'",
				treeTask.Info.Connection.ConnectionGroup.ToString() ?? "?",
				nodeDefinition.TemplateNode.Name ?? "?"
			);

			ErrorLog          errorLog      = new ErrorLog();
			MsSqlAuditorModel model         = this._treeControl._model;
			DateTime          startTime     = DateTime.Now;
			Stopwatch         durationWatch = new Stopwatch();

			durationWatch.Start();

			using (SqlProcessor sqlProcessor = model.GetNewSqlProcessor(treeTask.CancellationSource.Token))
			{
				if (!treeTask.Info.Connection.IsLiveConnection)
				{
					sqlProcessor.SetSkipMSSQLQueries();
				}

				progress.SetPromisedChildCount(1);

				TemplateNodeInfo     templateNode = nodeDefinition.TemplateNode;
				ConnectionGroupInfo  group        = nodeDefinition.Connection;
				MultyQueryResultInfo result;

				if (nodeDefinition.Group.Instance != null)
				{
					result = sqlProcessor.ExecuteMultyQuery(
						nodeDefinition.Group,
						templateNode.Queries,
						progress.GetChild()
					);
				}
				else
				{
					result = sqlProcessor.ExecuteMultyQuery(
						group,
						templateNode.Queries,
						progress.GetChild(),
						model.Settings.SystemSettings.MaximumDBRequestsThreadCount
					);
				}

				if (group != null && group.Connections != null)
				{
					group.Connections.ForEach(
						x => x.ConnectionGroup = x.ConnectionGroup ?? group
					);
				}

				errorLog.AppendErrorLog(result);

				IStorageManager storage = model.GetVaultProcessor(group);

				storage.SaveRequestedData(templateNode, result);

				durationWatch.Stop();

				DateTime duration = new DateTime(durationWatch.Elapsed.Ticks);

				storage.CurrentStorage.UpdateTreeNodeTimings(
					templateNode,
					startTime,
					duration
				);

				foreach (GroupDefinition database in result.ExtractDatabases())
				{
					ConcreteTemplateNodeDefinition nodeDef = new ConcreteTemplateNodeDefinition(
						templateNode,
						database,
						group
					);

					this._treeControl.VisualizeData(nodeDef);
				}
			}
		}
Ejemplo n.º 5
0
		private void RefreshNode(
			TreeTask     treeTask,
			TreeJob      parentJob,
			TreeNode     treeNode,
			ProgressItem progress
		)
		{
			ConcreteTemplateNodeDefinition nodeDefinition = treeNode.Tag as ConcreteTemplateNodeDefinition;

			if (treeTask.CancellationSource.IsCancellationRequested)
			{
				return;
			}

			if (nodeDefinition == null)
			{
				return;
			}

			TreeJob treeJob = new TreeJob(nodeDefinition);

			if (parentJob != null)
			{
				parentJob.AddChildJob(treeJob);
				treeJob.Parent = parentJob;
			}

			WeakReference treeNodeRef = new WeakReference(treeNode);

			treeTask.JobCompleted += (sender, args) =>
			{
				TreeTask task = sender as TreeTask;

				if (task != null && treeNodeRef.IsAlive)
				{
					if (!task.CancellationSource.IsCancellationRequested)
					{
						TreeNode targetNode = (TreeNode) treeNodeRef.Target;
						UpdateTreeCounts(targetNode, task.Info.Mode);
					}
				}
			};

			bool refreshChildren = treeTask.Info.Hierarchically;

			Action refreshNodeAction = () =>
			{
				try
				{
					TemplateNodeInfo templateNode = nodeDefinition.TemplateNode;

					if (templateNode == null || !nodeDefinition.NodeAvailable)
					{
						return;
					}

					templateNode.LastUpdateNode = DateTime.Now;

					CurrentStorage storage = GetStorage(templateNode.ConnectionGroup);

					templateNode.LoadUserParameters(storage);

					if (nodeDefinition.NodeActivated)
					{
						RefreshQueries(treeTask, nodeDefinition, progress);
					}

					if (templateNode.IsLeaf())
					{
						return;
					}

					AddLoadingNode(treeNode);

					templateNode.UpdateChildren(treeTask.Info.Mode, treeTask.CancellationSource);
					FillTreeNodes(templateNode, treeNode.Nodes);

					if (refreshChildren)
					{
						treeJob.PromisedChildCount = treeNode.Nodes.Count;

						foreach (TreeNode node in treeNode.Nodes)
						{
							if (node != null)
							{
								RefreshNode(treeTask, treeJob, node, progress);
							}
						}
					}
				}
				catch (Exception exc)
				{
					log.Error("MSSQLServerAuditor.Managers:RefreshNode:subTask (Exception)", exc);
				}
			};

			treeJob.Action = refreshNodeAction;

			lock (this._schedulingLock)
			{
				treeTask.Schedule(treeJob);
			}
		}
Ejemplo n.º 6
0
		private void RemoveClosedTask(
			TreeTask completeTask
		)
		{
			long taskHandle     = completeTask.Info.Handle;
			bool executingTasks = false;

			lock (this._runningTasksLock)
			{
				if (this.RunningTasks.ContainsKey(taskHandle))
				{
					TreeTask removedTask;

					this.RunningTasks.TryRemove(taskHandle, out removedTask);
				}

				completeTask.JobChanged -= OnTaskJobChanged;
			}

			lock (this._runningTasksLock)
			{
				executingTasks = this.RunningTasks.Any();
			}

			this._treeControl.SetInProgress(completeTask.Info, false, executingTasks);
		}
Ejemplo n.º 7
0
        public TreeTask BeginRefreshTask(
            TreeNode treeNode,
            bool hierarchically,
            NodeUpdatingSource mode,
            Action continueWith = null
            )
        {
            if (treeNode == null)
            {
                return(null);
            }

            ConcreteTemplateNodeDefinition templateDef =
                treeNode.Tag as ConcreteTemplateNodeDefinition;

            if (templateDef == null)
            {
                log.Debug("MSSQLServerAuditor.TreeTaskManager:BeginRefreshTask templateDef is not defined.");
                return(null);
            }

            long nodeHandle = templateDef.ComputeHandle();

            if (this.RunningTasks.ContainsKey(nodeHandle))
            {
                return(null);
            }

            ConnectionData connectionData = GetConnectionData(treeNode);

            TreeTaskInfo taskInfo = new TreeTaskInfo
            {
                Connection     = connectionData,
                Mode           = mode,
                Hierarchically = hierarchically,
                Note           = string.Format("{0}", DateTime.Now.ToString("mm:ss")),
                Handle         = nodeHandle
            };

            TreeTask treeTask = TreeTask.Create(taskInfo);

            if (this._treeControl != null)
            {
                treeTask.Progress.ProgressChanged +=
                    (sender, args) => this._treeControl.SetProgressValue((int)args.NewValue);
            }

            treeTask.Completed += (sender, args) =>
            {
                Task.Factory.StartNew(() => RemoveClosedTask(treeTask));

                if (continueWith != null)
                {
                    continueWith();
                }
            };

            lock (this._runningTasksLock)
            {
                this.RunningTasks.TryAdd(taskInfo.Handle, treeTask);
            }

            // don't change order of Add and Subscribe!
            treeTask.JobChanged += OnTaskJobChanged;

            if (this._treeControl != null)
            {
                this._treeControl.SetInProgress(taskInfo, true, true);
            }

            ProgressItem progress = new ProgressItem();

            RefreshNode(treeTask, null, treeNode, progress);

            return(treeTask);
        }
Ejemplo n.º 8
0
        private void RefreshQueries(
            TreeTask treeTask,
            ConcreteTemplateNodeDefinition nodeDefinition,
            ProgressItem progress
            )
        {
            log.DebugFormat("taskInfo.Connection:'{0}';nodeDefinition:'{1}'",
                            treeTask.Info.Connection.ConnectionGroup.ToString() ?? "?",
                            nodeDefinition.TemplateNode.Name ?? "?"
                            );

            ErrorLog          errorLog      = new ErrorLog();
            MsSqlAuditorModel model         = this._treeControl._model;
            DateTime          startTime     = DateTime.Now;
            Stopwatch         durationWatch = new Stopwatch();

            durationWatch.Start();

            using (SqlProcessor sqlProcessor = model.GetNewSqlProcessor(treeTask.CancellationSource.Token))
            {
                if (!treeTask.Info.Connection.IsLiveConnection)
                {
                    sqlProcessor.SetSkipMSSQLQueries();
                }

                progress.SetPromisedChildCount(1);

                TemplateNodeInfo     templateNode = nodeDefinition.TemplateNode;
                ConnectionGroupInfo  group        = nodeDefinition.Connection;
                MultyQueryResultInfo result;

                if (nodeDefinition.Group.Instance != null)
                {
                    result = sqlProcessor.ExecuteMultyQuery(
                        nodeDefinition.Group,
                        templateNode.Queries,
                        progress.GetChild()
                        );
                }
                else
                {
                    result = sqlProcessor.ExecuteMultyQuery(
                        group,
                        templateNode.Queries,
                        progress.GetChild(),
                        model.Settings.SystemSettings.MaximumDBRequestsThreadCount
                        );
                }

                if (group != null && group.Connections != null)
                {
                    group.Connections.ForEach(
                        x => x.ConnectionGroup = x.ConnectionGroup ?? group
                        );
                }

                errorLog.AppendErrorLog(result);

                IStorageManager storage = model.GetVaultProcessor(group);

                storage.SaveRequestedData(templateNode, result);

                durationWatch.Stop();

                DateTime duration = new DateTime(durationWatch.Elapsed.Ticks);

                storage.CurrentStorage.UpdateTreeNodeTimings(
                    templateNode,
                    startTime,
                    duration
                    );

                foreach (GroupDefinition database in result.ExtractDatabases())
                {
                    ConcreteTemplateNodeDefinition nodeDef = new ConcreteTemplateNodeDefinition(
                        templateNode,
                        database,
                        group
                        );

                    this._treeControl.VisualizeData(nodeDef);
                }
            }
        }
Ejemplo n.º 9
0
        private void RefreshNode(
            TreeTask treeTask,
            TreeJob parentJob,
            TreeNode treeNode,
            ProgressItem progress
            )
        {
            ConcreteTemplateNodeDefinition nodeDefinition = treeNode.Tag as ConcreteTemplateNodeDefinition;

            if (treeTask.CancellationSource.IsCancellationRequested)
            {
                return;
            }

            if (nodeDefinition == null)
            {
                return;
            }

            TreeJob treeJob = new TreeJob(nodeDefinition);

            if (parentJob != null)
            {
                parentJob.AddChildJob(treeJob);
                treeJob.Parent = parentJob;
            }

            WeakReference treeNodeRef = new WeakReference(treeNode);

            treeTask.JobCompleted += (sender, args) =>
            {
                TreeTask task = sender as TreeTask;

                if (task != null && treeNodeRef.IsAlive)
                {
                    if (!task.CancellationSource.IsCancellationRequested)
                    {
                        TreeNode targetNode = (TreeNode)treeNodeRef.Target;
                        UpdateTreeCounts(targetNode, task.Info.Mode);
                    }
                }
            };

            bool refreshChildren = treeTask.Info.Hierarchically;

            Action refreshNodeAction = () =>
            {
                try
                {
                    TemplateNodeInfo templateNode = nodeDefinition.TemplateNode;

                    if (templateNode == null || !nodeDefinition.NodeAvailable)
                    {
                        return;
                    }

                    templateNode.LastUpdateNode = DateTime.Now;

                    CurrentStorage storage = GetStorage(templateNode.ConnectionGroup);

                    templateNode.LoadUserParameters(storage);

                    if (nodeDefinition.NodeActivated)
                    {
                        RefreshQueries(treeTask, nodeDefinition, progress);
                    }

                    if (templateNode.IsLeaf())
                    {
                        return;
                    }

                    AddLoadingNode(treeNode);

                    templateNode.UpdateChildren(treeTask.Info.Mode, treeTask.CancellationSource);
                    FillTreeNodes(templateNode, treeNode.Nodes);

                    if (refreshChildren)
                    {
                        treeJob.PromisedChildCount = treeNode.Nodes.Count;

                        foreach (TreeNode node in treeNode.Nodes)
                        {
                            if (node != null)
                            {
                                RefreshNode(treeTask, treeJob, node, progress);
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    log.Error("MSSQLServerAuditor.Managers:RefreshNode:subTask (Exception)", exc);
                }
            };

            treeJob.Action = refreshNodeAction;

            lock (this._schedulingLock)
            {
                treeTask.Schedule(treeJob);
            }
        }