mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-05 09:35:40 -05:00
fixed the bugs with creating new restore plan (#433)
* fixed the bug with source db name not setting correctly when new plan created
This commit is contained in:
@@ -171,14 +171,13 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
if (restoreDataObject != null && restoreDataObject.IsValid)
|
||||
{
|
||||
response.SessionId = restoreDataObject.SessionId;
|
||||
response.DatabaseName = restoreDataObject.TargetDatabase;
|
||||
response.PlanDetails.Add(RestoreOptionsHelper.TargetDatabaseName, RestorePlanDetailInfo.Create(
|
||||
name: RestoreOptionsHelper.TargetDatabaseName,
|
||||
currentValue: restoreDataObject.TargetDatabase,
|
||||
isReadOnly: !CanChangeTargetDatabase(restoreDataObject)));
|
||||
response.PlanDetails.Add(RestoreOptionsHelper.SourceDatabaseName, RestorePlanDetailInfo.Create(
|
||||
name: RestoreOptionsHelper.SourceDatabaseName,
|
||||
currentValue: restoreDataObject.RestorePlanner.DatabaseName));
|
||||
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));
|
||||
@@ -191,16 +190,11 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
});
|
||||
response.CanRestore = CanRestore(restoreDataObject);
|
||||
|
||||
if (!response.CanRestore)
|
||||
{
|
||||
response.ErrorMessage = SR.RestoreNotSupported;
|
||||
}
|
||||
|
||||
response.PlanDetails.Add(LastBackupTaken,
|
||||
RestorePlanDetailInfo.Create(name: LastBackupTaken, currentValue: restoreDataObject.GetLastBackupTaken(), isReadOnly: true));
|
||||
|
||||
response.BackupSetsToRestore = restoreDataObject.GetSelectedBakupSets();
|
||||
var dbNames = restoreDataObject.GetPossibleTargerDbNames();
|
||||
var dbNames = restoreDataObject.SourceDbNames;
|
||||
response.DatabaseNamesFromBackupSets = dbNames == null ? new string[] { } : dbNames.ToArray();
|
||||
|
||||
RestoreOptionsHelper.AddOptions(response, restoreDataObject);
|
||||
@@ -259,11 +253,11 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
if (!sessions.TryGetValue(sessionId, out restoreTaskObject))
|
||||
{
|
||||
restoreTaskObject = CreateRestoreForNewSession(restoreParams.OwnerUri, restoreParams.TargetDatabaseName);
|
||||
sessions.AddOrUpdate(sessionId, restoreTaskObject, (key, old) => restoreTaskObject);
|
||||
}
|
||||
restoreTaskObject.SessionId = sessionId;
|
||||
restoreTaskObject.RestoreParams = restoreParams;
|
||||
restoreTaskObject.TargetDatabase = restoreParams.TargetDatabaseName;
|
||||
restoreTaskObject.RestorePlanner.DatabaseName = restoreParams.TargetDatabaseName;
|
||||
|
||||
return restoreTaskObject;
|
||||
}
|
||||
|
||||
@@ -308,33 +302,24 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
/// <returns></returns>
|
||||
private void UpdateRestorePlan(RestoreDatabaseTaskDataObject restoreDataObject)
|
||||
{
|
||||
bool shouldCreateNewPlan = restoreDataObject.ShouldCreateNewPlan();
|
||||
|
||||
if (!string.IsNullOrEmpty(restoreDataObject.RestoreParams.BackupFilePaths))
|
||||
{
|
||||
restoreDataObject.AddFiles(restoreDataObject.RestoreParams.BackupFilePaths);
|
||||
}
|
||||
restoreDataObject.RestorePlanner.ReadHeaderFromMedia = restoreDataObject.RestoreParams.ReadHeaderFromMedia;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(restoreDataObject.RestoreParams.SourceDatabaseName))
|
||||
{
|
||||
restoreDataObject.RestorePlanner.DatabaseName = restoreDataObject.DefaultDbName;
|
||||
}
|
||||
else
|
||||
{
|
||||
restoreDataObject.RestorePlanner.DatabaseName = restoreDataObject.RestoreParams.SourceDatabaseName;
|
||||
}
|
||||
RestoreOptionFactory.Instance.SetAndValidate(RestoreOptionsHelper.SourceDatabaseName, restoreDataObject);
|
||||
RestoreOptionFactory.Instance.SetAndValidate(RestoreOptionsHelper.TargetDatabaseName, restoreDataObject);
|
||||
|
||||
if (CanChangeTargetDatabase(restoreDataObject))
|
||||
if (shouldCreateNewPlan)
|
||||
{
|
||||
restoreDataObject.TargetDatabase = restoreDataObject.RestoreParams.TargetDatabaseName;
|
||||
restoreDataObject.CreateNewRestorePlan();
|
||||
}
|
||||
else
|
||||
{
|
||||
restoreDataObject.TargetDatabase = restoreDataObject.Server.ConnectionContext.DatabaseName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
restoreDataObject.UpdateRestorePlan();
|
||||
|
||||
}
|
||||
|
||||
private bool CanChangeTargetDatabase(RestoreDatabaseTaskDataObject restoreDataObject)
|
||||
|
||||
@@ -12,6 +12,7 @@ using Microsoft.SqlServer.Management.Common;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.TaskServices;
|
||||
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
{
|
||||
@@ -43,6 +44,19 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
RestoreParams RestoreParams { get; set; }
|
||||
|
||||
bool BackupTailLog { get; set; }
|
||||
|
||||
string DefaultSourceDbName { get; }
|
||||
|
||||
string SourceDatabaseName { get; set; }
|
||||
|
||||
List<String> SourceDbNames { get; }
|
||||
|
||||
bool CanChangeTargetDatabase { get; }
|
||||
|
||||
string DefaultTargetDbName { get; }
|
||||
string TargetDatabaseName { get; set; }
|
||||
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Includes the plan with all the data required to do a restore operation on server
|
||||
@@ -56,6 +70,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
private BackupSetsFilterInfo backupSetsFilterInfo = new BackupSetsFilterInfo();
|
||||
private bool? isTailLogBackupPossible = false;
|
||||
private bool? isTailLogBackupWithNoRecoveryPossible = false;
|
||||
private string backupMediaList = string.Empty;
|
||||
|
||||
public RestoreDatabaseTaskDataObject(Server server, String databaseName)
|
||||
{
|
||||
@@ -95,11 +110,11 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
/// </summary>
|
||||
public SqlTask SqlTask { get; set; }
|
||||
|
||||
public string TargetDatabase
|
||||
public string TargetDatabaseName
|
||||
{
|
||||
get
|
||||
{
|
||||
return string.IsNullOrEmpty(targetDbName) ? DefaultDbName : targetDbName;
|
||||
return string.IsNullOrEmpty(targetDbName) ? DefaultSourceDbName : targetDbName;
|
||||
}
|
||||
set
|
||||
{
|
||||
@@ -121,9 +136,19 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
/// Database names includes in the restore plan
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<String> GetPossibleTargerDbNames()
|
||||
public List<String> SourceDbNames
|
||||
{
|
||||
return Util.GetSourceDbNames(this.restorePlanner.BackupMediaList, this.CredentialName);
|
||||
get
|
||||
{
|
||||
if (RestorePlanner.ReadHeaderFromMedia)
|
||||
{
|
||||
return Util.GetSourceDbNames(this.restorePlanner.BackupMediaList, this.CredentialName);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Util.GetSourceDbNames();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -135,6 +160,23 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
return Util.GetSourceDbNames();
|
||||
}
|
||||
|
||||
public bool CanChangeTargetDatabase
|
||||
{
|
||||
get
|
||||
{
|
||||
return DatabaseUtils.IsSystemDatabaseConnection(Server.ConnectionContext.DatabaseName);
|
||||
}
|
||||
}
|
||||
|
||||
public string DefaultTargetDbName
|
||||
{
|
||||
get
|
||||
{
|
||||
return Server.ConnectionContext.DatabaseName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Current sqlserver instance
|
||||
/// </summary>
|
||||
@@ -154,6 +196,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
/// <param name="filePaths"></param>
|
||||
public void AddFiles(string filePaths)
|
||||
{
|
||||
backupMediaList = filePaths;
|
||||
PlanUpdateRequired = true;
|
||||
if (!string.IsNullOrWhiteSpace(filePaths))
|
||||
{
|
||||
@@ -634,16 +677,40 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
/// <summary>
|
||||
/// The database from the backup file used to restore to by default
|
||||
/// </summary>
|
||||
public string DefaultDbName
|
||||
public string DefaultSourceDbName
|
||||
{
|
||||
get
|
||||
{
|
||||
var dbNames = GetPossibleTargerDbNames();
|
||||
var dbNames = SourceDbNames;
|
||||
string dbName = dbNames.FirstOrDefault();
|
||||
return dbName;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Current value of source db name in the planner
|
||||
/// </summary>
|
||||
public string SourceDatabaseName
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.RestorePlanner == null ? string.Empty : this.RestorePlanner.DatabaseName;
|
||||
}
|
||||
set
|
||||
{
|
||||
if(this.RestorePlanner != null)
|
||||
{
|
||||
string currentDatabaseName = this.RestorePlanner.DatabaseName;
|
||||
this.RestorePlanner.DatabaseName = value;
|
||||
|
||||
if (string.Compare(currentDatabaseName, value, StringComparison.InvariantCultureIgnoreCase) != 0)
|
||||
{
|
||||
ResetOptions();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether [close existing connections].
|
||||
/// </summary>
|
||||
@@ -682,10 +749,10 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
private string GetTargetDbFilePhysicalName(string sourceDbFilePhysicalLocation)
|
||||
{
|
||||
string fileName = Path.GetFileName(sourceDbFilePhysicalLocation);
|
||||
if (!string.IsNullOrEmpty(this.DefaultDbName) && !string.IsNullOrEmpty(this.targetDbName))
|
||||
if (!string.IsNullOrEmpty(this.DefaultSourceDbName) && !string.IsNullOrEmpty(this.targetDbName))
|
||||
{
|
||||
string sourceFilename = fileName;
|
||||
fileName = sourceFilename.Replace(this.DefaultDbName, this.targetDbName);
|
||||
fileName = sourceFilename.Replace(this.DefaultSourceDbName, this.targetDbName);
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
@@ -798,13 +865,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
bool isTailLogBackupWithNoRecoveryPossibleValue = isTailLogBackupPossibleValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates restore plan
|
||||
/// </summary>
|
||||
public void UpdateRestorePlan()
|
||||
public void CreateNewRestorePlan()
|
||||
{
|
||||
|
||||
ResetOptions();
|
||||
this.ActiveException = null; //Clear any existing exceptions as the plan is getting recreated.
|
||||
//Clear any existing exceptions as new plan is getting recreated.
|
||||
this.CreateOrUpdateRestorePlanException = null;
|
||||
@@ -820,17 +882,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
{
|
||||
this.RestorePlan = this.CreateRestorePlan(this.RestorePlanner, this.RestoreOptions);
|
||||
this.Util.AddCredentialNameForUrlBackupSet(this.restorePlan, this.CredentialName);
|
||||
RestoreOptionsHelper.UpdateOptionsInPlan(this);
|
||||
|
||||
if (this.ActiveException == null)
|
||||
{
|
||||
this.dbFiles = this.GetDbFiles();
|
||||
UpdateDBFilesPhysicalRelocate();
|
||||
|
||||
if (RelocateAllFiles)
|
||||
{
|
||||
UpdateDbFiles();
|
||||
}
|
||||
this.SetRestorePlanProperties(this.restorePlan);
|
||||
UpdateDBFilesPhysicalRelocate();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
if (this.restorePlan == null)
|
||||
@@ -838,6 +897,26 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
this.RestorePlan = new RestorePlan(this.Server);
|
||||
this.Util.AddCredentialNameForUrlBackupSet(this.RestorePlan, this.CredentialName);
|
||||
}
|
||||
}
|
||||
|
||||
public bool ShouldCreateNewPlan()
|
||||
{
|
||||
return string.Compare(RestorePlanner.DatabaseName, this.RestoreParams.GetOptionValue<string>(RestoreOptionsHelper.SourceDatabaseName), StringComparison.InvariantCultureIgnoreCase) != 0 ||
|
||||
RestorePlanner.ReadHeaderFromMedia != this.RestoreParams.ReadHeaderFromMedia ||
|
||||
string.Compare(this.backupMediaList, RestoreParams.BackupFilePaths, StringComparison.InvariantCultureIgnoreCase) != 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates restore plan
|
||||
/// </summary>
|
||||
public void UpdateRestorePlan()
|
||||
{
|
||||
RestoreOptionsHelper.UpdateOptionsInPlan(this);
|
||||
if (RelocateAllFiles)
|
||||
{
|
||||
UpdateDbFiles();
|
||||
}
|
||||
this.SetRestorePlanProperties(this.restorePlan);
|
||||
|
||||
UpdateSelectedBackupSets();
|
||||
}
|
||||
@@ -863,9 +942,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
}
|
||||
rp.SetRestoreOptions(this.RestoreOptions);
|
||||
rp.CloseExistingConnections = this.CloseExistingConnections;
|
||||
if (this.TargetDatabase != null && !this.TargetDatabase.Equals(string.Empty))
|
||||
if (this.TargetDatabaseName != null && !this.TargetDatabaseName.Equals(string.Empty))
|
||||
{
|
||||
rp.DatabaseName = TargetDatabase;
|
||||
rp.DatabaseName = TargetDatabaseName;
|
||||
}
|
||||
rp.RestoreOperations[0].RelocateFiles.Clear();
|
||||
foreach (DbFile dbFile in this.DbFiles)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||
@@ -32,6 +33,13 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
}
|
||||
}
|
||||
|
||||
public RestorePlanDetailInfo CreateAndValidate(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
|
||||
{
|
||||
RestorePlanDetailInfo restorePlanDetailInfo = CreateOptionInfo(optionKey, restoreDataObject);
|
||||
UpdateOption(optionKey, restoreDataObject, restorePlanDetailInfo);
|
||||
return restorePlanDetailInfo;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create option info using the current values
|
||||
/// </summary>
|
||||
@@ -74,13 +82,24 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the option value if restore tak object using the values in the restore request
|
||||
/// Set the option value in restore task object using the values in the restore request
|
||||
/// </summary>
|
||||
/// <param name="optionKey"></param>
|
||||
/// <param name="restoreDataObject"></param>
|
||||
public void SetAndValidate(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
|
||||
{
|
||||
this.SetValue(optionKey, restoreDataObject);
|
||||
this.ValidateOption(optionKey, restoreDataObject);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the option value in restore task object using the values in the restore request
|
||||
/// </summary>
|
||||
/// <param name="optionKey"></param>
|
||||
/// <param name="restoreDataObject"></param>
|
||||
public void SetValue(string optionKey, IRestoreDatabaseTaskDataObject restoreDataObject)
|
||||
{
|
||||
if(restoreDataObject != null)
|
||||
if (restoreDataObject != null)
|
||||
{
|
||||
if (optionBuilders.ContainsKey(optionKey))
|
||||
{
|
||||
@@ -107,7 +126,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
var defaultValue = builder.DefaultValueFunction(restoreDataObject);
|
||||
builder.SetValueFunction(restoreDataObject, defaultValue);
|
||||
}
|
||||
catch(Exception)
|
||||
catch (Exception)
|
||||
{
|
||||
Logger.Write(LogLevel.Warning, $"Failed to set restore option {optionKey} to default value");
|
||||
}
|
||||
@@ -143,10 +162,15 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
errorMessage = $"{optionKey} is ready only and cannot be modified";
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(result.ErrorMessage))
|
||||
{
|
||||
errorMessage = result.ErrorMessage;
|
||||
builder.SetValueFunction(restoreDataObject, defaultValue);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMessage = "cannot find restore option builder for {optionKey}";
|
||||
errorMessage = $"cannot find restore option builder for {optionKey}";
|
||||
Logger.Write(LogLevel.Warning, errorMessage);
|
||||
}
|
||||
|
||||
@@ -469,6 +493,64 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
||||
return true;
|
||||
}
|
||||
});
|
||||
Register(RestoreOptionsHelper.SourceDatabaseName,
|
||||
new OptionBuilder
|
||||
{
|
||||
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
|
||||
{
|
||||
return restoreDataObject.DefaultSourceDbName;
|
||||
},
|
||||
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
|
||||
{
|
||||
return restoreDataObject.SourceDatabaseName;
|
||||
},
|
||||
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
|
||||
{
|
||||
string errorMessage = string.Empty;
|
||||
var sourceDbNames = restoreDataObject.SourceDbNames;
|
||||
if (currentValue == null || (sourceDbNames != null &&
|
||||
!sourceDbNames.Any(x => string.Compare(x, currentValue.ToString(), StringComparison.InvariantCultureIgnoreCase) == 0)))
|
||||
{
|
||||
errorMessage = "Source database name is not valid";
|
||||
}
|
||||
return new OptionValidationResult()
|
||||
{
|
||||
ErrorMessage = errorMessage
|
||||
};
|
||||
},
|
||||
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
|
||||
{
|
||||
|
||||
restoreDataObject.SourceDatabaseName = GetValueAs<string>(value);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
Register(RestoreOptionsHelper.TargetDatabaseName,
|
||||
new OptionBuilder
|
||||
{
|
||||
DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
|
||||
{
|
||||
return restoreDataObject.CanChangeTargetDatabase ? restoreDataObject.DefaultSourceDbName : restoreDataObject.DefaultTargetDbName;
|
||||
},
|
||||
CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) =>
|
||||
{
|
||||
return restoreDataObject.TargetDatabaseName;
|
||||
},
|
||||
ValidateFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object currentValue, object defaultValue) =>
|
||||
{
|
||||
|
||||
return new OptionValidationResult()
|
||||
{
|
||||
IsReadOnly = !restoreDataObject.CanChangeTargetDatabase
|
||||
};
|
||||
},
|
||||
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
|
||||
{
|
||||
|
||||
restoreDataObject.TargetDatabaseName = GetValueAs<string>(value);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
internal T GetValueAs<T>(object value)
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
||||
{
|
||||
public class RestoreOptionsHelper
|
||||
{
|
||||
//The list of name that service sends to client as options
|
||||
//The list of names service uses to sends restore options to client
|
||||
private static string[] optionNames = new string[] { KeepReplication, ReplaceDatabase , SetRestrictedUser, RecoveryState ,
|
||||
BackupTailLog , TailLogBackupFile, TailLogWithNoRecovery, CloseExistingConnections, RelocateDbFiles, DataFileFolder, LogFileFolder,
|
||||
StandbyFile,
|
||||
@@ -241,6 +241,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
||||
|
||||
Dictionary<string, RestorePlanDetailInfo> options = new Dictionary<string, RestorePlanDetailInfo>();
|
||||
RestoreOptionFactory restoreOptionFactory = RestoreOptionFactory.Instance;
|
||||
|
||||
//Create the options using the current values
|
||||
foreach (var optionKey in optionNames)
|
||||
{
|
||||
var optionInfo = restoreOptionFactory.CreateOptionInfo(optionKey, restoreDataObject);
|
||||
@@ -248,6 +250,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
||||
}
|
||||
|
||||
// After all options are set verify them all again to set the read only
|
||||
// Because some options can change the readonly mode of other options.( e.g Recovery state can affect StandBy to be readyonly)
|
||||
foreach (var optionKey in optionNames)
|
||||
{
|
||||
restoreOptionFactory.UpdateOption(optionKey, restoreDataObject, options[optionKey]);
|
||||
@@ -292,7 +295,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
||||
string error = restoreOptionFactory.ValidateOption(optionKey, restoreDataObject);
|
||||
if (!string.IsNullOrEmpty(error))
|
||||
{
|
||||
//TODO: we could send back the error message so client knows the option is set incorrectly
|
||||
//TODO: we could send back the error message so client knows the option is set incorrectly
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user