mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-19 01:25:40 -05:00
Create DB work in-progress (#350)
* Stage changes to other machine * Stage changes * Update SMO to fix SMO missing Login bug on macOS
This commit is contained in:
@@ -12,11 +12,12 @@ using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Datasource admin task service class
|
||||
/// Admin task service class
|
||||
/// </summary>
|
||||
public class AdminService
|
||||
{
|
||||
@@ -24,6 +25,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
|
||||
|
||||
private static ConnectionService connectionService = null;
|
||||
|
||||
private static readonly ConcurrentDictionary<string, DatabaseTaskHelper> serverTaskHelperMap =
|
||||
new ConcurrentDictionary<string, DatabaseTaskHelper>();
|
||||
|
||||
private static DatabaseTaskHelper taskHelper;
|
||||
|
||||
/// <summary>
|
||||
/// Default, parameterless constructor.
|
||||
/// </summary>
|
||||
@@ -69,30 +75,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
|
||||
serviceHost.SetRequestHandler(DefaultDatabaseInfoRequest.Type, HandleDefaultDatabaseInfoRequest);
|
||||
}
|
||||
|
||||
private static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo)
|
||||
{
|
||||
XmlDocument xmlDoc = CreateDataContainerDocument(connInfo);
|
||||
char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray();
|
||||
CDataContainer dataContainer;
|
||||
|
||||
unsafe
|
||||
{
|
||||
fixed (char* passwordPtr = passwordArray)
|
||||
{
|
||||
dataContainer = new CDataContainer(
|
||||
CDataContainer.ServerType.SQL,
|
||||
connInfo.ConnectionDetails.ServerName,
|
||||
false,
|
||||
connInfo.ConnectionDetails.UserName,
|
||||
new System.Security.SecureString(passwordPtr, passwordArray.Length),
|
||||
xmlDoc.InnerXml);
|
||||
}
|
||||
}
|
||||
|
||||
var taskHelper = new DatabaseTaskHelper(dataContainer);
|
||||
return taskHelper;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle a request for the default database prototype info
|
||||
/// </summary>
|
||||
@@ -106,12 +88,87 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
|
||||
optionsParams.OwnerUri,
|
||||
out connInfo);
|
||||
|
||||
DatabaseTaskHelper taskHelper = CreateDatabaseTaskHelper(connInfo);
|
||||
if (taskHelper == null)
|
||||
{
|
||||
taskHelper = CreateDatabaseTaskHelper(connInfo);
|
||||
}
|
||||
|
||||
response.DefaultDatabaseInfo = DatabaseTaskHelper.DatabasePrototypeToDatabaseInfo(taskHelper.Prototype);
|
||||
await requestContext.SendResult(response);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles a create database request
|
||||
/// </summary>
|
||||
internal static async Task HandleCreateDatabaseRequest(
|
||||
CreateDatabaseParams databaseParams,
|
||||
RequestContext<CreateDatabaseResponse> requestContext)
|
||||
{
|
||||
var response = new DefaultDatabaseInfoResponse();
|
||||
ConnectionInfo connInfo;
|
||||
AdminService.ConnectionServiceInstance.TryFindConnection(
|
||||
databaseParams.OwnerUri,
|
||||
out connInfo);
|
||||
|
||||
if (taskHelper == null)
|
||||
{
|
||||
taskHelper = CreateDatabaseTaskHelper(connInfo);
|
||||
}
|
||||
|
||||
DatabasePrototype prototype = taskHelper.Prototype;
|
||||
DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype);
|
||||
|
||||
Database db = prototype.ApplyChanges();
|
||||
if (db != null)
|
||||
{
|
||||
taskHelper = null;
|
||||
}
|
||||
|
||||
await requestContext.SendResult(new CreateDatabaseResponse()
|
||||
{
|
||||
Result = true,
|
||||
TaskId = 0
|
||||
});
|
||||
}
|
||||
|
||||
private static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo)
|
||||
{
|
||||
XmlDocument xmlDoc = CreateDataContainerDocument(connInfo);
|
||||
char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray();
|
||||
CDataContainer dataContainer;
|
||||
|
||||
// check if the connection is using SQL Auth or Integrated Auth
|
||||
if (string.Equals(connInfo.ConnectionDetails.AuthenticationType, "SqlLogin", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
unsafe
|
||||
{
|
||||
fixed (char* passwordPtr = passwordArray)
|
||||
{
|
||||
dataContainer = new CDataContainer(
|
||||
CDataContainer.ServerType.SQL,
|
||||
connInfo.ConnectionDetails.ServerName,
|
||||
false,
|
||||
connInfo.ConnectionDetails.UserName,
|
||||
new System.Security.SecureString(passwordPtr, passwordArray.Length),
|
||||
xmlDoc.InnerXml);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dataContainer = new CDataContainer(
|
||||
CDataContainer.ServerType.SQL,
|
||||
connInfo.ConnectionDetails.ServerName,
|
||||
true,
|
||||
null,
|
||||
null,
|
||||
xmlDoc.InnerXml);
|
||||
}
|
||||
|
||||
var taskHelper = new DatabaseTaskHelper(dataContainer);
|
||||
return taskHelper;
|
||||
}
|
||||
|
||||
private static XmlDocument CreateDataContainerDocument(ConnectionInfo connInfo)
|
||||
{
|
||||
string xml =
|
||||
@@ -131,32 +188,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
|
||||
return xmlDoc;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles a create database request
|
||||
/// </summary>
|
||||
internal static async Task HandleCreateDatabaseRequest(
|
||||
CreateDatabaseParams databaseParams,
|
||||
RequestContext<CreateDatabaseResponse> requestContext)
|
||||
{
|
||||
var response = new DefaultDatabaseInfoResponse();
|
||||
ConnectionInfo connInfo;
|
||||
AdminService.ConnectionServiceInstance.TryFindConnection(
|
||||
databaseParams.OwnerUri,
|
||||
out connInfo);
|
||||
|
||||
DatabaseTaskHelper taskHelper = CreateDatabaseTaskHelper(connInfo);
|
||||
DatabasePrototype prototype = taskHelper.Prototype;
|
||||
DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype);
|
||||
|
||||
Database db = prototype.ApplyChanges();
|
||||
|
||||
await requestContext.SendResult(new CreateDatabaseResponse()
|
||||
{
|
||||
Result = true,
|
||||
TaskId = 0
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles a create login request
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user