diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/Contracts/RestoreRequestParams.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/Contracts/RestoreRequestParams.cs index f66e6532..c882e34b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/Contracts/RestoreRequestParams.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/Contracts/RestoreRequestParams.cs @@ -147,6 +147,19 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts /// public TaskExecutionMode TaskExecutionMode { get; set; } + /// + /// Optional parameter which indicates whether to overwrite target database by source database name. + /// + internal bool OverwriteTargetDatabase + { + get + { + return Options.ContainsKey(RestoreOptionsHelper.OverwriteTargetDatabase) ? GetOptionValue(RestoreOptionsHelper.OverwriteTargetDatabase) : false; + } + set + { + SetOptionValue(RestoreOptionsHelper.OverwriteTargetDatabase, value); + } + } } - } diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs index afa1ebc7..97d45e90 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs @@ -177,10 +177,16 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery { ConnectionInfo connInfo; bool supported = IsBackupRestoreOperationSupported(restoreParams.OwnerUri, out connInfo); + + if (restoreParams.OverwriteTargetDatabase) + { + restoreParams.TargetDatabaseName = restoreParams.SourceDatabaseName; + } if (supported && connInfo != null) { RestoreDatabaseTaskDataObject restoreDataObject = this.restoreDatabaseService.CreateRestoreDatabaseTaskDataObject(restoreParams); + restoreDataObject.OverwriteTargetDatabase = restoreParams.OverwriteTargetDatabase; response = this.restoreDatabaseService.CreateRestorePlanResponse(restoreDataObject); } else diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs index e3bceebb..89a3759b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs @@ -54,7 +54,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation List SourceDbNames { get; } - bool CanChangeTargetDatabase { get; } + bool OverwriteTargetDatabase { get; set; } string DefaultTargetDbName { get; } string TargetDatabaseName { get; set; } @@ -161,13 +161,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation return Util.GetSourceDbNames(); } - public bool CanChangeTargetDatabase - { - get - { - return DatabaseUtils.IsSystemDatabaseConnection(Server.ConnectionContext.DatabaseName); - } - } + public bool OverwriteTargetDatabase { get; set; } public string DefaultTargetDbName { diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreOptionFactory.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreOptionFactory.cs index bc2206d9..76c5ae61 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreOptionFactory.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreOptionFactory.cs @@ -528,7 +528,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation { DefaultValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) => { - return restoreDataObject.CanChangeTargetDatabase ? restoreDataObject.DefaultSourceDbName : restoreDataObject.DefaultTargetDbName; + return restoreDataObject.OverwriteTargetDatabase ? restoreDataObject.DefaultSourceDbName : restoreDataObject.DefaultTargetDbName; }, CurrentValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject) => { diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs index 8a7ef197..c7be1d11 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs @@ -16,7 +16,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery //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, + StandbyFile, OverwriteTargetDatabase }; //The key names of restore info in the resquest of response @@ -80,6 +80,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery //The key name to use to set in the requst. If set to true, the backup files will be used to restore otherwise the source database name internal const string ReadHeaderFromMedia = "readHeaderFromMedia"; + //The key name to use to set in the requst. If set to true, the target database name will be overwritten by source database name + internal const string OverwriteTargetDatabase = "overwriteTargetDatabase"; + /// /// Creates the options metadata available for restore operations /// diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs index e2afd026..e0fee300 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs @@ -49,7 +49,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery public List SourceDbNames { get; set; } - public bool CanChangeTargetDatabase { get; set; } + public bool OverwriteTargetDatabase { get; set; } public string DefaultTargetDbName { get; set; } diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs index 3d026e26..b90e7796 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs @@ -336,7 +336,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery restoreDataObject.SourceDatabaseName = optionValues.GetOptionValue(RestoreOptionsHelper.SourceDatabaseName); restoreDataObject.TargetDatabaseName = optionValues.GetOptionValue(RestoreOptionsHelper.TargetDatabaseName); restoreDataObject.TailLogWithNoRecovery = optionValues.GetOptionValue("TailLogWithNoRecovery"); - restoreDataObject.CanChangeTargetDatabase = optionValues.GetOptionValue("CanChangeTargetDatabase"); + restoreDataObject.OverwriteTargetDatabase = optionValues.GetOptionValue("CanChangeTargetDatabase"); restoreDataObject.DefaultSourceDbName = optionValues.GetOptionValue("DefaultSourceDbName"); restoreDataObject.SourceDbNames = optionValues.GetOptionValue>("SourceDbNames"); restoreDataObject.DefaultTargetDbName = optionValues.GetOptionValue("DefaultTargetDbName");