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:
Karl Burtram
2017-05-15 18:48:04 -07:00
committed by GitHub
parent b26b7674b3
commit dc3cd9ea59
12 changed files with 109 additions and 61 deletions

View File

@@ -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>