/// <summary> /// Handles request to start the scripting operation /// </summary> public async Task HandleScriptExecuteRequest(ScriptingParams parameters, RequestContext <ScriptingResult> requestContext) { SmoScriptingOperation operation = null; try { // if a connection string wasn't provided as a parameter then // use the owner uri property to lookup its associated ConnectionInfo // and then build a connection string out of that ConnectionInfo connInfo = null; string accessToken = null; if (parameters.ConnectionString == null) { ScriptingService.ConnectionServiceInstance.TryFindConnection(parameters.OwnerUri, out connInfo); if (connInfo != null) { parameters.ConnectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails); accessToken = connInfo.ConnectionDetails.AzureAccountToken; } else { throw new Exception("Could not find ConnectionInfo"); } } if (parameters.FilePath == null) { // Create a temporary and random path to handle this operation parameters.FilePath = Path.GetTempFileName(); } if (!ShouldCreateScriptAsOperation(parameters)) { operation = new ScriptingScriptOperation(parameters, accessToken); } else { operation = new ScriptAsScriptingOperation(parameters, accessToken); } operation.PlanNotification += (sender, e) => requestContext.SendEvent(ScriptingPlanNotificationEvent.Type, e).Wait(); operation.ProgressNotification += (sender, e) => requestContext.SendEvent(ScriptingProgressNotificationEvent.Type, e).Wait(); operation.CompleteNotification += (sender, e) => this.SendScriptingCompleteEvent(requestContext, ScriptingCompleteEvent.Type, e, operation, parameters.ScriptDestination); RunTask(requestContext, operation); } catch (Exception e) { await requestContext.SendError(e); } }
/// <summary> /// Script a object using SMO and write to a file. /// </summary> /// <param name="sqlScriptGetter">Function that returns the SMO scripts for an object</param> /// <param name="objectName">SQL object name</param> /// <param name="schemaName">Schema name or null</param> /// <param name="objectType">Type of SQL object</param> /// <returns>Location object representing URI and range of the script file</returns> internal Location[] GetSqlObjectDefinition( string objectName, string schemaName, string objectType) { // script file destination string tempFileName = (schemaName != null) ? Path.Combine(this.tempPath, string.Format("{0}.{1}.sql", schemaName, objectName)) : Path.Combine(this.tempPath, string.Format("{0}.sql", objectName)); ScriptingScriptOperation operation = InitScriptOperation(objectName, schemaName, objectType); operation.Execute(); string script = operation.ScriptText; bool objectFound = false; int createStatementLineNumber = 0; File.WriteAllText(tempFileName, script); string[] lines = File.ReadAllLines(tempFileName); int lineCount = 0; string createSyntax = null; if (objectScriptMap.ContainsKey(objectType.ToLower())) { createSyntax = string.Format("CREATE {0}", objectScriptMap[objectType.ToLower()]); foreach (string line in lines) { if (LineContainsObject(line, objectName, createSyntax)) { createStatementLineNumber = lineCount; objectFound = true; break; } lineCount++; } } if (objectFound) { Location[] locations = GetLocationFromFile(tempFileName, createStatementLineNumber); return(locations); } else { this.error = true; this.errorMessage = SR.PeekDefinitionNoResultsError; return(null); } }
/// <summary> /// Handles request to execute start the script operation. /// </summary> public async Task HandleScriptExecuteRequest(ScriptingParams parameters, RequestContext <ScriptingResult> requestContext) { try { ScriptingScriptOperation operation = new ScriptingScriptOperation(parameters); operation.PlanNotification += (sender, e) => this.SendEvent(requestContext, ScriptingPlanNotificationEvent.Type, e); operation.ProgressNotification += (sender, e) => this.SendEvent(requestContext, ScriptingProgressNotificationEvent.Type, e); operation.CompleteNotification += (sender, e) => this.SendEvent(requestContext, ScriptingCompleteEvent.Type, e); RunTask(requestContext, operation); await requestContext.SendResult(new ScriptingResult { OperationId = operation.OperationId }); } catch (Exception e) { await requestContext.SendError(e); } }
/// <summary> /// Handles request to start the scripting operation /// </summary> public async Task HandleScriptExecuteRequest(ScriptingParams parameters, RequestContext <ScriptingResult> requestContext) { try { // if a connection string wasn't provided as a parameter then // use the owner uri property to lookup its associated ConnectionInfo // and then build a connection string out of that ConnectionInfo connInfo = null; if (parameters.ConnectionString == null || parameters.ScriptOptions.ScriptCreateDrop == "ScriptSelect") { ScriptingService.ConnectionServiceInstance.TryFindConnection(parameters.OwnerUri, out connInfo); if (connInfo != null) { parameters.ConnectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails); } else { throw new Exception("Could not find ConnectionInfo"); } } // if the scripting operation is for SELECT then handle that message differently // for SELECT we'll build the SQL directly whereas other scripting operations depend on SMO if (parameters.ScriptOptions.ScriptCreateDrop == "ScriptSelect") { RunSelectTask(connInfo, parameters, requestContext); } else { ScriptingScriptOperation operation = new ScriptingScriptOperation(parameters); operation.PlanNotification += (sender, e) => requestContext.SendEvent(ScriptingPlanNotificationEvent.Type, e).Wait(); operation.ProgressNotification += (sender, e) => requestContext.SendEvent(ScriptingProgressNotificationEvent.Type, e).Wait(); operation.CompleteNotification += (sender, e) => this.SendScriptingCompleteEvent(requestContext, ScriptingCompleteEvent.Type, e, operation, parameters.ScriptDestination); RunTask(requestContext, operation); } } catch (Exception e) { await requestContext.SendError(e); } }
private async void SendScriptingCompleteEvent <TParams>(RequestContext <ScriptingResult> requestContext, EventType <TParams> eventType, TParams parameters, ScriptingScriptOperation operation, string scriptDestination) { await requestContext.SendEvent(eventType, parameters); switch (scriptDestination) { case "ToEditor": await requestContext.SendResult(new ScriptingResult { OperationId = operation.OperationId, Script = operation.ScriptText }); break; case "ToSingleFile": await requestContext.SendResult(new ScriptingResult { OperationId = operation.OperationId }); break; default: await requestContext.SendError(string.Format("Operation {0} failed", operation.ToString())); break; } }