public RestorePlanDetailInfo CreateAndValidate(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
        {
            RestorePlanDetailInfo restorePlanDetailInfo = CreateOptionInfo(optionKey, restoreDataObject);

            UpdateOption(optionKey, restoreDataObject, restorePlanDetailInfo);
            return(restorePlanDetailInfo);
        }
 /// <summary>
 /// Update the option info by validating the option
 /// </summary>
 /// <param name="optionKey"></param>
 /// <param name="restoreDataObject"></param>
 /// <param name="optionInfo"></param>
 public void UpdateOption(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject, RestorePlanDetailInfo optionInfo)
 {
     if (optionBuilders.ContainsKey(optionKey))
     {
         var builder        = optionBuilders[optionKey];
         var currentValue   = builder.CurrentValueFunction(restoreDataObject);
         var defaultValue   = builder.DefaultValueFunction(restoreDataObject);
         var validateResult = builder.ValidateFunction(restoreDataObject, currentValue, defaultValue);
         optionInfo.IsReadOnly = validateResult.IsReadOnly;
     }
     else
     {
         Logger.Write(LogLevel.Warning, $"cannot find restore option builder for {optionKey}");
     }
 }
        private void VerifyOptions(Dictionary <string, RestorePlanDetailInfo> optionInResponse, GeneralRequestDetails optionValues)
        {
            RestorePlanDetailInfo planDetailInfo = optionInResponse[RestoreOptionsHelper.DataFileFolder];

            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.DataFileFolder);
            Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue <bool>(RestoreOptionsHelper.RelocateDbFiles));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <string>(RestoreOptionsHelper.DataFileFolder));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <string>("DefaultDataFileFolder"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.LogFileFolder];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.LogFileFolder);
            Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue <bool>(RestoreOptionsHelper.RelocateDbFiles));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <string>(RestoreOptionsHelper.LogFileFolder));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <string>("DefaultLogFileFolder"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.RelocateDbFiles];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.RelocateDbFiles);
            Assert.Equal(planDetailInfo.IsReadOnly, (optionValues.GetOptionValue <List <DbFile> >("DbFiles").Count == 0));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.RelocateDbFiles));
            Assert.Equal(planDetailInfo.DefaultValue, false);
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.ReplaceDatabase];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.ReplaceDatabase);
            Assert.Equal(planDetailInfo.IsReadOnly, false);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.ReplaceDatabase));
            Assert.Equal(planDetailInfo.DefaultValue, false);
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.KeepReplication];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.KeepReplication);
            Assert.Equal(planDetailInfo.IsReadOnly, optionValues.GetOptionValue <DatabaseRecoveryState>(RestoreOptionsHelper.RecoveryState) == DatabaseRecoveryState.WithNoRecovery);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.KeepReplication));
            Assert.Equal(planDetailInfo.DefaultValue, false);
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.SetRestrictedUser];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.SetRestrictedUser);
            Assert.Equal(planDetailInfo.IsReadOnly, false);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.SetRestrictedUser));
            Assert.Equal(planDetailInfo.DefaultValue, false);
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.RecoveryState];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.RecoveryState);
            Assert.Equal(planDetailInfo.IsReadOnly, false);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <DatabaseRecoveryState>(RestoreOptionsHelper.RecoveryState).ToString());
            Assert.Equal(planDetailInfo.DefaultValue, DatabaseRecoveryState.WithRecovery.ToString());
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.StandbyFile];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.StandbyFile);
            Assert.Equal(planDetailInfo.IsReadOnly, optionValues.GetOptionValue <DatabaseRecoveryState>(RestoreOptionsHelper.RecoveryState) != DatabaseRecoveryState.WithStandBy);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <string>(RestoreOptionsHelper.StandbyFile));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <string>("GetDefaultStandbyFile"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.BackupTailLog];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.BackupTailLog);
            Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue <bool>("IsTailLogBackupPossible"));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.BackupTailLog));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <bool>("IsTailLogBackupPossible"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.TailLogBackupFile];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.TailLogBackupFile);
            Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue <bool>("IsTailLogBackupPossible")
                         | !optionValues.GetOptionValue <bool>(RestoreOptionsHelper.BackupTailLog));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <string>("TailLogBackupFile"));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <string>("GetDefaultTailLogbackupFile"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.TailLogWithNoRecovery];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.TailLogWithNoRecovery);
            Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue <bool>("IsTailLogBackupWithNoRecoveryPossible")
                         | !optionValues.GetOptionValue <bool>(RestoreOptionsHelper.BackupTailLog));
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>("TailLogWithNoRecovery"));
            Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue <bool>("IsTailLogBackupWithNoRecoveryPossible"));
            Assert.Equal(planDetailInfo.IsVisiable, true);

            planDetailInfo = optionInResponse[RestoreOptionsHelper.CloseExistingConnections];
            Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.CloseExistingConnections);
            Assert.Equal(planDetailInfo.IsReadOnly, false);
            Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue <bool>(RestoreOptionsHelper.CloseExistingConnections));
            Assert.Equal(planDetailInfo.DefaultValue, false);
            Assert.Equal(planDetailInfo.IsVisiable, true);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Creates a restore plan, The result includes the information about the backup set,
        /// the files and the database to restore to
        /// </summary>
        /// <param name="requestParam">Restore request</param>s
        /// <returns>Restore plan</returns>
        public RestorePlanResponse CreateRestorePlanResponse(RestoreDatabaseTaskDataObject restoreDataObject)
        {
            RestorePlanResponse response = new RestorePlanResponse()
            {
                DatabaseName = restoreDataObject.RestoreParams.TargetDatabaseName,
                PlanDetails  = new System.Collections.Generic.Dictionary <string, RestorePlanDetailInfo>()
            };

            try
            {
                if (restoreDataObject != null && restoreDataObject.IsValid)
                {
                    restoreDataObject.UpdateRestoreTaskObject();

                    if (restoreDataObject != null && restoreDataObject.IsValid)
                    {
                        response.SessionId    = restoreDataObject.SessionId;
                        response.DatabaseName = restoreDataObject.TargetDatabaseName;

                        response.PlanDetails.Add(RestoreOptionsHelper.TargetDatabaseName,
                                                 RestoreOptionFactory.Instance.CreateAndValidate(RestoreOptionsHelper.TargetDatabaseName, restoreDataObject));
                        response.PlanDetails.Add(RestoreOptionsHelper.SourceDatabaseName,
                                                 RestoreOptionFactory.Instance.CreateAndValidate(RestoreOptionsHelper.SourceDatabaseName, restoreDataObject));

                        response.PlanDetails.Add(RestoreOptionsHelper.ReadHeaderFromMedia, RestorePlanDetailInfo.Create(
                                                     name: RestoreOptionsHelper.ReadHeaderFromMedia,
                                                     currentValue: restoreDataObject.RestorePlanner.ReadHeaderFromMedia));
                        response.DbFiles = restoreDataObject.DbFiles.Select(x => new RestoreDatabaseFileInfo
                        {
                            FileType          = x.DbFileType,
                            LogicalFileName   = x.LogicalName,
                            OriginalFileName  = x.PhysicalName,
                            RestoreAsFileName = x.PhysicalNameRelocate
                        });
                        response.CanRestore = CanRestore(restoreDataObject);

                        response.PlanDetails.Add(LastBackupTaken,
                                                 RestorePlanDetailInfo.Create(name: LastBackupTaken, currentValue: restoreDataObject.GetLastBackupTaken(), isReadOnly: true));

                        response.BackupSetsToRestore = restoreDataObject.GetSelectedBakupSets();
                        var dbNames = restoreDataObject.SourceDbNames;
                        response.DatabaseNamesFromBackupSets = dbNames == null ? new string[] { } : dbNames.ToArray();

                        RestoreOptionsHelper.AddOptions(response, restoreDataObject);
                    }
                    else
                    {
                        if (restoreDataObject.ActiveException != null)
                        {
                            response.ErrorMessage = restoreDataObject.ActiveException.Message;
                        }
                        else
                        {
                            response.ErrorMessage = SR.RestorePlanFailed;
                        }
                        response.CanRestore = false;
                    }
                }
                else
                {
                    response.ErrorMessage = SR.RestorePlanFailed;
                }
            }
            catch (Exception ex)
            {
                response.ErrorMessage = ex.Message;

                if (ex.InnerException != null)
                {
                    response.ErrorMessage += Environment.NewLine;
                    response.ErrorMessage += ex.InnerException.Message;
                }
                Logger.Write(LogLevel.Normal, $"Failed to create restore plan. error: { response.ErrorMessage}");
            }
            return(response);
        }