public NodeDataProvider(
			MsSqlAuditorModel              model,
			ConcreteTemplateNodeDefinition nodeDefinition
		)
		{
			this._nodeDefinition = nodeDefinition;
			this._dataSource     = new QueryResultDataSource(model, nodeDefinition);

			IQueryResultXmlTransformer transformer = new QueryResultXmlTransformer();

			XmlDocument = transformer.Transform(this._dataSource);
		}
        public NodeDataProvider(
            MsSqlAuditorModel model,
            ConcreteTemplateNodeDefinition nodeDefinition
            )
        {
            this._nodeDefinition = nodeDefinition;
            this._dataSource     = new QueryResultDataSource(model, nodeDefinition);

            IQueryResultXmlTransformer transformer = new QueryResultXmlTransformer();

            XmlDocument = transformer.Transform(this._dataSource);
        }
        public XmlDocument Transform(QueryResultDataSource dataSource)
        {
            GroupDefinition      database      = dataSource.NodeDefinition.Group;
            MultyQueryResultInfo queriesResult = dataSource.QueriesResult;
            MsSqlAuditorModel    model         = dataSource.Model;

            if (queriesResult == null)
            {
                return(null);
            }

            try
            {
                DateTime    timestamp = queriesResult.Timestamp;
                XmlDocument xml       = new XmlDocument();

                xml.AppendChild(xml.CreateXmlDeclaration("1.0", "UTF-8", String.Empty));

                XmlElement rootNode = xml.CreateElement(Consts.ResultsTag);
                rootNode.SetAttribute(TimestampAttributeName, timestamp.ToInternetString());
                xml.AppendChild(rootNode);

                foreach (TemplateNodeResultItem tuple in queriesResult.List)
                {
                    TemplateNodeQueryInfo templateNodeQueryInfo = tuple.TemplateNodeQuery;
                    QueryResultInfo       queryResult           = tuple.QueryResult;

                    foreach (
                        KeyValuePair <InstanceInfo, QueryInstanceResultInfo> instancePair in queryResult.InstancesResult)
                    {
                        InstanceInfo instance = instancePair.Key;

                        QueryInstanceResultInfo queryInstanceResult = instancePair.Value;

                        if (queryInstanceResult.ErrorInfo == null)
                        {
                            try
                            {
                                QueryDatabaseResultInfo databaseResult = queryInstanceResult.DatabasesResult[database.Name];
                                int rowCount = 0;

                                if (databaseResult != null)
                                {
                                    rowCount = databaseResult.DataTables != null
                                                                                ? databaseResult.DataTables.Where(x => x != null).Select(x => x.Rows).Sum(x => x.Count)
                                                                                : 0;
                                }

                                GenerateResultDefinition(
                                    rootNode,
                                    templateNodeQueryInfo,
                                    databaseResult.ErrorInfo,
                                    instance,
                                    rowCount,
                                    (databaseResult.DataTables != null ? databaseResult.DataTables.Length : 0)
                                    );
                            }
                            catch (Exception ex)
                            {
                                log.Error("Error in 'Extracts data from queries and saves it to Xml-files'", ex);
                            }
                        }
                        else
                        {
                            GenerateResultDefinition(
                                rootNode,
                                templateNodeQueryInfo,
                                queryInstanceResult.ErrorInfo,
                                instance,
                                0,
                                0
                                );
                        }
                    }
                }

                foreach (TemplateNodeResultItem tuple in queriesResult.List)
                {
                    TemplateNodeQueryInfo templateNodeQueryInfo = tuple.TemplateNodeQuery;

                    if (templateNodeQueryInfo.GetType() != typeof(TemplateNodeSqlGuardQueryInfo))
                    {
                        model.GetQueryByTemplateNodeQueryInfo(templateNodeQueryInfo);
                    }

                    QueryResultInfo queryResult = tuple.QueryResult;

                    foreach (
                        KeyValuePair <InstanceInfo, QueryInstanceResultInfo> instancePair in queryResult.InstancesResult)
                    {
                        InstanceInfo            instance            = instancePair.Key;
                        QueryInstanceResultInfo queryInstanceResult = instancePair.Value;

                        if (queryInstanceResult.ErrorInfo == null)
                        {
                            foreach (KeyValuePair <string, QueryDatabaseResultInfo> namedResult in queryInstanceResult.DatabasesResult)
                            {
                                if (namedResult.Key == database.Name)
                                {
                                    XmlNode parent = rootNode.ChildNodes.OfType <XmlNode>().FirstOrDefault(
                                        x =>
                                        (
                                            x.Attributes["instance"] != null &&
                                            x.Attributes["instance"].Value == instance.Name
                                        )
                                        &&
                                        (
                                            x.Attributes["name"] != null &&
                                            x.Attributes["name"].Value == templateNodeQueryInfo.QueryName
                                        )
                                        &&
                                        (
                                            x.Attributes["hierarchy"] != null &&
                                            x.Attributes["hierarchy"].Value == (templateNodeQueryInfo.ResultHierarchy ?? string.Empty)
                                        )
                                        );

                                    QueryDatabaseResultInfo databaseResult = namedResult.Value;

                                    if (databaseResult.DataTables != null)
                                    {
                                        Int64 recordSet = 1L;

                                        foreach (DataTable curTable in databaseResult.DataTables)
                                        {
                                            if (parent != null)
                                            {
                                                parent.InnerXml = parent.InnerXml +
                                                                  ProcessDataTableAsStringXml(curTable, recordSet);
                                            }

                                            recordSet++;
                                        }
                                    }

                                    if (databaseResult.QueryItem.ParentQuery.Scope == QueryScope.Database)
                                    {
                                        if (!string.IsNullOrEmpty(databaseResult.Database))
                                        {
                                            XmlAttribute attr = xml.CreateAttribute("database");
                                            attr.Value = databaseResult.Database;
                                            parent.Attributes.Append(attr);
                                        }

                                        if (!string.IsNullOrEmpty(databaseResult.DatabaseId))
                                        {
                                            XmlAttribute attr = xml.CreateAttribute("databaseId");
                                            attr.Value = databaseResult.DatabaseId;
                                            parent.Attributes.Append(attr);
                                        }
                                    }
                                    else if (databaseResult.QueryItem.ParentQuery.Scope == QueryScope.InstanceGroup)
                                    {
                                        if (!string.IsNullOrEmpty(databaseResult.Database))
                                        {
                                            XmlAttribute attr = xml.CreateAttribute("InstanceGroupName");
                                            attr.Value = databaseResult.Database;
                                            parent.Attributes.Append(attr);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                return(xml);
            }
            catch (Exception ex)
            {
                log.Error("Error in 'Extracts data from queries and saves it to Xml-files'", ex);
            }

            return(null);
        }
		public XmlDocument Transform(QueryResultDataSource dataSource)
		{
			GroupDefinition      database      = dataSource.NodeDefinition.Group;
			MultyQueryResultInfo queriesResult = dataSource.QueriesResult;
			MsSqlAuditorModel    model         = dataSource.Model;

			if (queriesResult == null)
			{
				return null;
			}

			try
			{
				DateTime    timestamp = queriesResult.Timestamp;
				XmlDocument xml       = new XmlDocument();

				xml.AppendChild(xml.CreateXmlDeclaration("1.0", "UTF-8", String.Empty));

				XmlElement rootNode = xml.CreateElement(Consts.ResultsTag);
				rootNode.SetAttribute(TimestampAttributeName, timestamp.ToInternetString());
				xml.AppendChild(rootNode);

				foreach (TemplateNodeResultItem tuple in queriesResult.List)
				{
					TemplateNodeQueryInfo templateNodeQueryInfo = tuple.TemplateNodeQuery;
					QueryResultInfo       queryResult           = tuple.QueryResult;

					foreach (
						KeyValuePair<InstanceInfo, QueryInstanceResultInfo> instancePair in queryResult.InstancesResult)
					{
						InstanceInfo instance = instancePair.Key;

						QueryInstanceResultInfo queryInstanceResult = instancePair.Value;

						if (queryInstanceResult.ErrorInfo == null)
						{
							try
							{
								QueryDatabaseResultInfo databaseResult = queryInstanceResult.DatabasesResult[database.Name];
								int                     rowCount       = 0;

								if (databaseResult != null)
								{
									rowCount = databaseResult.DataTables != null
										? databaseResult.DataTables.Where(x => x != null).Select(x => x.Rows).Sum(x => x.Count)
										: 0;
								}

								GenerateResultDefinition(
									rootNode,
									templateNodeQueryInfo,
									databaseResult.ErrorInfo,
									instance,
									rowCount,
									(databaseResult.DataTables != null ? databaseResult.DataTables.Length : 0)
								);
							}
							catch (Exception ex)
							{
								log.Error("Error in 'Extracts data from queries and saves it to Xml-files'", ex);
							}
						}
						else
						{
							GenerateResultDefinition(
								rootNode,
								templateNodeQueryInfo,
								queryInstanceResult.ErrorInfo,
								instance,
								0,
								0
							);
						}
					}
				}

				foreach (TemplateNodeResultItem tuple in queriesResult.List)
				{
					TemplateNodeQueryInfo templateNodeQueryInfo = tuple.TemplateNodeQuery;

					if (templateNodeQueryInfo.GetType() != typeof(TemplateNodeSqlGuardQueryInfo))
					{
						model.GetQueryByTemplateNodeQueryInfo(templateNodeQueryInfo);
					}

					QueryResultInfo queryResult = tuple.QueryResult;

					foreach (
						KeyValuePair<InstanceInfo, QueryInstanceResultInfo> instancePair in queryResult.InstancesResult)
					{
						InstanceInfo            instance            = instancePair.Key;
						QueryInstanceResultInfo queryInstanceResult = instancePair.Value;

						if (queryInstanceResult.ErrorInfo == null)
						{
							foreach (KeyValuePair<string, QueryDatabaseResultInfo> namedResult in queryInstanceResult.DatabasesResult)
							{
								if (namedResult.Key == database.Name)
								{
									XmlNode parent = rootNode.ChildNodes.OfType<XmlNode>().FirstOrDefault(
										x =>
										(
											x.Attributes["instance"]        != null &&
											x.Attributes["instance"].Value  == instance.Name
										)
										&&
										(
											x.Attributes["name"]       != null &&
											x.Attributes["name"].Value == templateNodeQueryInfo.QueryName
										)
										&&
										(
											x.Attributes["hierarchy"]      != null &&
											x.Attributes["hierarchy"].Value == (templateNodeQueryInfo.ResultHierarchy ?? string.Empty)
										)
									);

									QueryDatabaseResultInfo databaseResult = namedResult.Value;

									if (databaseResult.DataTables != null)
									{
										Int64 recordSet = 1L;

										foreach (DataTable curTable in databaseResult.DataTables)
										{
											if (parent != null)
											{
												parent.InnerXml = parent.InnerXml +
													ProcessDataTableAsStringXml(curTable, recordSet);
											}

											recordSet++;
										}
									}

									if (databaseResult.QueryItem.ParentQuery.Scope == QueryScope.Database)
									{
										if (!string.IsNullOrEmpty(databaseResult.Database))
										{
											XmlAttribute attr = xml.CreateAttribute("database");
											attr.Value = databaseResult.Database;
											parent.Attributes.Append(attr);
										}

										if (!string.IsNullOrEmpty(databaseResult.DatabaseId))
										{
											XmlAttribute attr = xml.CreateAttribute("databaseId");
											attr.Value = databaseResult.DatabaseId;
											parent.Attributes.Append(attr);
										}
									}
									else if (databaseResult.QueryItem.ParentQuery.Scope == QueryScope.InstanceGroup)
									{
										if (!string.IsNullOrEmpty(databaseResult.Database))
										{
											XmlAttribute attr = xml.CreateAttribute("InstanceGroupName");
											attr.Value = databaseResult.Database;
											parent.Attributes.Append(attr);
										}
									}
								}
							}
						}
					}
				}

				return xml;
			}
			catch (Exception ex)
			{
				log.Error("Error in 'Extracts data from queries and saves it to Xml-files'", ex);
			}

			return null;
		}