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 }; }
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); }