Skip to content

Commit

Permalink
fixed the bugs with creating new restore plan (#433)
Browse files Browse the repository at this point in the history
* fixed the bug with source db name not setting correctly when new plan created
  • Loading branch information
llali authored Aug 16, 2017
1 parent d6c6700 commit f95a652
Show file tree
Hide file tree
Showing 6 changed files with 389 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,13 @@ public RestorePlanResponse CreateRestorePlanResponse(RestoreDatabaseTaskDataObje
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));
Expand All @@ -191,16 +190,11 @@ public RestorePlanResponse CreateRestorePlanResponse(RestoreDatabaseTaskDataObje
});
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);
Expand Down Expand Up @@ -259,11 +253,11 @@ public RestoreDatabaseTaskDataObject CreateRestoreDatabaseTaskDataObject(Restore
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;
}

Expand Down Expand Up @@ -308,33 +302,24 @@ private RestoreDatabaseTaskDataObject CreateRestoreForNewSession(string ownerUri
/// <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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
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
{
Expand Down Expand Up @@ -43,6 +44,19 @@ public interface IRestoreDatabaseTaskDataObject
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
Expand All @@ -56,6 +70,7 @@ public class RestoreDatabaseTaskDataObject : IRestoreDatabaseTaskDataObject
private BackupSetsFilterInfo backupSetsFilterInfo = new BackupSetsFilterInfo();
private bool? isTailLogBackupPossible = false;
private bool? isTailLogBackupWithNoRecoveryPossible = false;
private string backupMediaList = string.Empty;

public RestoreDatabaseTaskDataObject(Server server, String databaseName)
{
Expand Down Expand Up @@ -95,11 +110,11 @@ public RestoreDatabaseTaskDataObject(Server server, String databaseName)
/// </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
{
Expand All @@ -121,9 +136,19 @@ public bool IsValid
/// 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>
Expand All @@ -135,6 +160,23 @@ public List<String> GetDatabaseNamesWithBackupSets()
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>
Expand All @@ -154,6 +196,7 @@ public List<String> GetDatabaseNamesWithBackupSets()
/// <param name="filePaths"></param>
public void AddFiles(string filePaths)
{
backupMediaList = filePaths;
PlanUpdateRequired = true;
if (!string.IsNullOrWhiteSpace(filePaths))
{
Expand Down Expand Up @@ -634,16 +677,40 @@ internal set
/// <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>
Expand Down Expand Up @@ -682,10 +749,10 @@ public BackupTimeLine.TimeLineDuration TimeLineDuration
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;
}
Expand Down Expand Up @@ -798,13 +865,8 @@ private void ResetOptions()
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;
Expand All @@ -820,24 +882,41 @@ public void UpdateRestorePlan()
{
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);
}
}
if (this.restorePlan == null)
{
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();
}
Expand All @@ -863,9 +942,9 @@ private void SetRestorePlanProperties(RestorePlan rp)
}
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)
Expand Down
Loading

0 comments on commit f95a652

Please sign in to comment.