/// <summary>
        /// Create a backup task for execution and cancellation
        /// </summary>
        /// <param name="sqlTask"></param>
        /// <returns></returns>
        internal async Task <TaskResult> BackupTaskAsync(SqlTask sqlTask)
        {
            sqlTask.AddMessage(SR.Task_InProgress, SqlTaskStatus.InProgress, true);
            IBackupOperation backupOperation = sqlTask.TaskMetadata.Data as IBackupOperation;
            TaskResult       taskResult      = null;

            if (backupOperation != null)
            {
                AutoResetEvent    backupCompletedEvent = new AutoResetEvent(initialState: false);
                Task <TaskResult> performTask          = PerformTaskAsync(backupOperation);
                Task <TaskResult> cancelTask           = CancelTaskAsync(backupOperation, sqlTask.TokenSource.Token, backupCompletedEvent);
                Task <TaskResult> completedTask        = await Task.WhenAny(performTask, cancelTask);

                // Release the cancelTask
                if (completedTask == performTask)
                {
                    backupCompletedEvent.Set();
                }

                sqlTask.AddMessage(completedTask.Result.TaskStatus == SqlTaskStatus.Failed ? completedTask.Result.ErrorMessage : SR.Task_Completed,
                                   completedTask.Result.TaskStatus);
                taskResult = completedTask.Result;
            }
            else
            {
                taskResult            = new TaskResult();
                taskResult.TaskStatus = SqlTaskStatus.Failed;
            }

            return(taskResult);
        }
Exemplo n.º 2
0
        public async Task <TaskResult> FunctionToScript(SqlTask sqlTask)
        {
            return(await Task.Factory.StartNew(() =>
            {
                sqlTask.AddMessage("start scripting", SqlTaskStatus.InProgress, true);
                TaskScript = sqlTask.AddScript(SqlTaskStatus.Succeeded, "script generated!");
                sqlTask.AddMessage("done", SqlTaskStatus.Succeeded);

                return new TaskResult
                {
                    TaskStatus = SqlTaskStatus.Succeeded,
                };
            }));
        }
        /// <summary>
        /// Create a backup task for execution and cancellation
        /// </summary>
        /// <param name="sqlTask"></param>
        /// <returns></returns>
        internal async Task <TaskResult> RestoreTaskAsync(SqlTask sqlTask)
        {
            sqlTask.AddMessage(SR.Task_InProgress, SqlTaskStatus.InProgress, true);
            RestoreDatabaseTaskDataObject restoreDataObject = sqlTask.TaskMetadata.Data as RestoreDatabaseTaskDataObject;
            TaskResult taskResult = null;

            if (restoreDataObject != null)
            {
                // Create a task to perform backup
                return(await Task.Factory.StartNew(() =>
                {
                    TaskResult result = new TaskResult();
                    try
                    {
                        if (restoreDataObject.IsValid)
                        {
                            ExecuteRestore(restoreDataObject);
                            result.TaskStatus = SqlTaskStatus.Succeeded;
                        }
                        else
                        {
                            result.TaskStatus = SqlTaskStatus.Failed;
                            if (restoreDataObject.ActiveException != null)
                            {
                                result.ErrorMessage = restoreDataObject.ActiveException.Message;
                            }
                            else
                            {
                                result.ErrorMessage = SR.RestoreNotSupported;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        result.TaskStatus = SqlTaskStatus.Failed;
                        result.ErrorMessage = ex.Message;
                        if (ex.InnerException != null)
                        {
                            result.ErrorMessage += Environment.NewLine + ex.InnerException.Message;
                        }
                        if (restoreDataObject != null && restoreDataObject.ActiveException != null)
                        {
                            result.ErrorMessage += Environment.NewLine + restoreDataObject.ActiveException.Message;
                        }
                    }
                    return result;
                }));
            }
            else
            {
                taskResult            = new TaskResult();
                taskResult.TaskStatus = SqlTaskStatus.Failed;
            }

            return(taskResult);
        }
        public async Task <TaskResult> FunctionToRun(SqlTask sqlTask)
        {
            return(await Task.Factory.StartNew(() =>
            {
                while (!IsStopped)
                {
                    //Just keep running
                    if (sqlTask.TaskStatus == SqlTaskStatus.Canceled)
                    {
                        break;
                    }
                    if (Failed)
                    {
                        throw new InvalidOperationException();
                    }
                    sqlTask.AddMessage("still running", SqlTaskStatus.InProgress, true);
                }
                sqlTask.AddMessage("done!", SqlTaskStatus.Succeeded);

                return TaskResult;
            }));
        }
        /// <summary>
        /// Executes the restore operations
        /// </summary>
        public void Execute()
        {
            RestorePlan restorePlan = GetRestorePlanForExecutionAndScript();

            // ssms creates a new restore plan by calling GetRestorePlanForExecutionAndScript and
            // Doens't use the plan already created here. not sure why, using the existing restore plan doesn't make
            // any issue so far so keeping in it for now but we might want to double check later
            if (restorePlan != null && restorePlan.RestoreOperations.Count > 0)
            {
                restorePlan.PercentComplete += (object sender, PercentCompleteEventArgs e) =>
                {
                    if (SqlTask != null)
                    {
                        SqlTask.AddMessage($"{e.Percent}%", SqlTaskStatus.InProgress);
                    }
                };
                restorePlan.Execute();
            }
        }