mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-13 17:23:02 -05:00
Remove redundant usage of object URNs in database handler (#2245)
This commit is contained in:
@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
|
||||
{
|
||||
public class DetachDatabaseRequestParams : GeneralRequestDetails
|
||||
{
|
||||
/// <summary>
|
||||
/// SFC (SMO) URN identifying the object
|
||||
/// </summary>
|
||||
public string ObjectUrn { get; set; }
|
||||
/// <summary>
|
||||
/// The target database name.
|
||||
/// </summary>
|
||||
|
||||
@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
|
||||
{
|
||||
public class DropDatabaseRequestParams : GeneralRequestDetails
|
||||
{
|
||||
/// <summary>
|
||||
/// SFC (SMO) URN identifying the object
|
||||
/// </summary>
|
||||
public string ObjectUrn { get; set; }
|
||||
/// <summary>
|
||||
/// The target database name.
|
||||
/// </summary>
|
||||
|
||||
@@ -11,10 +11,6 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts
|
||||
{
|
||||
public class PurgeQueryStoreDataRequestParams : GeneralRequestDetails
|
||||
{
|
||||
/// <summary>
|
||||
/// SFC (SMO) URN identifying the object
|
||||
/// </summary>
|
||||
public string ObjectUrn { get; set; }
|
||||
/// <summary>
|
||||
/// The target database name.
|
||||
/// </summary>
|
||||
|
||||
@@ -24,6 +24,7 @@ using System.Collections.Specialized;
|
||||
using Microsoft.SqlTools.SqlCore.Utility;
|
||||
using System.Collections.Concurrent;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.SqlServer.Management.Sdk.Sfc;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
{
|
||||
@@ -196,7 +197,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
public override Task<InitializeViewResult> InitializeObjectView(InitializeViewRequestParams requestParams)
|
||||
{
|
||||
// create a default data context and database object
|
||||
using (var dataContainer = CreateDatabaseDataContainer(requestParams.ConnectionUri, requestParams.ObjectUrn, requestParams.IsNewObject, requestParams.Database))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(requestParams.ConnectionUri, requestParams.IsNewObject, requestParams.Database))
|
||||
{
|
||||
if (dataContainer.Server == null)
|
||||
{
|
||||
@@ -418,7 +419,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
public string Detach(DetachDatabaseRequestParams detachParams)
|
||||
{
|
||||
var sqlScript = string.Empty;
|
||||
using (var dataContainer = CreateDatabaseDataContainer(detachParams.ConnectionUri, detachParams.ObjectUrn, false, detachParams.Database))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(detachParams.ConnectionUri, false, detachParams.Database))
|
||||
{
|
||||
var smoDatabase = dataContainer.SqlDialogSubject as Database;
|
||||
if (smoDatabase != null)
|
||||
@@ -465,7 +466,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException($"Provided URN '{detachParams.ObjectUrn}' did not correspond to an existing database.");
|
||||
throw new InvalidOperationException($"Could not find database '{detachParams.Database}'.");
|
||||
}
|
||||
}
|
||||
return sqlScript;
|
||||
@@ -496,7 +497,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
{
|
||||
var sqlScript = string.Empty;
|
||||
ConnectionInfo connectionInfo = this.GetConnectionInfo(attachParams.ConnectionUri);
|
||||
using (var dataContainer = CreateDatabaseDataContainer(attachParams.ConnectionUri, null, true, null))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(attachParams.ConnectionUri, true, string.Empty))
|
||||
{
|
||||
var server = dataContainer.Server!;
|
||||
var originalExecuteMode = server.ConnectionContext.SqlExecutionModes;
|
||||
@@ -552,7 +553,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
public string Drop(DropDatabaseRequestParams dropParams)
|
||||
{
|
||||
var sqlScript = string.Empty;
|
||||
using (var dataContainer = CreateDatabaseDataContainer(dropParams.ConnectionUri, dropParams.ObjectUrn, false, dropParams.Database))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(dropParams.ConnectionUri, false, dropParams.Database))
|
||||
{
|
||||
var smoDatabase = dataContainer.SqlDialogSubject as Database;
|
||||
if (smoDatabase != null)
|
||||
@@ -624,7 +625,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException($"Provided URN '{dropParams.ObjectUrn}' did not correspond to an existing database.");
|
||||
throw new InvalidOperationException($"Could not find database '{dropParams.Database}'.");
|
||||
}
|
||||
}
|
||||
return sqlScript;
|
||||
@@ -636,7 +637,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
/// <param name="purgeParams"></param>
|
||||
public void PurgeQueryStoreData(PurgeQueryStoreDataRequestParams purgeParams)
|
||||
{
|
||||
using (var dataContainer = CreateDatabaseDataContainer(purgeParams.ConnectionUri, purgeParams.ObjectUrn, false, purgeParams.Database))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(purgeParams.ConnectionUri, false, purgeParams.Database))
|
||||
{
|
||||
var smoDatabase = dataContainer.SqlDialogSubject as Database;
|
||||
if (smoDatabase != null)
|
||||
@@ -646,25 +647,28 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
}
|
||||
}
|
||||
|
||||
private CDataContainer CreateDatabaseDataContainer(string connectionUri, string? objectURN, bool isNewDatabase, string? databaseName)
|
||||
private CDataContainer CreateDatabaseDataContainer(string connectionUri, bool isNewDatabase, string databaseName)
|
||||
{
|
||||
ConnectionInfo connectionInfo = this.GetConnectionInfo(connectionUri);
|
||||
var originalDatabaseName = connectionInfo.ConnectionDetails.DatabaseName;
|
||||
try
|
||||
{
|
||||
string objectURN;
|
||||
if (!isNewDatabase && !string.IsNullOrEmpty(databaseName))
|
||||
{
|
||||
connectionInfo.ConnectionDetails.DatabaseName = databaseName;
|
||||
objectURN = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Server/Database[@Name='{0}']", Urn.EscapeString(databaseName));
|
||||
}
|
||||
else
|
||||
{
|
||||
objectURN = "Server";
|
||||
}
|
||||
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connectionInfo, databaseExists: !isNewDatabase);
|
||||
if (dataContainer.Server == null)
|
||||
{
|
||||
throw new InvalidOperationException(serverNotExistsError);
|
||||
}
|
||||
if (string.IsNullOrEmpty(objectURN))
|
||||
{
|
||||
objectURN = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Server");
|
||||
}
|
||||
|
||||
dataContainer.SqlDialogSubject = dataContainer.Server.GetSmoObject(objectURN);
|
||||
return dataContainer;
|
||||
}
|
||||
@@ -681,7 +685,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
|
||||
throw new ArgumentException("Database name not provided.");
|
||||
}
|
||||
|
||||
using (var dataContainer = CreateDatabaseDataContainer(viewParams.ConnectionUri, viewParams.ObjectUrn, viewParams.IsNewObject, viewParams.Database))
|
||||
using (var dataContainer = CreateDatabaseDataContainer(viewParams.ConnectionUri, viewParams.IsNewObject, viewParams.Database))
|
||||
{
|
||||
if (dataContainer.Server == null)
|
||||
{
|
||||
|
||||
@@ -65,11 +65,11 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
try
|
||||
{
|
||||
// create and update
|
||||
var parametersForCreation = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, "master", true, SqlObjectType.Database, "", "");
|
||||
var parametersForCreation = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, testDatabase.Name, true, SqlObjectType.Database, "", "");
|
||||
await ObjectManagementTestUtils.SaveObject(parametersForCreation, testDatabase);
|
||||
Assert.That(DatabaseExists(testDatabase.Name!, server), $"Expected database '{testDatabase.Name}' was not created succesfully");
|
||||
|
||||
var parametersForUpdate = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, "master", false, SqlObjectType.Database, "", objUrn);
|
||||
var parametersForUpdate = ObjectManagementTestUtils.GetInitializeViewRequestParams(connectionResult.ConnectionInfo.OwnerUri, testDatabase.Name, false, SqlObjectType.Database, "", objUrn);
|
||||
await ObjectManagementTestUtils.SaveObject(parametersForUpdate, testDatabase);
|
||||
|
||||
// cleanup
|
||||
@@ -532,7 +532,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
var detachParams = new DetachDatabaseRequestParams()
|
||||
{
|
||||
ConnectionUri = connectionUri,
|
||||
ObjectUrn = objUrn,
|
||||
Database = testDatabase.Name,
|
||||
DropConnections = true,
|
||||
UpdateStatistics = true,
|
||||
GenerateScript = false
|
||||
@@ -596,7 +596,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
var detachParams = new DetachDatabaseRequestParams()
|
||||
{
|
||||
ConnectionUri = connectionUri,
|
||||
ObjectUrn = objUrn,
|
||||
Database = testDatabase.Name,
|
||||
DropConnections = false,
|
||||
UpdateStatistics = false,
|
||||
GenerateScript = true
|
||||
@@ -759,7 +759,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
var deleteParams = new DropDatabaseRequestParams()
|
||||
{
|
||||
ConnectionUri = connectionUri,
|
||||
ObjectUrn = objUrn,
|
||||
Database = testDatabase.Name,
|
||||
DropConnections = false,
|
||||
DeleteBackupHistory = false,
|
||||
GenerateScript = false
|
||||
@@ -802,7 +802,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
var deleteParams = new DropDatabaseRequestParams()
|
||||
{
|
||||
ConnectionUri = connectionUri,
|
||||
ObjectUrn = objUrn,
|
||||
Database = testDatabase.Name,
|
||||
DropConnections = false,
|
||||
DeleteBackupHistory = false,
|
||||
GenerateScript = true
|
||||
@@ -863,7 +863,10 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectManagement
|
||||
{
|
||||
if (db.Name == databaseName)
|
||||
{
|
||||
db.DropIfExists();
|
||||
// Set database to single user mode to close any active connections
|
||||
db.DatabaseOptions.UserAccess = SqlServer.Management.Smo.DatabaseUserAccess.Single;
|
||||
db.Alter(TerminationClause.RollbackTransactionsImmediately);
|
||||
db.Drop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user