示例#1
0
		/// <summary>
		/// Default constructor
		/// </summary>
		/// <param name="date">DateTime of error</param>
		/// <param name="instance">Server instance of error</param>
		/// <param name="queryItem">Query</param>
		/// <param name="error">Thrown exception</param>
		public ErrorLogItem(DateTime date, InstanceInfo instance, QueryItemInfo queryItem, Exception error)
		{
			this._date      = date;
			this._instance  = instance;
			this._queryItem = queryItem;
			this._error     = error;
		}
示例#2
0
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="date">DateTime of error</param>
 /// <param name="instance">Server instance of error</param>
 /// <param name="queryItem">Query</param>
 /// <param name="error">Thrown exception</param>
 public ErrorLogItem(DateTime date, InstanceInfo instance, QueryItemInfo queryItem, Exception error)
 {
     this._date      = date;
     this._instance  = instance;
     this._queryItem = queryItem;
     this._error     = error;
 }
        /// <summary>
        /// The prepare.
        /// </summary>
        /// <param name="queryItem">
        /// The query item.
        /// </param>
        public void PrepareIfNeeds(QueryItemInfo queryItem)
        {
            if (!this.PreparationNeeded(queryItem))
            {
                return;
            }

            this.logger.WriteToLog("Вставка дополнительного SQL");

            var additionalSql = this.settings.AdditionalSql.Replace("\r\n", string.Empty);
            if (!additionalSql.EndsWith(";"))
            {
                additionalSql += ";";
            }

            queryItem.Text = additionalSql + queryItem.Text;

            this.logger.WriteToLog("SQL вставлен");
        }
		/// <summary>
		/// The sign query item.
		/// </summary>
		/// <param name="cryptoProcessor">The crypto processor.</param>
		/// <param name="itemInfo">The item info.</param>
		/// <param name="query">The query.</param>
		private void SignQueryItem(CryptoProcessor cryptoProcessor, QueryItemInfo itemInfo, QueryInfo query)
		{
			this._logger.WriteToLog("prepare to sign the query....");

			itemInfo.ParentQuery = query;
			new QueryPreparator(this.Settings, this._logger).PrepareIfNeeds(itemInfo);

			this._logger.WriteToLog("Sign query....");

			itemInfo.Signature = cryptoProcessor.Sign(itemInfo.Text);
		}
 /// <summary>
 ///     The preparation nedeed.
 /// </summary>
 /// <returns>
 ///     The <see cref="bool" />.
 /// </returns>
 private bool PreparationNeeded(QueryItemInfo queryItem)
 {
     return (queryItem.ParentQuery.Source == QuerySource.MSSQL || queryItem.ParentQuery.Source == QuerySource.TDSQL) // #187
         && !string.IsNullOrEmpty(this.settings.AdditionalSql);
 }
		internal DataTable[] ExecuteSql(
			InstanceInfo                    instance,
			QueryItemInfo                   sql,
			IEnumerable<QueryParameterInfo> parameters = null,
			IEnumerable<ParameterValue>     parameterValues = null
		)
		{
			bool shouldExecute = true;

			if (sql == null)
			{
				throw new Exception("There is no sql statement to execute (QueryItemInfo == null).");
			}

			// Log.InfoFormat("instance:'{0}';sql.Text:'{1}'",
			// 	instance,
			// 	sql.Text
			// );

			if (sql.ExecuteIfSqlText != null)
			{
				var clone = sql.Clone();

				clone.ExecuteIfSqlText = null;
				clone.Text             = sql.ExecuteIfSqlText;

				DataTable[] tt = ExecuteSql(
					instance,
					clone,
					parameters,
					parameterValues
				);

				if (tt.Length > 0 && tt[0].Rows.Count > 0)
				{
					shouldExecute = (int)(tt[0].Rows[0][0]) == 1;
				}
			}

			if (shouldExecute)
			{
				return this.CurrentStorage.ExecuteSql(
					sql.Text,
					parameters,
					parameterValues,
					instance
				);
			}

			return new DataTable[0];
		}
		private void SaveHistoryData(
			QueryInfo             query,
			InstanceInfo          instance,
			long                  queryId,
			TemplateNodeQueryInfo templateNodeQuery
		)
		{
			QueryInfo queryInfo            = new QueryInfo { Source = QuerySource.SQLite };
			Regex     regex                = new Regex(@"\[\$\{(?<QueryName>[\w]+)\}\$_\$\{(?<RecordSetNumber>[\w]+)\}\$\]");
			string    strQueryName         = String.Empty;
			Int64     intRecordSetNumber   = 0L;
			string    strReplacedTableName = String.Empty;

			if (query.FillStatementList == null)
			{
				return;
			}

			List<HistoryFillStatement> list = query.FillStatementList.GetSortedStatements();

			List<QueryParameterInfo> parameters = new List<QueryParameterInfo>
			{
				new QueryParameterInfo
				{
					Name = _QueryIdParameterName,
					Type = SqlDbType.BigInt
				}
			};

			List<ParameterValue> paramterValues = new List<ParameterValue>
			{
				new ParameterValue
				{
					Name        = _QueryIdParameterName,
					StringValue = queryId.ToString()
				}
			};

			// string newTableName = String.Format("[{0}]",
			//    this.GetTableName(templateNodeQuery, recordSet) ?? "_unknown_table_"
			// );

			// string oldTableName = "[${" + query.Name + "}$_${" + recordSet + "}$]";

			// string oldTableName = String.Format("[${{{0}}}$_${{{1}}}$]",
			//   query.Name ?? "_unknown_table_",
			//   recordSet
			//);

			// Log.DebugFormat("oldTableName:'{0}',newTableName:'{1}'",
			//    oldTableName,
			//    newTableName
			//);

			foreach (HistoryFillStatement statement in list)
			{
				QueryItemInfo queryItem = new QueryItemInfo();

				queryItem.ParentQuery = queryInfo;
				queryItem.Text        = statement.Text;

				// queryItem.Text        = statement.Text.Replace(oldTableName, newTableName);

				// Regex regex = new Regex("[\$\{([\w]+)\}\$_\$\{([\w]+)\}\$]");

				// Log.InfoFormat("regex:'{0}'",
				//    regex
				// );

				var results = regex.Matches(statement.Text);

				foreach (Match match in results)
				{
					// Log.InfoFormat("match:'{0}';match.Value:'{1}'",
					// 	match,
					// 	match.Value
					// );

					strQueryName       = match.Groups["QueryName"].Value;
					intRecordSetNumber = Int64.Parse(match.Groups["RecordSetNumber"].Value);

					// Log.InfoFormat("strQueryName:'{0}';intRecordSetNumber:'{1}'",
					//    strQueryName,
					//    intRecordSetNumber
					// );

					if (String.Equals(strQueryName, query.Name, StringComparison.OrdinalIgnoreCase))
					{
						// Log.InfoFormat("matches:strQueryName:'{0}';query.Name:'{1}'",
						//    strQueryName,
						//    query.Name
						// );

						strReplacedTableName = string.Format(
							"[{0}]",
							this.GetTableName(
								templateNodeQuery,
								intRecordSetNumber
							)
						);

						// Log.InfoFormat("strReplacedTableName:'{0}'",
						//    strReplacedTableName
						// );

						// Log.InfoFormat("queryItem.Text:'{0}'",
						//    queryItem.Text
						// );

						queryItem.Text = queryItem.Text.Replace(
							match.Value,
							strReplacedTableName
						);

						// Log.InfoFormat("queryItem.Text:'{0}'",
						//    queryItem.Text
						// );
					}
				}

				this.ExecuteSql(
					instance,
					queryItem,
					parameters,
					paramterValues
				);
			}
		}
示例#8
0
        /// <summary>
        /// Load queries with signature check
        /// </summary>
        /// <param name="filename">Xml-file name</param>
        /// <param name="isExternal">Is opened from user file template</param>
        /// <returns>Queries list</returns>
        public List <QueryInfo> LoadQueries(string filename, bool isExternal)
        {
            log.InfoFormat("filename:'{0}',isExternal:'{1}'",
                           filename ?? "<null>",
                           isExternal
                           );

            List <string>   wrongQueries    = new List <string>();
            CryptoProcessor cryptoProcessor = null;

            try
            {
                if (AppVersionHelper.IsNotDebug())
                {
                    cryptoProcessor = new CryptoProcessor(
                        Settings.SystemSettings.PublicKeyXmlSign,
                        Settings.SystemSettings.PrivateKeyXmlDecrypt
                        );
                }
            }
            catch (System.Security.XmlSyntaxException ex)
            {
                log.Error(ex);
            }
            catch (Exception ex)
            {
                log.Error(ex);
                log.Error(ex.GetBaseException());
            }

            List <QueryInfo> queries = QueriesLoader.LoadFromXml(filename, cryptoProcessor, isExternal);

            for (int i = queries.Count - 1; i >= 0; i--)
            {
                QueryInfo query = queries[i];

                log.InfoFormat("query:'{0}'", query);

                if (AppVersionHelper.IsNotDebug() && !isExternal)
                {
                    for (int j = query.DatabaseSelect.Count - 1; j >= 0; j--)
                    {
                        QueryItemInfo queryItem = query.DatabaseSelect[j];

                        if (cryptoProcessor != null && !cryptoProcessor.Verify(queryItem.Text, queryItem.Signature))
                        {
                            if (!wrongQueries.Contains(query.Name))
                            {
                                wrongQueries.Add(query.Name);
                            }

                            query.DatabaseSelect.RemoveAt(j);
                        }
                    }

                    for (int j = query.Items.Count - 1; j >= 0; j--)
                    {
                        QueryItemInfo queryItem = query.Items[j];

                        log.InfoFormat("queryItem.Text:'{0}'", queryItem.Text);

                        if (cryptoProcessor != null && !cryptoProcessor.Verify(queryItem.Text, queryItem.Signature))
                        {
                            if (!wrongQueries.Contains(query.Name))
                            {
                                wrongQueries.Add(query.Name);
                            }

                            query.Items.RemoveAt(j);
                        }
                    }
                }

                if (query.Items.Count == 0)
                {
                    queries.RemoveAt(i);
                }
            }

            if ((Settings.WarnAboutUnsignedQuery) && (wrongQueries.Count > 0))
            {
                StringBuilder sb = new StringBuilder();

                sb.Append(filename + Environment.NewLine + Environment.NewLine);

                foreach (string wrongQuery in wrongQueries)
                {
                    sb.Append(wrongQuery + Environment.NewLine);
                }

                MessageBox.Show(sb.ToString(), LocaleManager.GetLocalizedText(LocaleManager.Exceptions, "wrongQueriesSignatures"));
            }

            return(queries);
        }
		internal DataTable[] ExecuteSql(
			InstanceInfo                    instance,
			QueryItemInfo                   sql,
			string                          database = null,
			IEnumerable<QueryParameterInfo> parameters = null,
			IEnumerable<ParameterValue>     parameterValues = null,
			ProgressItem                    progress = null,
			bool                            fromGroupSelect = false
		)
		{
			Exception       gotException    = null;
			List<DataTable> tables          = new List<DataTable>();

			this._cancellationToken.ThrowIfCancellationRequested();

			try
			{
				if (sql == null)
				{
					throw new Exception("There is no sql statement to execute (QueryItemInfo == null).");
				}

				List<Tuple<int, string>> parametersQueueForODBC;

				using (IQueryConnection connection = _queryConnectionFactory.CreateQueryConnection(sql.ParentQuery.Source, instance))
				{
					using (IQueryCommand sqlCommand = connection.GetCommand(sql.Text, this._model.Settings.SqlTimeout, parameters, out parametersQueueForODBC))
					{
						using (new TryFinally(connection.Open, connection.Close))
						{
							connection.ChangeDatabase(database);

							var shouldExecute = true;

							if (sql.ExecuteIfSqlText != null)
							{
								var clone = sql.Clone();

								clone.ExecuteIfSqlText = null;
								clone.Text             = sql.ExecuteIfSqlText;

								DataTable[] tt = ExecuteSql(
									instance,
									clone,
									database,
									parameters,
									parameterValues,
									progress,
									fromGroupSelect
								);

								if (tt.Length > 0 && tt[0].Rows.Count > 0)
								{
									shouldExecute = (int)(tt[0].Rows[0][0]) == 1;
								}
							}

							if (shouldExecute)
							{
								var executionFinishedEvent = new AutoResetEvent(false);

								IQueryCommand command = null;

								Action<IAsyncResult> handleCallback = result =>
								{
									command = (IQueryCommand)result.AsyncState;

									try
									{
										using (var reader = command.EndExecuteReader(result))
										{
											while (!reader.IsClosed)
											{
												DataTable table = new DataTable();

												table.Load(reader, LoadOption.OverwriteChanges, ExecuteSqlFillErrorHandler);
												tables.Add(table);
											}
										}
									}
									catch (Exception ex)
									{
										log.Error(ex);

										gotException = ex;

										if (fromGroupSelect)
										{
											log.ErrorFormat(
												"Instance:'{0}';Authentication:'{1}';SQL:'{2}';Exception:'{3}'",
												instance.Instance,
												instance.Authentication,
												sql,
												ex
											);
										}
									}
									finally
									{
										if (command != null)
										{
											command.Cancel();
										}

										executionFinishedEvent.Set();
									}
								};

								sqlCommand.AssignParameters(parameters, parameterValues, parametersQueueForODBC);
								var callback = new AsyncCallback(handleCallback);
								var asyncResult = sqlCommand.BeginExecuteReader(callback);

								if (WaitHandle.WaitAny(new[] { asyncResult.AsyncWaitHandle, this._cancellationToken.WaitHandle }) == 1)
								{
									if (command != null)
									{
										command.Cancel();
									}

									this._cancellationToken.ThrowIfCancellationRequested();
								}

								executionFinishedEvent.WaitOne();
							}
						}
					}
				}
			}
			catch (Exception ex)
			{
				log.Error(ex);

				if (gotException == null)
				{
					gotException = ex;

					if (fromGroupSelect)
					{
						log.ErrorFormat(
							"Instance:'{0}';Authentication:'{1}';Exception:'{2}'",
							instance.Instance,
							instance.Authentication,
							ex
						);
					}
				}
			}
			finally
			{
				if (progress != null)
				{
					progress.SetProgressDone();
				}
			}

			if (gotException != null)
			{
				if (!fromGroupSelect)
				{
					gotException.Data.Add("IgnoreLog", true);
				}

				throw gotException;
			}

			return tables.ToArray();
		}
示例#10
0
		private QueryDatabaseResultInfo ExecuteQueryItem(
			InstanceInfo                    connection,
			QueryItemInfo                   queryItem,
			string                          database,
			string                          databaseId,
			IEnumerable<QueryParameterInfo> parameters,
			IEnumerable<ParameterValue>     parameterValues,
			ProgressItem                    progress = null
		)
		{
			try
			{
				var table = ExecuteSql(
					connection,
					queryItem,
					database,
					parameters,
					parameterValues,
					progress
				);

				return new QueryDatabaseResultInfo(table, queryItem, database, databaseId);
			}
			catch (OperationCanceledException ex)
			{
				return new QueryDatabaseResultInfo(new ErrorInfo(ex), queryItem, database, databaseId);
			}
			catch (Exception ex)
			{
				log.Error(ex);

				if (!ex.Data.Contains("IgnoreLog"))
				{
					log.Error(queryItem.ToString() + Environment.NewLine
						+ "connection.Instance=" + connection.Instance +
						Environment.NewLine
						+ " database=" + database + Environment.NewLine
						+ " connection.Authentication.Username=" +
						connection.Authentication.Username, ex);
				}

				if (progress != null)
				{
					progress.SetProgress(100);
				}

				return new QueryDatabaseResultInfo(new ErrorInfo(ex), queryItem, database, databaseId);
			}
		}
示例#11
0
		public QueryInstanceResultInfo GetConnectionSelectResults(
			InstanceInfo          selectConnectionInstance,
			QueryInfo             queryInfo,
			QueryItemInfo         queryItem,
			TemplateNodeQueryInfo query
		)
		{
			QueryDatabaseResultInfo dbResultInfo;

			try
			{
				DataTable[] tables = ExecuteSql(
					selectConnectionInstance,
					queryItem,
					query.TemplateNode.GetDefaultDatabase(),
					queryInfo.Parameters,
					query.ParameterValues
				);

				if (tables != null && tables.Length < 0)
				{
					throw new InvalidTemplateException(query + " returned no recordsets.");
				}

				dbResultInfo = new QueryDatabaseResultInfo(tables, queryItem);
			}
			catch (Exception exc)
			{
				ErrorInfo error = new ErrorInfo(exc);

				dbResultInfo = new QueryDatabaseResultInfo(error, queryItem);
			}

			QueryInstanceResultInfo instanceResultInfo = new QueryInstanceResultInfo(selectConnectionInstance);

			instanceResultInfo.AddDatabaseResult(dbResultInfo);

			return instanceResultInfo;
		}
示例#12
0
		/// <summary>
		/// Constructor for thrown exception
		/// </summary>
		/// <param name="errorInfo">Error info</param>
		/// <param name="queryItem">Query item</param>
		/// <param name="databaseId">Database name (null for instance scope)</param>
		public QueryDatabaseResultInfo(ErrorInfo errorInfo, QueryItemInfo queryItem, string database = "", string databaseId = "")
		{
			this.QueryItem   = queryItem;
			this._errorInfo  = errorInfo;
			this._database   = database;
			this._databaseId = databaseId;
		}
示例#13
0
		/// <summary>
		/// Default constructor
		/// </summary>
		/// <param name="dataTable">Result datatable</param>
		/// <param name="queryItem">Query item</param>
		/// <param name="database">Database name (null for instance scope)</param>
		/// <param name="databaseId">Database Id</param>
		public QueryDatabaseResultInfo(DataTable[] dataTable, QueryItemInfo queryItem, string database = "", string databaseId = "")
		{
			this.QueryItem   = queryItem;
			this._dataTables = dataTable;
			this._database   = database;
			this._databaseId = databaseId;
		}
		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);
		}