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; } }
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)); }
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; } }
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 } } }); }
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);
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]; }
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; }
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; } } } }
public override Task <StatementExecutionResult> ExecuteChildStatementAsync(StatementExecutionModel executionModel, CancellationToken cancellationToken) { return(Task.FromResult(BuildStatementExecutionResult(executionModel))); }
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); } } }
public Task ExecuteExplainPlanAsync(StatementExecutionModel executionModel) { return ExecuteUsingCancellationToken(t => ExecuteExplainPlanAsyncInternal(executionModel)); }
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); }