/// <summary> /// Executes the batch text given the text span /// </summary> /// <param name="batchScript"></param> /// <param name="textSpan"></param> /// <param name="continueProcessing"></param> private void ExecuteBatchTextSpanInternal(string batchScript, TextSpan textSpan, out bool continueProcessing) { Debug.Assert(!String.IsNullOrEmpty(batchScript)); continueProcessing = true; if (batchScript.Trim().Length <= 0) { result |= ScriptExecutionResult.Success; return; } Debug.Assert(currentBatch != null); if (executionState == ExecutionState.Cancelling) { result = ScriptExecutionResult.Cancel; } else { currentBatch.Reset(); currentBatch.Text = batchScript; currentBatch.TextSpan = textSpan; currentBatch.BatchIndex = currentBatchIndex; currentBatchIndex++; if (conditions != null) { currentBatch.IsSuppressProviderMessageHeaders = conditions.IsSuppressProviderMessageHeaders; // TODO this is associated with Dacfx specific situations, so uncomment if need be //currentBatch.IsScriptExecutionTracked = conditions.IsScriptExecutionTracked; if (conditions.IsScriptExecutionTracked) { currentBatch.ScriptTrackingId = scriptTrackingId++; } } //ExecutingBatch state means currentBatch is valid to use from another thread to Cancel executionState = ExecutionState.ExecutingBatch; } ScriptExecutionResult batchResult = ScriptExecutionResult.Failure; if (result != ScriptExecutionResult.Cancel) { bool isExecutionDiscarded = false; try { RaiseBatchParserExecutionStarted(currentBatch, textSpan); if (!isLocalParse) { batchResult = DoBatchExecution(currentBatch); } else { batchResult = ScriptExecutionResult.Success; } } finally { isExecutionDiscarded = (executionState == ExecutionState.Discarded); if (executionState == ExecutionState.Cancelling || isExecutionDiscarded) { batchResult = ScriptExecutionResult.Cancel; } else { executionState = ExecutionState.Executing; } } if (!isExecutionDiscarded) { RaiseBatchParserExecutionFinished(currentBatch, batchResult); } } else { batchResult = ScriptExecutionResult.Cancel; } //if we're in Cancel or Halt state, do some special actions if (batchResult == ScriptExecutionResult.Cancel || batchResult == ScriptExecutionResult.Halted) { result = batchResult; continueProcessing = false; return; } else { result |= batchResult; } }
/// <summary> /// Called when an error message came from SqlClient /// </summary> /// <param name="message"></param> /// <param name="description"></param> /// <param name="line"></param> /// <param name="textSpan"></param> private void RaiseBatchError(string message, SqlError error, TextSpan textSpan) { BatchErrorEventArgs args = new BatchErrorEventArgs(message, error, textSpan, null); RaiseBatchError(args); }