private static DataGridResultViewer InitializeResultViewer() { var columnHeaders = new[] { new ColumnHeader { ColumnIndex = 0, DatabaseDataType = "Varchar2", DataType = typeof(string), Name = "DUMMY1" }, new ColumnHeader { ColumnIndex = 1, DatabaseDataType = "Date", DataType = typeof(DateTime), Name = "DUMMY_WITH_UNDERSCORES" }, //new ColumnHeader { ColumnIndex = 2, DatabaseDataType = "Varchar2", DataType = typeof (string), Name = "\"'\\\"><?,.;:{}[]%$#@!~^&*()_+-§'''||(1/2*3+4-CASEWHEN1<=2OR2>=1THEN5ELSE6END)" } }; var documentPage = new DocumentPage { CurrentConnection = ConfigurationProvider.ConnectionStrings[0] }; documentPage.DatabaseModel.Dispose(); var outputViewer = new OutputViewer(documentPage); var dataRows = new[] { new object[] { "Value \"1\" '2' <3>", new DateTime(2014, 8, 16, 22, 25, 34) }, new object[] { "\"2.\"Value", new DateTime(2014, 8, 16) }, //new object[] {"\"><?,.;:{}[]%$#@!~^&*()_+-§' ,5", new DateTime(2015, 5, 30) } }; var resultInfo = new ResultInfo(null, "Test result", ResultIdentifierType.UserDefined); var executionResult = new StatementExecutionResult { StatementModel = new StatementExecutionModel { StatementText = "SELECT * FROM DUAL" }, ResultInfoColumnHeaders = new Dictionary <ResultInfo, IReadOnlyList <ColumnHeader> > { { resultInfo, columnHeaders } } }; var resultViewer = new DataGridResultViewer(outputViewer, executionResult, resultInfo) { ResultGrid = { ItemsSource = dataRows } }; DataGridHelper.InitializeDataGridColumns(resultViewer.ResultGrid, columnHeaders, outputViewer.StatementValidator, outputViewer.ConnectionAdapter); return(resultViewer); }
public DataGridResultViewer(OutputViewer outputViewer, StatementExecutionResult executionResult, ResultInfo resultInfo) { _outputViewer = outputViewer; _executionResult = executionResult; _resultInfo = resultInfo; Title = resultInfo.Title; InitializeComponent(); var header = new HeaderedContentControl { Content = new AccessText { Text = Title } }; TabItem = new TabItem { Header = header, Content = this }; header.MouseEnter += DataGridTabHeaderMouseEnterHandler; _refreshProgressBarTimer = new DispatcherTimer(DispatcherPriority.Normal, Dispatcher) { Interval = TimeSpan.FromSeconds(0.25) }; _refreshProgressBarTimer.Tick += RefreshTimerProgressBarTickHandler; }
private static DataGridResultViewer InitializeResultViewer() { var columnHeaders = new[] { new ColumnHeader { ColumnIndex = 0, DatabaseDataType = "Varchar2", DataType = typeof (string), Name = "DUMMY1" }, new ColumnHeader { ColumnIndex = 1, DatabaseDataType = "Date", DataType = typeof (DateTime), Name = "DUMMY_WITH_UNDERSCORES" }, //new ColumnHeader { ColumnIndex = 2, DatabaseDataType = "Varchar2", DataType = typeof (string), Name = "\"'\\\"><?,.;:{}[]%$#@!~^&*()_+-§'''||(1/2*3+4-CASEWHEN1<=2OR2>=1THEN5ELSE6END)" } }; var documentPage = new DocumentPage { CurrentConnection = ConfigurationProvider.ConnectionStrings[0] }; documentPage.DatabaseModel.Dispose(); var outputViewer = new OutputViewer(documentPage); var dataRows = new[] { new object[] {"Value \"1\" '2' <3>", new DateTime(2014, 8, 16, 22, 25, 34)}, new object[] {"\"2.\"Value", new DateTime(2014, 8, 16)}, //new object[] {"\"><?,.;:{}[]%$#@!~^&*()_+-§' ,5", new DateTime(2015, 5, 30) } }; var resultInfo = new ResultInfo(null, "Test result", ResultIdentifierType.UserDefined); var executionResult = new StatementExecutionResult { StatementModel = new StatementExecutionModel { StatementText = "SELECT * FROM DUAL" }, ResultInfoColumnHeaders = new Dictionary<ResultInfo, IReadOnlyList<ColumnHeader>> { { resultInfo, columnHeaders } } }; var resultViewer = new DataGridResultViewer(outputViewer, executionResult, resultInfo) { ResultGrid = { ItemsSource = dataRows } }; DataGridHelper.InitializeDataGridColumns(resultViewer.ResultGrid, columnHeaders, outputViewer.StatementValidator, outputViewer.ConnectionAdapter); return resultViewer; }
public abstract Task RefreshResult(StatementExecutionResult result, CancellationToken cancellationToken);
private async Task<StatementExecutionBatchResult> ExecuteUserStatementAsync(StatementBatchExecutionModel batchExecutionModel, bool isReferenceConstraintNavigation, CancellationToken cancellationToken) { if (batchExecutionModel.Statements == null || batchExecutionModel.Statements.Count == 0) { throw new ArgumentException("An execution batch must contain at least one statement. ", nameof(batchExecutionModel)); } _isExecuting = true; _userCommandHasCompilationErrors = false; var batchResult = new StatementExecutionBatchResult { ExecutionModel = batchExecutionModel }; var statementResults = new List<StatementExecutionResult>(); StatementExecutionResult currentStatementResult = null; try { SetOracleGlobalization(); await EnsureUserConnectionOpen(cancellationToken); await EnsureDatabaseOutput(cancellationToken); if (batchExecutionModel.GatherExecutionStatistics) { _executionStatisticsDataProvider = new SessionExecutionStatisticsDataProvider(_databaseModel.StatisticsKeys, _userSessionIdentifier.Value.SessionId); await _databaseModel.UpdateModelAsync(true, cancellationToken, _executionStatisticsDataProvider.SessionBeginExecutionStatisticsDataProvider); } _userConnection.ActionName = "User command"; foreach (var executionModel in batchExecutionModel.Statements) { currentStatementResult = new StatementExecutionResult { StatementModel = executionModel }; statementResults.Add(currentStatementResult); if (_userTransaction == null) { var isolationLevel = executionModel.Statement?.RootNode[NonTerminals.Statement, NonTerminals.SetTransactionStatement, NonTerminals.TransactionModeOrIsolationLevelOrRollbackSegment, NonTerminals.SerializableOrReadCommitted, Terminals.Serializable] != null ? IsolationLevel.Serializable : IsolationLevel.ReadCommitted; _userTransaction = _userConnection.BeginTransaction(isolationLevel); } var userCommand = InitializeUserCommand(); userCommand.CommandText = executionModel.StatementText.Replace("\r\n", "\n"); foreach (var variable in executionModel.BindVariables) { var value = await GetBindVariableValue(variable, cancellationToken); userCommand.AddSimpleParameter(variable.Name, value, variable.DataType.Name); } var resultInfoColumnHeaders = new Dictionary<ResultInfo, IReadOnlyList<ColumnHeader>>(); var statement = (OracleStatement)executionModel.Statement; var isPlSql = statement?.IsPlSql ?? false; if (isPlSql && batchExecutionModel.EnableDebug && executionModel.IsPartialStatement) { throw new InvalidOperationException("Debugging is not supported for PL/SQL fragment. "); } if (isPlSql) { currentStatementResult.ExecutedAt = DateTime.Now; if (batchExecutionModel.EnableDebug) { // TODO: Add COMPILE DEBUG _debuggerSession = new OracleDebuggerSession(this, (OracleCommand)userCommand.Clone(), batchResult); _debuggerSession.Detached += DebuggerSessionDetachedHandler; } else { currentStatementResult.AffectedRowCount = await userCommand.ExecuteNonQueryAsynchronous(cancellationToken); currentStatementResult.Duration = DateTime.Now - currentStatementResult.ExecutedAt; resultInfoColumnHeaders.AddRange(AcquireImplicitRefCursors(userCommand)); } } else { currentStatementResult.ExecutedAt = DateTime.Now; var dataReader = await userCommand.ExecuteReaderAsynchronous(CommandBehavior.Default, cancellationToken); currentStatementResult.Duration = DateTime.Now - currentStatementResult.ExecutedAt; currentStatementResult.AffectedRowCount = dataReader.RecordsAffected; var resultInfo = isReferenceConstraintNavigation ? new ResultInfo($"ReferenceConstrantResult{dataReader.GetHashCode()}", null, ResultIdentifierType.SystemGenerated) : new ResultInfo($"MainResult{dataReader.GetHashCode()}", $"Result set {_resultInfoColumnHeaders.Count + 1}", ResultIdentifierType.UserDefined); var columnHeaders = GetColumnHeadersFromReader(dataReader); if (columnHeaders.Count > 0) { _commandReaders.Add(resultInfo, new CommandReader { Reader = dataReader, Command = userCommand } ); resultInfoColumnHeaders.Add(resultInfo, columnHeaders); } } resultInfoColumnHeaders.AddRange(UpdateBindVariables(currentStatementResult.StatementModel, userCommand)); currentStatementResult.ResultInfoColumnHeaders = resultInfoColumnHeaders.AsReadOnly(); _resultInfoColumnHeaders.AddRange(resultInfoColumnHeaders); currentStatementResult.CompilationErrors = _userCommandHasCompilationErrors ? await RetrieveCompilationErrors(executionModel.ValidationModel.Statement, cancellationToken) : CompilationError.EmptyArray; currentStatementResult.SuccessfulExecutionMessage = statement == null ? OracleStatement.DefaultMessageCommandExecutedSuccessfully : statement.BuildExecutionFeedbackMessage(currentStatementResult.AffectedRowCount, _userCommandHasCompilationErrors); } } catch (OracleException exception) { if (currentStatementResult == null) { statementResults.Add( new StatementExecutionResult { StatementModel = batchExecutionModel.Statements[0], Exception = exception }); } else { currentStatementResult.Exception = exception; if (currentStatementResult.ExecutedAt != null && currentStatementResult.Duration == null) { currentStatementResult.Duration = DateTime.Now - currentStatementResult.ExecutedAt; } } var executionException = new StatementExecutionException(batchResult, exception); var isConnectionTerminated = TryHandleConnectionTerminatedError(exception); if (isConnectionTerminated) { throw executionException; } if (exception.Number == (int)OracleErrorCode.UserInvokedCancellation) { return batchResult; } if (currentStatementResult != null) { currentStatementResult.ErrorPosition = await GetSyntaxErrorIndex(currentStatementResult.StatementModel.StatementText, cancellationToken); } throw executionException; } finally { batchResult.StatementResults = statementResults.AsReadOnly(); try { if (_userConnection.State == ConnectionState.Open && !batchExecutionModel.EnableDebug && !cancellationToken.IsCancellationRequested) { await FinalizeBatchExecution(batchResult, cancellationToken); } } finally { _isExecuting = false; } } return batchResult; }
public override async Task RefreshResult(StatementExecutionResult result, CancellationToken cancellationToken) { _isExecuting = true; DateTime? executedAt = null; try { await EnsureUserConnectionOpen(cancellationToken); var resultInfo = result.ResultInfoColumnHeaders.Keys.Last(); var commandReader = ReinitializeResultInfo(resultInfo); OracleDataReader dataReader; executedAt = DateTime.Now; var stopWatch = Stopwatch.StartNew(); if (commandReader.RefCursorInfo.Parameter != null || commandReader.RefCursorInfo.ImplicitCursorIndex.HasValue) { await commandReader.Command.ExecuteNonQueryAsynchronous(cancellationToken); stopWatch.Stop(); #if ORACLE_MANAGED_DATA_ACCESS_CLIENT dataReader = ((OracleRefCursor)commandReader.RefCursorInfo.Parameter.Value).GetDataReader(); #else dataReader = commandReader.RefCursorInfo.Parameter != null ? ((OracleRefCursor)commandReader.RefCursorInfo.Parameter.Value).GetDataReader() : commandReader.Command.ImplicitRefCursors[commandReader.RefCursorInfo.ImplicitCursorIndex.Value].GetDataReader(); #endif } else { dataReader = await commandReader.Command.ExecuteReaderAsynchronous(CommandBehavior.Default, cancellationToken); stopWatch.Stop(); } _commandReaders[resultInfo] = new CommandReader { Command = commandReader.Command, Reader = dataReader, RefCursorInfo = commandReader.RefCursorInfo }; var columnHeaders = GetColumnHeadersFromReader(dataReader); _resultInfoColumnHeaders[resultInfo] = columnHeaders; result.Exception = null; result.Duration = stopWatch.Elapsed; result.ResultInfoColumnHeaders = new Dictionary<ResultInfo, IReadOnlyList<ColumnHeader>> { { resultInfo, columnHeaders } }.AsReadOnly(); } catch (OracleException exception) { TryHandleConnectionTerminatedError(exception); result.Exception = exception; throw; } finally { result.ExecutedAt = executedAt; _isExecuting = false; } }
public override Task RefreshResult(StatementExecutionResult result, CancellationToken cancellationToken) { return(Task.FromResult(result)); }
private DataGridResultViewer CreateResultViewer(StatementExecutionResult statementResult, ResultInfo resultInfo) { var refreshInterval = DocumentPage.WorkDocument.RefreshInterval; if (refreshInterval == TimeSpan.Zero) { refreshInterval = DefaultRefreshInterval; } var resultViewer = new DataGridResultViewer(this, statementResult, resultInfo) { AutoRefreshInterval = refreshInterval }; resultViewer.TabItem.AddHandler(Selector.SelectedEvent, (RoutedEventHandler)ResultTabSelectedHandler); return resultViewer; }