From fc3cbe0a69735ff6ced824e5437c9b0cd29ac482 Mon Sep 17 00:00:00 2001 From: Leila Lali Date: Wed, 25 Oct 2017 10:22:03 -0700 Subject: [PATCH] Fix/restore options issues (#515) * fixed the bug with tail log option * fix the bug with the tail gate file name * closing connections before restore --- .../RestoreDatabaseTaskDataObject.cs | 15 ++++++----- .../RestoreOperation/RestoreUtil.cs | 10 +++---- .../SmoScriptableOperationWithFullDbAccess.cs | 27 ++++++++++++++++--- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs index d77fcbe8..391d1151 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs @@ -73,8 +73,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation private DatabaseRestorePlanner restorePlanner; private string tailLogBackupFile; private BackupSetsFilterInfo backupSetsFilterInfo = new BackupSetsFilterInfo(); - private bool? isTailLogBackupPossible = false; - private bool? isTailLogBackupWithNoRecoveryPossible = false; + private bool? isTailLogBackupPossible = null; + private bool? isTailLogBackupWithNoRecoveryPossible = null; private string backupMediaList = string.Empty; private Server server; @@ -520,6 +520,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { if (!isTailLogBackupPossible.HasValue) { + //TODO: get the value from DatabaseRestorePlanner.IsTailLogBackupPossible if (this.Server.Version.Major < 9 || String.IsNullOrEmpty(this.restorePlanner.DatabaseName)) { isTailLogBackupPossible = false; @@ -566,6 +567,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { if (!isTailLogBackupWithNoRecoveryPossible.HasValue) { + //TODO: get the value from DatabaseRestorePlanner.IsTailLogBackupWithNoRecoveryPossible string databaseName = this.RestorePlanner.DatabaseName; if (!IsTailLogBackupPossible) { @@ -748,11 +750,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { string currentDatabaseName = this.RestorePlanner.DatabaseName; this.RestorePlanner.DatabaseName = value; - - if (string.Compare(currentDatabaseName, value, StringComparison.InvariantCultureIgnoreCase) != 0) - { - ResetOptions(); - } } } } @@ -961,6 +958,10 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation this.RestorePlan = new RestorePlan(this.Server); this.Util.AddCredentialNameForUrlBackupSet(this.RestorePlan, this.CredentialName); } + else + { + ResetOptions(); + } } public bool ShouldCreateNewPlan() diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreUtil.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreUtil.cs index 86e3b30d..e69f5b45 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreUtil.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreUtil.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Data; using Microsoft.SqlServer.Management.Sdk.Sfc; using Microsoft.SqlServer.Management.Smo; +using System.Globalization; namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { @@ -57,16 +58,13 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { DateTime dt = DateTime.MinValue; - //TODO: the code is moved from ssms and used for restore differential backups - //Uncomment when restore operation for differential backups is supported - /* string query = "SELECT GETDATE()"; - DataSet dataset = this.server.ExecutionManager.ExecuteWithResults(query); + DataSet dataset = this.server.ExecutionManager.ConnectionContext.ExecuteWithResults(query); if (dataset != null && dataset.Tables.Count > 0 && dataset.Tables[0].Rows.Count > 0) { - dt = Convert.ToDateTime(dataset.Tables[0].Rows[0][0], SmoApplication.DefaultCulture); + dt = Convert.ToDateTime(dataset.Tables[0].Rows[0][0], CultureInfo.CurrentCulture); } - */ + return dt; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SmoScriptableOperationWithFullDbAccess.cs b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SmoScriptableOperationWithFullDbAccess.cs index 6e8a406f..a3c57c82 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SmoScriptableOperationWithFullDbAccess.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SmoScriptableOperationWithFullDbAccess.cs @@ -6,6 +6,7 @@ using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.Utility; +using System; namespace Microsoft.SqlTools.ServiceLayer.TaskServices { @@ -83,20 +84,38 @@ namespace Microsoft.SqlTools.ServiceLayer.TaskServices public bool GainAccessToDatabase() { + bool result = false; if (LockedDatabaseManager != null) { - return LockedDatabaseManager.GainFullAccessToDatabase(ServerName, DatabaseName); + result = LockedDatabaseManager.GainFullAccessToDatabase(ServerName, DatabaseName); } - return false; + if(result && SourceDatabas != null && string.Compare(DatabaseName , SourceDatabas, StringComparison.InvariantCultureIgnoreCase) != 0) + { + result = LockedDatabaseManager.GainFullAccessToDatabase(ServerName, SourceDatabas); + } + return result; } public bool ReleaseAccessToDatabase() { + bool result = false; if (LockedDatabaseManager != null) { - return LockedDatabaseManager.ReleaseAccess(ServerName, DatabaseName); + result = LockedDatabaseManager.ReleaseAccess(ServerName, DatabaseName); + } + if (result && SourceDatabas != null && string.Compare(DatabaseName, SourceDatabas, StringComparison.InvariantCultureIgnoreCase) != 0) + { + result = LockedDatabaseManager.ReleaseAccess(ServerName, SourceDatabas); + } + return result; + } + + private string SourceDatabas + { + get + { + return Server?.ConnectionContext.DatabaseName; } - return false; } } }