Ejemplo n.º 1
0
		public async Task ExplainAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
		{
			ResetView();

			var itemCollection = await ((OracleConnectionAdapterBase)_outputViewer.ConnectionAdapter).ExplainPlanAsync(executionModel, cancellationToken);
			if (itemCollection != null)
			{
				SetRootItem(itemCollection.RootItem);
				TabTreeView.IsSelected = true;
			}
		}
Ejemplo n.º 2
0
        public override Task <ExecutionPlanItemCollection> ExplainPlanAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
        {
            var rootItem = new ExecutionPlanItem();

            SetBasePlanItemData(rootItem);

            var planItemCollection = new ExecutionPlanItemCollection();

            planItemCollection.Add(rootItem);
            planItemCollection.SetAllItems();

            return(Task.FromResult(planItemCollection));
        }
Ejemplo n.º 3
0
        public async Task ExplainAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
        {
            ResetView();

            ExecutionPlanItemCollection itemCollection;

            _planItemCollection = itemCollection = await((OracleConnectionAdapterBase)_outputViewer.ConnectionAdapter).ExplainPlanAsync(executionModel, cancellationToken);
            if (itemCollection != null)
            {
                ConfigureExecutionPlanItemVisibility();
                SetRootItem(itemCollection.RootItem);
                TabTreeView.IsSelected = true;
            }
        }
Ejemplo n.º 4
0
 private static StatementExecutionResult BuildStatementExecutionResult(StatementExecutionModel statement)
 {
     return
         (new StatementExecutionResult
     {
         StatementModel = statement,
         ExecutedAt = DateTime.Now,
         Duration = TimeSpan.FromMilliseconds(1),
         Exception = null,
         SuccessfulExecutionMessage = OracleStatement.DefaultMessageCommandExecutedSuccessfully,
         CompilationErrors =
             new[]
         {
             new CompilationError {
                 Code = 942, Column = 999, Line = 999, Message = "table or view does not exist", ObjectName = "TEST_OBJECT", ObjectType = "TEST_TYPE", Severity = "WARNING", Statement = statement.Statement
             }
         },
         ResultInfoColumnHeaders =
             new Dictionary <ResultInfo, IReadOnlyList <ColumnHeader> >
         {
             { new ResultInfo(null, "Test result set", ResultIdentifierType.UserDefined), ColumnHeaders }
         }
     });
 }
Ejemplo n.º 5
0
			public void TestCSharpQueryClassGenerator()
			{
				var intType = new BindVariableType("INT", typeof(int), false);
				var varcharType = new BindVariableType("VARCHAR", typeof(string), false);

				var dataTypes =
					new Dictionary<string, BindVariableType>
					{
						{ intType.Name, intType },
						{ varcharType.Name, varcharType }
					};

				var readOnlyDataTypes = new ReadOnlyDictionary<string, BindVariableType>(dataTypes);

				var columnHeaders =
					new[]
					{
						new ColumnHeader { ColumnIndex = 0, Name = "TestColumn1", DataType = typeof (int) },
						new ColumnHeader { ColumnIndex = 1, Name = "TestColumn2", DataType = typeof (string) }
					};

				var statementModel =
					new StatementExecutionModel
					{
						StatementText = "SELECT @testBindVariable1 TestColumn1, @testBindVariable2 TestColumn2",
						BindVariables =
							new[]
							{
								new BindVariableModel(new BindVariableConfiguration { Name = "testBindVariable1", DataType = intType.Name, DataTypes = readOnlyDataTypes }),
								new BindVariableModel(new BindVariableConfiguration { Name = "testBindVariable2", DataType = varcharType.Name, DataTypes = readOnlyDataTypes })
							}
					};

				var builder = new StringBuilder();
				using (var writer = new StringWriter(builder))
				{
					CSharpQueryClassGenerator.Generate(statementModel, columnHeaders, writer);
				}

				var result = builder.ToString();

				const string expectedResult =
@"using System;
using System.Data;

public class Query
{
	private readonly IDbConnection _connection;

	private const string CommandText =
@""SELECT @testBindVariable1 TestColumn1, @testBindVariable2 TestColumn2"";

	public Query(IDbConnection connection)
	{
		_connection = connection;
	}

	public IEnumerable<ResultRow> Execute(Int32 testBindVariable1, String testBindVariable2)
	{
		using (var command = _connection.CreateCommand())
		{
			command.CommandText = CommandText;
			
			var parametertestBindVariable1 = command.CreateParameter();
			parametertestBindVariable1.Value = testBindVariable1;
			command.Parameters.Add(parametertestBindVariable1);

			var parametertestBindVariable2 = command.CreateParameter();
			parametertestBindVariable2.Value = testBindVariable2;
			command.Parameters.Add(parametertestBindVariable2);

			_connection.Open();

			using (var reader = command.ExecuteReader())
			{
				while (reader.Read())
				{
					var row =
						new ResultRow
						{
							TestColumn1 = GetReaderValue<Int32?>(reader[nameof(ResultRow.TestColumn1)]),
							TestColumn2 = GetReaderValue<String>(reader[nameof(ResultRow.TestColumn2)])
						};

					yield return row;
				}
			}

			_connection.Close();
		}
	}

	private static T GetReaderValue<T>(object value)
	{
		return value == DBNull.Value
			? default(T)
			: (T)value;
	}
}

public class ResultRow
{
	public Int32? TestColumn1 { get; set; }
	public String TestColumn2 { get; set; }
}
";
				result.ShouldBe(expectedResult);
			}
 public abstract Task <ExecutionPlanItemCollection> ExplainPlanAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken);
 public abstract Task <StatementExecutionResult> ExecuteChildStatementAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken);
Ejemplo n.º 8
0
		public override async Task<StatementExecutionResult> ExecuteChildStatementAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
		{
			var result = await ExecuteUserStatementAsync(new StatementBatchExecutionModel { Statements = new [] { executionModel } }, true, cancellationToken);
			return result.StatementResults[0];
		}
Ejemplo n.º 9
0
		public override async Task<ExecutionPlanItemCollection> ExplainPlanAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
		{
			var connectionName = _databaseModel.ConnectionString.Name;
			var targetTable = OracleConfiguration.Configuration.GetExplainPlanTargetTable(connectionName);
			if (String.IsNullOrEmpty(targetTable.Name))
			{
				throw new InvalidOperationException($"OracleConfiguration/Connections/Connection[@ConnectionName = '{connectionName}']/ExecutionPlan/TargetTable[Name] is missing. ");
			}

			var planKey = Convert.ToString(DateTime.UtcNow.Ticks);
			var explainPlanDataProvider = new ExplainPlanDataProvider(executionModel.StatementText, planKey, targetTable);

			_isExecuting = true;

			try
			{
				if (!HasActiveTransaction && _userTransaction != null)
				{
					await _userTransaction.RollbackAsynchronous();
					DisposeUserTransaction();
				}

				await EnsureUserConnectionOpen(cancellationToken);
				await OracleDatabaseModel.UpdateModelAsync(_userConnection, _currentSchema, false, cancellationToken, explainPlanDataProvider.CreateExplainPlanUpdater, explainPlanDataProvider.LoadExplainPlanUpdater);
			}
			finally
			{
				_isExecuting = false;
			}

			return explainPlanDataProvider.ItemCollection;
		}
Ejemplo n.º 10
0
		private IEnumerable<KeyValuePair<ResultInfo, IReadOnlyList<ColumnHeader>>> UpdateBindVariables(StatementExecutionModel executionModel, OracleCommand userCommand)
		{
			var bindVariableModels = executionModel.BindVariables.ToDictionary(v => v.Name, v => v);
			foreach (OracleParameter parameter in userCommand.Parameters)
			{
				var bindVariableModel = bindVariableModels[parameter.ParameterName];

				var value = parameter.Value;
				if (parameter.Value is OracleDecimal)
				{
					var oracleNumber = new OracleNumber((OracleDecimal)parameter.Value);
					value = oracleNumber.IsNull ? String.Empty : oracleNumber.ToSqlLiteral();
				}

				if (parameter.Value is OracleString)
				{
					var oracleString = (OracleString)parameter.Value;
					value = oracleString.IsNull ? String.Empty : oracleString.Value;
				}

				if (parameter.Value is OracleDate)
				{
					var oracleDate = (OracleDate)parameter.Value;
					value = oracleDate.IsNull ? (DateTime?)null : oracleDate.Value;
				}

				if (parameter.Value is OracleTimeStamp)
				{
					var oracleTimeStamp = (OracleTimeStamp)parameter.Value;
					value = oracleTimeStamp.IsNull ? (DateTime?)null : oracleTimeStamp.Value;
				}

				if (!bindVariableModel.IsFilePath)
				{
					if (parameter.Value is OracleBinary)
					{
						var oracleBinary = (OracleBinary)parameter.Value;
						value = oracleBinary.IsNull ? null : oracleBinary.Value.ToHexString();
					}

					var clob = parameter.Value as OracleClob;
					if (clob != null)
					{
						value = clob.IsNull ? String.Empty : clob.Value;
					}

					var blob = parameter.Value as OracleBlob;
					if (blob != null)
					{
						value = blob.IsNull ? null : blob.Value.ToHexString();
					}
				}

				var refCursor = parameter.Value as OracleRefCursor;
				if (refCursor != null)
				{
					if (refCursor.IsNull)
					{
						continue;
					}

					var refCursorInfo =
						new RefCursorInfo
						{
							CursorName = parameter.ParameterName,
							Parameter = parameter
						};

					yield return AcquireRefCursor(userCommand, refCursor, refCursorInfo);
				}
				else
				{
					if (!bindVariableModel.IsFilePath)
					{
						bindVariableModel.Value = value;
					}
				}
			}
		}
Ejemplo n.º 11
0
 public override Task <StatementExecutionResult> ExecuteChildStatementAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken)
 {
     return(Task.FromResult(BuildStatementExecutionResult(executionModel)));
 }
Ejemplo n.º 12
0
		private async Task ExecuteExplainPlanAsyncInternal(StatementExecutionModel executionModel)
		{
			InitializeCommon();

			var actionResult = await SafeTimedActionAsync(() => ExecutionPlanViewer.ExplainAsync(executionModel, _statementExecutionCancellationTokenSource.Token));

			if (_statementExecutionCancellationTokenSource.Token.IsCancellationRequested)
			{
				NotifyExecutionCanceled();
			}
			else
			{
				UpdateTimerMessage(actionResult.Elapsed, false);

				if (actionResult.IsSuccessful)
				{
					ShowExecutionPlan();
				}
				else
				{
					var errorMessage = Messages.GetExceptionErrorMessage(actionResult.Exception);
					AddExecutionLog(actionResult.ExecutedAt, $"Explain plain failed: {errorMessage}");
					Messages.ShowError(errorMessage);
				}
			}
		}
Ejemplo n.º 13
0
		public Task ExecuteExplainPlanAsync(StatementExecutionModel executionModel)
		{
			return ExecuteUsingCancellationToken(t => ExecuteExplainPlanAsyncInternal(executionModel));
		}
Ejemplo n.º 14
0
            public void TestCSharpQueryClassGenerator()
            {
                var intType     = new BindVariableType("INT", typeof(int), false);
                var varcharType = new BindVariableType("VARCHAR", typeof(string), false);

                var dataTypes =
                    new Dictionary <string, BindVariableType>
                {
                    { intType.Name, intType },
                    { varcharType.Name, varcharType }
                };

                var readOnlyDataTypes = new ReadOnlyDictionary <string, BindVariableType>(dataTypes);

                var columnHeaders =
                    new[]
                {
                    new ColumnHeader {
                        ColumnIndex = 0, Name = "TestColumn1", DataType = typeof(int)
                    },
                    new ColumnHeader {
                        ColumnIndex = 1, Name = "TestColumn2", DataType = typeof(string)
                    }
                };

                var statementModel =
                    new StatementExecutionModel
                {
                    StatementText = "SELECT @testBindVariable1 TestColumn1, @testBindVariable2 TestColumn2",
                    BindVariables =
                        new[]
                    {
                        new BindVariableModel(new BindVariableConfiguration {
                            Name = "testBindVariable1", DataType = intType.Name, DataTypes = readOnlyDataTypes
                        }),
                        new BindVariableModel(new BindVariableConfiguration {
                            Name = "testBindVariable2", DataType = varcharType.Name, DataTypes = readOnlyDataTypes
                        })
                    }
                };

                var builder = new StringBuilder();

                using (var writer = new StringWriter(builder))
                {
                    CSharpQueryClassGenerator.Generate(statementModel, columnHeaders, writer);
                }

                var result = builder.ToString();

                const string expectedResult =
                    @"using System;
using System.Data;

public class Query
{
	private readonly IDbConnection _connection;

	private const string CommandText =
@""SELECT @testBindVariable1 TestColumn1, @testBindVariable2 TestColumn2"";

	public Query(IDbConnection connection)
	{
		_connection = connection;
	}

	public IEnumerable<ResultRow> Execute(Int32 testBindVariable1, String testBindVariable2)
	{
		using (var command = _connection.CreateCommand())
		{
			command.CommandText = CommandText;
			
			var parametertestBindVariable1 = command.CreateParameter();
			parametertestBindVariable1.Value = testBindVariable1;
			command.Parameters.Add(parametertestBindVariable1);

			var parametertestBindVariable2 = command.CreateParameter();
			parametertestBindVariable2.Value = testBindVariable2;
			command.Parameters.Add(parametertestBindVariable2);

			_connection.Open();

			using (var reader = command.ExecuteReader())
			{
				while (reader.Read())
				{
					var row =
						new ResultRow
						{
							TestColumn1 = GetReaderValue<Int32?>(reader[nameof(ResultRow.TestColumn1)]),
							TestColumn2 = GetReaderValue<String>(reader[nameof(ResultRow.TestColumn2)])
						};

					yield return row;
				}
			}

			_connection.Close();
		}
	}

	private static T GetReaderValue<T>(object value)
	{
		return value == DBNull.Value
			? default(T)
			: (T)value;
	}
}

public class ResultRow
{
	public Int32? TestColumn1 { get; set; }
	public String TestColumn2 { get; set; }
}
";

                result.ShouldBe(expectedResult);
            }