Пример #1
0
        private void ProcessCodeGuardQuery(
            MultyQueryResultInfo result,
            TemplateNodeSqlGuardQueryInfo guardQueryInfo)
        {
            var queryResultInfo       = result.List.First(item => item.TemplateNodeQuery.Id == guardQueryInfo.SqlQueryId);
            var templateNodeQueryInfo = queryResultInfo.TemplateNodeQuery;
            var userParams            = new List <ParameterValue>();

            if (base.Settings != null)
            {
                var querySettings = base.Settings.Connection.Activity.Parameters
                                    .Where(i => i.Key == guardQueryInfo.IdsHierarchy && i.Value != null);

                foreach (var info in querySettings)
                {
                    switch (info.Type)
                    {
                    case ParameterInfoType.Attribute:
                        guardQueryInfo.GetType().GetProperty("User" + info.Parameter)
                        .SetValue(guardQueryInfo, info.Value, null);
                        break;

                    case ParameterInfoType.Parameter:
                        var parameter =
                            templateNodeQueryInfo.ParameterValues.FirstOrDefault(p => p.Name == info.Parameter);
                        if (parameter != null)
                        {
                            parameter.UserValue = info.Value;
                        }
                        break;

                    case ParameterInfoType.EditableParameter:
                        var editparameter = new ParameterValue
                        {
                            Name        = info.Parameter,
                            StringValue = info.Default,
                            UserValue   = info.Value
                        };
                        userParams.Add(editparameter);
                        break;
                    }
                }
            }

            var guardQueryResult = new QueryResultInfo();

            foreach (var instanceResult in queryResultInfo.QueryResult.InstancesResult)
            {
                var instance   = instanceResult.Key;
                var queryTable = instanceResult.Value.DatabasesResult.First().Value.DataTables.First();

                if (!queryTable.Columns.Contains(guardQueryInfo.QueryCodeColumn))
                {
                    continue;
                }

                //var meta = ReadMeta(connectionGroup, templateNode, instance, database, templateNodeQueryInfo).FirstOrDefault();
                var meta = Storage.ReadLastMeta(
                    base.TemplateNode,
                    instance,
                    templateNodeQueryInfo
                    );

                if (meta == null)
                {
                    continue;
                }

                QueryInstanceResultInfo guardInstanceResult;
                var timestamp = (DateTime)meta.Values[TableDefinition.DateCreated];

                result.RefreshTimestamp(timestamp);

                if (!string.IsNullOrEmpty(meta.Values[MetaResultTable.ErrorMessageFieldName].ToString()))
                {
                    guardInstanceResult = new QueryInstanceResultInfo(
                        new ErrorInfo(
                            meta.Values[MetaResultTable.ErrorIdFieldName].ToString(),
                            meta.Values[MetaResultTable.ErrorCodeFieldName].ToString(),
                            meta.Values[MetaResultTable.ErrorMessageFieldName].ToString(),
                            timestamp
                            ),
                        instance
                        );
                }
                else
                {
                    guardInstanceResult = new QueryInstanceResultInfo(instance);
                }

                var dataTables = Storage.ReadSqlCodeGuardResult(guardQueryInfo, queryTable, userParams);

                QueryItemInfo queryItemInfo = new QueryItemInfo
                {
                    ParentQuery = new QueryInfo {
                        Name = guardQueryInfo.QueryName
                    }
                };

                QueryDatabaseResultInfo databaseResult = new QueryDatabaseResultInfo(
                    dataTables,
                    queryItemInfo,
                    base.GroupDefinition.Name,
                    base.GroupDefinition.Id
                    );

                guardInstanceResult.AddDatabaseResult(databaseResult);
                guardQueryResult.AddInstanceResult(guardInstanceResult);
            }

            var templateNodeResultItem = new TemplateNodeResultItem(guardQueryInfo, guardQueryResult);

            result.Add(templateNodeResultItem);
        }
        public DataTable[] ReadSqlCodeGuardResult(
            TemplateNodeSqlGuardQueryInfo guardQueryInfo,
            DataTable queryTable,
            List <ParameterValue> userParams
            )
        {
            var analyzer     = new CodeGuardAnalyzer();
            var summaryTable = new DataTable();

            summaryTable.Columns.Add("SCGObject");
            summaryTable.Columns.Add("SCGErrorRows");

            foreach (var parameterValue in guardQueryInfo.ParameterValues)
            {
                summaryTable.Columns.Add(parameterValue.Name);
            }

            foreach (var parameterValue in userParams)
            {
                summaryTable.Columns.Add(parameterValue.Name);
            }

            var table = new DataTable();

            // 25/08/2014 Aleksey A. Saychenko - object code is not required
            // table.Columns.Add("SCGObject");

            table.Columns.Add("SCGErrorCode");
            table.Columns.Add("SCGRow");
            table.Columns.Add("SCGColumn");
            table.Columns.Add("SCGMessage");

            foreach (var parameterValue in guardQueryInfo.ParameterValues)
            {
                table.Columns.Add(parameterValue.Name);
            }

            foreach (var parameterValue in userParams)
            {
                table.Columns.Add(parameterValue.Name);
            }

            foreach (DataRow row in queryTable.Rows)
            {
                var sqlcode = row[guardQueryInfo.GetQueryCodeColumn()].ToString();
                var result  = analyzer.ProcessSqlQuery(
                    sqlcode,
                    guardQueryInfo.GetIncludedIssue(),
                    guardQueryInfo.GetExcludedIssue()
                    );
                var errorRows  = new StringBuilder();
                var statements = result.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

                foreach (var statement in statements)
                {
                    var newRow = table.NewRow();

                    // 25/08/2014 Aleksey A. Saychenko
                    // newRow["SCGObject"] = row[guardQueryInfo.GetQueryCodeColumn()];

                    var start = statement.IndexOf("(", StringComparison.Ordinal);
                    var end   = start < 0 ? 0 : statement.IndexOf(")", start, StringComparison.Ordinal);

                    if (start > -1 && end > 0)
                    {
                        newRow["SCGErrorCode"] = statement.Substring(start + 1, end - 1);
                    }

                    newRow["SCGMessage"] = statement.Substring(end + 1);
                    var position = Regex.Match(statement, "([0-9])+:([0-9])+").Value.Split(':');
                    newRow["SCGRow"]    = position[1];
                    newRow["SCGColumn"] = position[0];
                    errorRows.AppendFormat(",{0}", position[1]);

                    foreach (var parameterValue in guardQueryInfo.ParameterValues)
                    {
                        newRow[parameterValue.Name] = row[parameterValue.StringValue ?? parameterValue.UserValue];
                    }

                    foreach (var parameterValue in userParams)
                    {
                        newRow[parameterValue.Name] = row[parameterValue.StringValue ?? parameterValue.UserValue];
                    }

                    table.Rows.Add(newRow);
                }

                if (!guardQueryInfo.GetAddSummary())
                {
                    continue;
                }

                var newSummaryRow = summaryTable.NewRow();

                newSummaryRow["SCGObject"]    = row[guardQueryInfo.GetObjectColumn()];
                newSummaryRow["SCGErrorRows"] = errorRows.Length > 0 ? errorRows.Remove(0, 1).ToString() : String.Empty;

                summaryTable.Rows.Add(newSummaryRow);
            }

            if (!guardQueryInfo.GetAddSummary())
            {
                return(new[] { table });
            }

            return(new[] { table, summaryTable });
        }