Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }