Catch Request/Event handler errors at dispatcher level (#1610)

* Catch Request/Event handler errors at dispatcher level

* Fix tests

* Use Exception overload of SendError

* Fix tests
This commit is contained in:
Charles Gagnon
2022-07-29 17:31:36 -07:00
committed by GitHub
parent 3294a52ad9
commit fd00114a0e
32 changed files with 1326 additions and 1921 deletions

View File

@@ -1,4 +1,4 @@
// //
// Copyright (c) Microsoft. All rights reserved. // Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
// //
@@ -50,7 +50,7 @@ namespace Microsoft.SqlTools.Credentials
/// </summary> /// </summary>
private CredentialService() private CredentialService()
: this(null, new StoreConfig() : this(null, new StoreConfig()
{ CredentialFolder = DefaultSecretsFolder, CredentialFile = DefaultSecretsFile, IsRelativeToUserHomeDir = true}) { CredentialFolder = DefaultSecretsFolder, CredentialFile = DefaultSecretsFile, IsRelativeToUserHomeDir = true })
{ {
} }
@@ -67,12 +67,12 @@ namespace Microsoft.SqlTools.Credentials
/// </summary> /// </summary>
internal static ICredentialStore GetStoreForOS(StoreConfig config) internal static ICredentialStore GetStoreForOS(StoreConfig config)
{ {
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{ {
return new Win32CredentialStore(); return new Win32CredentialStore();
} }
#if !WINDOWS_ONLY_BUILD #if !WINDOWS_ONLY_BUILD
else if(RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{ {
return new OSXCredentialStore(); return new OSXCredentialStore();
} }
@@ -161,16 +161,8 @@ namespace Microsoft.SqlTools.Credentials
private async Task HandleRequest<T>(Func<Task<T>> handler, RequestContext<T> requestContext, string requestType) private async Task HandleRequest<T>(Func<Task<T>> handler, RequestContext<T> requestContext, string requestType)
{ {
Logger.Write(TraceEventType.Verbose, requestType); Logger.Write(TraceEventType.Verbose, requestType);
T result = await handler();
try await requestContext.SendResult(result);
{
T result = await handler();
await requestContext.SendResult(result);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
} }
} }

View File

@@ -131,20 +131,29 @@ namespace Microsoft.SqlTools.Hosting.Protocol
requestMessage, requestMessage,
messageWriter); messageWriter);
TParams typedParams = default(TParams); try
if (requestMessage.Contents != null)
{ {
try TParams typedParams = default(TParams);
if (requestMessage.Contents != null)
{ {
typedParams = requestMessage.Contents.ToObject<TParams>(); try
} {
catch (Exception ex) typedParams = requestMessage.Contents.ToObject<TParams>();
{ }
await requestContext.SendError(ex.Message); catch (Exception ex)
{
throw new Exception($"{requestType.MethodName} : Error parsing message contents {requestMessage.Contents}", ex);
}
} }
await requestHandler(typedParams, requestContext);
}
catch (Exception ex)
{
Logger.Error(ex);
await requestContext.SendError(ex);
} }
await requestHandler(typedParams, requestContext);
}); });
}); });
} }
@@ -178,20 +187,27 @@ namespace Microsoft.SqlTools.Hosting.Protocol
{ {
var eventContext = new EventContext(messageWriter); var eventContext = new EventContext(messageWriter);
TParams typedParams = default(TParams); try
if (eventMessage.Contents != null)
{ {
try TParams typedParams = default(TParams);
if (eventMessage.Contents != null)
{ {
typedParams = eventMessage.Contents.ToObject<TParams>(); try
} {
catch (Exception ex) typedParams = eventMessage.Contents.ToObject<TParams>();
{ }
Logger.Write(TraceEventType.Verbose, ex.ToString()); catch (Exception ex)
{
throw new Exception($"{eventType.MethodName} : Error parsing message contents {eventMessage.Contents}", ex);
}
} }
await eventHandler(typedParams, eventContext);
}
catch (Exception ex)
{
// There's nothing on the client side to send an error back to so just log the error and move on
Logger.Error(ex);
} }
await eventHandler(typedParams, eventContext);
}); });
}); });
} }

View File

@@ -263,6 +263,12 @@ namespace Microsoft.SqlTools.Utility
/// <param name="logMessage">The message text to be written.</param> /// <param name="logMessage">The message text to be written.</param>
public static void Error(string logMessage) => Write(TraceEventType.Error, logMessage); public static void Error(string logMessage) => Write(TraceEventType.Error, logMessage);
/// <summary>
/// Writes an exception to the log file with the Error event level
/// </summary>
/// <param name="exception"></param>
public static void Error(Exception exception) => Write(TraceEventType.Error, exception.ToString());
/// <summary> /// <summary>
/// Writes a message to the log file with the Critical event level /// Writes a message to the log file with the Critical event level
/// </summary> /// </summary>

View File

@@ -135,11 +135,6 @@ namespace Microsoft.SqlTools.ResourceProvider.Core
await requestContext.SendError(ex.Message); await requestContext.SendError(ex.Message);
} }
} }
catch (Exception ex)
{
// Send just the error message back for now as stack trace isn't useful
await requestContext.SendError(ex.Message);
}
} }
} }
} }

View File

@@ -81,23 +81,16 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
DefaultDatabaseInfoParams optionsParams, DefaultDatabaseInfoParams optionsParams,
RequestContext<DefaultDatabaseInfoResponse> requestContext) RequestContext<DefaultDatabaseInfoResponse> requestContext)
{ {
try var response = new DefaultDatabaseInfoResponse();
{ ConnectionInfo connInfo;
var response = new DefaultDatabaseInfoResponse(); AdminService.ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; optionsParams.OwnerUri,
AdminService.ConnectionServiceInstance.TryFindConnection( out connInfo);
optionsParams.OwnerUri,
out connInfo);
using (var taskHelper = CreateDatabaseTaskHelper(connInfo)) using (var taskHelper = CreateDatabaseTaskHelper(connInfo))
{
response.DefaultDatabaseInfo = DatabaseTaskHelper.DatabasePrototypeToDatabaseInfo(taskHelper.Prototype);
await requestContext.SendResult(response);
}
}
catch (Exception ex)
{ {
await requestContext.SendError(ex.ToString()); response.DefaultDatabaseInfo = DatabaseTaskHelper.DatabasePrototypeToDatabaseInfo(taskHelper.Prototype);
await requestContext.SendResult(response);
} }
} }
@@ -108,31 +101,24 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
CreateDatabaseParams databaseParams, CreateDatabaseParams databaseParams,
RequestContext<CreateDatabaseResponse> requestContext) RequestContext<CreateDatabaseResponse> requestContext)
{ {
try var response = new DefaultDatabaseInfoResponse();
{ ConnectionInfo connInfo;
var response = new DefaultDatabaseInfoResponse(); AdminService.ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; databaseParams.OwnerUri,
AdminService.ConnectionServiceInstance.TryFindConnection( out connInfo);
databaseParams.OwnerUri,
out connInfo);
using (var taskHelper = CreateDatabaseTaskHelper(connInfo)) using (var taskHelper = CreateDatabaseTaskHelper(connInfo))
{
DatabasePrototype prototype = taskHelper.Prototype;
DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype);
Database db = prototype.ApplyChanges();
await requestContext.SendResult(new CreateDatabaseResponse()
{ {
DatabasePrototype prototype = taskHelper.Prototype; Result = true,
DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype); TaskId = 0
});
Database db = prototype.ApplyChanges();
await requestContext.SendResult(new CreateDatabaseResponse()
{
Result = true,
TaskId = 0
});
}
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
} }
} }
@@ -143,37 +129,29 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
GetDatabaseInfoParams databaseParams, GetDatabaseInfoParams databaseParams,
RequestContext<GetDatabaseInfoResponse> requestContext) RequestContext<GetDatabaseInfoResponse> requestContext)
{ {
try Func<Task> requestHandler = async () =>
{ {
Func<Task> requestHandler = async () => ConnectionInfo connInfo;
AdminService.ConnectionServiceInstance.TryFindConnection(
databaseParams.OwnerUri,
out connInfo);
DatabaseInfo info = null;
if (connInfo != null)
{ {
ConnectionInfo connInfo; info = GetDatabaseInfo(connInfo);
AdminService.ConnectionServiceInstance.TryFindConnection( }
databaseParams.OwnerUri,
out connInfo);
DatabaseInfo info = null;
if (connInfo != null) await requestContext.SendResult(new GetDatabaseInfoResponse()
{
info = GetDatabaseInfo(connInfo);
}
await requestContext.SendResult(new GetDatabaseInfoResponse()
{
DatabaseInfo = info
});
};
Task task = Task.Run(async () => await requestHandler()).ContinueWithOnFaulted(async t =>
{ {
await requestContext.SendError(t.Exception.ToString()); DatabaseInfo = info
}); });
};
} Task task = Task.Run(async () => await requestHandler()).ContinueWithOnFaulted(async t =>
catch (Exception ex)
{ {
await requestContext.SendError(ex.ToString()); await requestContext.SendError(t.Exception.ToString());
} });
} }
/// <summary> /// <summary>

View File

@@ -148,38 +148,31 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
/// </summary> /// </summary>
internal async Task HandleAgentJobsRequest(AgentJobsParams parameters, RequestContext<AgentJobsResult> requestContext) internal async Task HandleAgentJobsRequest(AgentJobsParams parameters, RequestContext<AgentJobsResult> requestContext)
{ {
try var result = new AgentJobsResult();
{ ConnectionInfo connInfo;
var result = new AgentJobsResult(); ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; parameters.OwnerUri,
ConnectionServiceInstance.TryFindConnection( out connInfo);
parameters.OwnerUri,
out connInfo);
if (connInfo != null) if (connInfo != null)
{
var serverConnection = ConnectionService.OpenServerConnection(connInfo);
var fetcher = new JobFetcher(serverConnection);
var filter = new JobActivityFilter();
var jobs = fetcher.FetchJobs(filter);
var agentJobs = new List<AgentJobInfo>();
if (jobs != null)
{
foreach (var job in jobs.Values)
{
agentJobs.Add(AgentUtilities.ConvertToAgentJobInfo(job));
}
}
result.Success = true;
result.Jobs = agentJobs.ToArray();
serverConnection.SqlConnectionObject.Close();
}
await requestContext.SendResult(result);
}
catch (Exception e)
{ {
await requestContext.SendError(e); var serverConnection = ConnectionService.OpenServerConnection(connInfo);
var fetcher = new JobFetcher(serverConnection);
var filter = new JobActivityFilter();
var jobs = fetcher.FetchJobs(filter);
var agentJobs = new List<AgentJobInfo>();
if (jobs != null)
{
foreach (var job in jobs.Values)
{
agentJobs.Add(AgentUtilities.ConvertToAgentJobInfo(job));
}
}
result.Success = true;
result.Jobs = agentJobs.ToArray();
serverConnection.SqlConnectionObject.Close();
} }
await requestContext.SendResult(result);
} }
/// <summary> /// <summary>
@@ -187,79 +180,72 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
/// </summary> /// </summary>
internal async Task HandleJobHistoryRequest(AgentJobHistoryParams parameters, RequestContext<AgentJobHistoryResult> requestContext) internal async Task HandleJobHistoryRequest(AgentJobHistoryParams parameters, RequestContext<AgentJobHistoryResult> requestContext)
{ {
try var result = new AgentJobHistoryResult();
ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
var result = new AgentJobHistoryResult(); CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true);
ConnectionInfo connInfo; var jobServer = dataContainer.Server.JobServer;
ConnectionServiceInstance.TryFindConnection( var jobs = jobServer.Jobs;
parameters.OwnerUri, Tuple<SqlConnectionInfo, DataTable, ServerConnection> tuple = CreateSqlConnection(connInfo, parameters.JobId);
out connInfo); SqlConnectionInfo sqlConnInfo = tuple.Item1;
if (connInfo != null) DataTable dt = tuple.Item2;
ServerConnection connection = tuple.Item3;
// Send Steps, Alerts and Schedules with job history in background
// Add steps to the job if any
JobStepCollection steps = jobs[parameters.JobName].JobSteps;
var jobSteps = new List<AgentJobStepInfo>();
foreach (JobStep step in steps)
{ {
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true); jobSteps.Add(AgentUtilities.ConvertToAgentJobStepInfo(step, parameters.JobId, parameters.JobName));
var jobServer = dataContainer.Server.JobServer;
var jobs = jobServer.Jobs;
Tuple<SqlConnectionInfo, DataTable, ServerConnection> tuple = CreateSqlConnection(connInfo, parameters.JobId);
SqlConnectionInfo sqlConnInfo = tuple.Item1;
DataTable dt = tuple.Item2;
ServerConnection connection = tuple.Item3;
// Send Steps, Alerts and Schedules with job history in background
// Add steps to the job if any
JobStepCollection steps = jobs[parameters.JobName].JobSteps;
var jobSteps = new List<AgentJobStepInfo>();
foreach (JobStep step in steps)
{
jobSteps.Add(AgentUtilities.ConvertToAgentJobStepInfo(step, parameters.JobId, parameters.JobName));
}
result.Steps = jobSteps.ToArray();
// Add schedules to the job if any
JobScheduleCollection schedules = jobs[parameters.JobName].JobSchedules;
var jobSchedules = new List<AgentScheduleInfo>();
foreach (JobSchedule schedule in schedules)
{
jobSchedules.Add(AgentUtilities.ConvertToAgentScheduleInfo(schedule));
}
result.Schedules = jobSchedules.ToArray();
// Alerts
AlertCollection alerts = jobServer.Alerts;
var jobAlerts = new List<Alert>();
foreach (Alert alert in alerts)
{
if (alert.JobName == parameters.JobName)
{
jobAlerts.Add(alert);
}
}
result.Alerts = AgentUtilities.ConvertToAgentAlertInfo(jobAlerts);
// Add histories
int count = dt.Rows.Count;
List<AgentJobHistoryInfo> jobHistories = new List<AgentJobHistoryInfo>();
if (count > 0)
{
var job = dt.Rows[0];
Guid jobId = (Guid)job[AgentUtilities.UrnJobId];
int runStatus = Convert.ToInt32(job[AgentUtilities.UrnRunStatus], System.Globalization.CultureInfo.InvariantCulture);
var t = new LogSourceJobHistory(parameters.JobName, sqlConnInfo, null, runStatus, jobId, null);
var tlog = t as ILogSource;
tlog.Initialize();
var logEntries = t.LogEntries;
// Finally add the job histories
jobHistories = AgentUtilities.ConvertToAgentJobHistoryInfo(logEntries, job, steps);
result.Histories = jobHistories.ToArray();
result.Success = true;
tlog.CloseReader();
}
await requestContext.SendResult(result);
} }
} result.Steps = jobSteps.ToArray();
catch (Exception e)
{ // Add schedules to the job if any
await requestContext.SendError(e); JobScheduleCollection schedules = jobs[parameters.JobName].JobSchedules;
var jobSchedules = new List<AgentScheduleInfo>();
foreach (JobSchedule schedule in schedules)
{
jobSchedules.Add(AgentUtilities.ConvertToAgentScheduleInfo(schedule));
}
result.Schedules = jobSchedules.ToArray();
// Alerts
AlertCollection alerts = jobServer.Alerts;
var jobAlerts = new List<Alert>();
foreach (Alert alert in alerts)
{
if (alert.JobName == parameters.JobName)
{
jobAlerts.Add(alert);
}
}
result.Alerts = AgentUtilities.ConvertToAgentAlertInfo(jobAlerts);
// Add histories
int count = dt.Rows.Count;
List<AgentJobHistoryInfo> jobHistories = new List<AgentJobHistoryInfo>();
if (count > 0)
{
var job = dt.Rows[0];
Guid jobId = (Guid)job[AgentUtilities.UrnJobId];
int runStatus = Convert.ToInt32(job[AgentUtilities.UrnRunStatus], System.Globalization.CultureInfo.InvariantCulture);
var t = new LogSourceJobHistory(parameters.JobName, sqlConnInfo, null, runStatus, jobId, null);
var tlog = t as ILogSource;
tlog.Initialize();
var logEntries = t.LogEntries;
// Finally add the job histories
jobHistories = AgentUtilities.ConvertToAgentJobHistoryInfo(logEntries, job, steps);
result.Histories = jobHistories.ToArray();
result.Success = true;
tlog.CloseReader();
}
await requestContext.SendResult(result);
} }
} }

View File

@@ -42,39 +42,32 @@ namespace Microsoft.SqlTools.ServiceLayer.AzureBlob
CreateSasParams optionsParams, CreateSasParams optionsParams,
RequestContext<CreateSasResponse> requestContext) RequestContext<CreateSasResponse> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionService.Instance.TryFindConnection(
optionsParams.OwnerUri,
out connInfo);
var response = new CreateSasResponse();
if (connInfo == null)
{ {
ConnectionInfo connInfo; await requestContext.SendError(SR.ConnectionServiceListDbErrorNotConnected(optionsParams.OwnerUri));
ConnectionService.Instance.TryFindConnection( return;
optionsParams.OwnerUri,
out connInfo);
var response = new CreateSasResponse();
if (connInfo == null)
{
await requestContext.SendError(SR.ConnectionServiceListDbErrorNotConnected(optionsParams.OwnerUri));
return;
}
if (connInfo.IsCloud)
{
await requestContext.SendError(SR.NotSupportedCloudCreateSas);
return;
}
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "AzureBlob"))
{
// Connection gets disconnected when backup is done
ServerConnection serverConnection = new ServerConnection(sqlConn);
Server sqlServer = new Server(serverConnection);
SharedAccessSignatureCreator sharedAccessSignatureCreator = new SharedAccessSignatureCreator(sqlServer);
string sharedAccessSignature = sharedAccessSignatureCreator.CreateSqlSASCredential(optionsParams.StorageAccountName, optionsParams.BlobContainerKey, optionsParams.BlobContainerUri, optionsParams.ExpirationDate);
response.SharedAccessSignature = sharedAccessSignature;
await requestContext.SendResult(response);
}
} }
catch (Exception ex) if (connInfo.IsCloud)
{ {
await requestContext.SendError(ex); await requestContext.SendError(SR.NotSupportedCloudCreateSas);
return;
}
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "AzureBlob"))
{
// Connection gets disconnected when backup is done
ServerConnection serverConnection = new ServerConnection(sqlConn);
Server sqlServer = new Server(serverConnection);
SharedAccessSignatureCreator sharedAccessSignatureCreator = new SharedAccessSignatureCreator(sqlServer);
string sharedAccessSignature = sharedAccessSignatureCreator.CreateSqlSASCredential(optionsParams.StorageAccountName, optionsParams.BlobContainerKey, optionsParams.BlobContainerUri, optionsParams.ExpirationDate);
response.SharedAccessSignature = sharedAccessSignature;
await requestContext.SendResult(response);
} }
} }
} }

View File

@@ -41,17 +41,10 @@ namespace Microsoft.SqlTools.ServiceLayer.AzureFunctions
/// </summary> /// </summary>
public async Task HandleAddSqlBindingRequest(AddSqlBindingParams parameters, RequestContext<ResultStatus> requestContext) public async Task HandleAddSqlBindingRequest(AddSqlBindingParams parameters, RequestContext<ResultStatus> requestContext)
{ {
try AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
{ ResultStatus result = operation.AddBinding();
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
await requestContext.SendResult(result); await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>
@@ -59,17 +52,10 @@ namespace Microsoft.SqlTools.ServiceLayer.AzureFunctions
/// </summary> /// </summary>
public async Task HandleGetAzureFunctionsRequest(GetAzureFunctionsParams parameters, RequestContext<GetAzureFunctionsResult> requestContext) public async Task HandleGetAzureFunctionsRequest(GetAzureFunctionsParams parameters, RequestContext<GetAzureFunctionsResult> requestContext)
{ {
try GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
{ GetAzureFunctionsResult result = operation.GetAzureFunctions();
GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
GetAzureFunctionsResult result = operation.GetAzureFunctions();
await requestContext.SendResult(result); await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
} }
} }

View File

@@ -54,240 +54,197 @@ namespace Microsoft.SqlTools.ServiceLayer.Cms
public async Task HandleCreateCentralManagementServerRequest(CreateCentralManagementServerParams createCmsParams, RequestContext<ListRegisteredServersResult> requestContext) public async Task HandleCreateCentralManagementServerRequest(CreateCentralManagementServerParams createCmsParams, RequestContext<ListRegisteredServersResult> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleCreateCentralManagementServerRequest"); Logger.Write(TraceEventType.Verbose, "HandleCreateCentralManagementServerRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try //Validate params and connect
{ ServerConnection conn = await ValidateAndCreateConnection(createCmsParams.ConnectParams);
//Validate params and connect
ServerConnection conn = await ValidateAndCreateConnection(createCmsParams.ConnectParams);
// Get Current Reg Servers on CMS // Get Current Reg Servers on CMS
RegisteredServersStore store = new RegisteredServersStore(conn); RegisteredServersStore store = new RegisteredServersStore(conn);
ServerGroup parentGroup = store.DatabaseEngineServerGroup; ServerGroup parentGroup = store.DatabaseEngineServerGroup;
ListRegisteredServersResult result = GetChildrenfromParentGroup(parentGroup); ListRegisteredServersResult result = GetChildrenfromParentGroup(parentGroup);
if (result != null) if (result != null)
{
await requestContext.SendResult(result);
return;
}
}
catch (Exception ex)
{ {
// Exception related to connection/creation will only be caught here. Note that the outer catch will not catch them await requestContext.SendResult(result);
await requestContext.SendError(ex); return;
} }
}); }
} catch (Exception ex)
catch (Exception e) {
{ // Exception related to connection/creation will only be caught here. Note that the outer catch will not catch them
// Exception related to run task will be captured here await requestContext.SendError(ex);
await requestContext.SendError(e); }
} });
} }
public async Task HandleAddRegisteredServerRequest(AddRegisteredServerParams cmsCreateParams, RequestContext<bool> requestContext) public async Task HandleAddRegisteredServerRequest(AddRegisteredServerParams cmsCreateParams, RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleAddRegisteredServerRequest"); Logger.Write(TraceEventType.Verbose, "HandleAddRegisteredServerRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try ServerConnection serverConn = ValidateAndCreateConnection(cmsCreateParams.ParentOwnerUri);
if (serverConn != null)
{ {
ServerConnection serverConn = ValidateAndCreateConnection(cmsCreateParams.ParentOwnerUri); // Get Current Reg Servers
if (serverConn != null) RegisteredServersStore store = new RegisteredServersStore(serverConn);
{ ServerGroup parentGroup = NavigateToServerGroup(store, cmsCreateParams.RelativePath);
// Get Current Reg Servers RegisteredServerCollection servers = parentGroup.RegisteredServers;
RegisteredServersStore store = new RegisteredServersStore(serverConn); // Add the new server (intentionally not cheching existence to reuse the exception message)
ServerGroup parentGroup = NavigateToServerGroup(store, cmsCreateParams.RelativePath); RegisteredServer registeredServer = new RegisteredServer(parentGroup, cmsCreateParams.RegisteredServerName);
RegisteredServerCollection servers = parentGroup.RegisteredServers; registeredServer.Description = cmsCreateParams.RegisteredServerDescription;
// Add the new server (intentionally not cheching existence to reuse the exception message) registeredServer.ConnectionString = serverConn.ConnectionString;
RegisteredServer registeredServer = new RegisteredServer(parentGroup, cmsCreateParams.RegisteredServerName); registeredServer.ServerName = cmsCreateParams.RegisteredServerConnectionDetails.ServerName;
registeredServer.Description = cmsCreateParams.RegisteredServerDescription; registeredServer.Create();
registeredServer.ConnectionString = serverConn.ConnectionString; await requestContext.SendResult(true);
registeredServer.ServerName = cmsCreateParams.RegisteredServerConnectionDetails.ServerName;
registeredServer.Create();
await requestContext.SendResult(true);
}
else
{
await requestContext.SendResult(false);
}
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); await requestContext.SendResult(false);
} }
}); }
} catch (Exception e)
catch (Exception e) {
{ await requestContext.SendError(e);
await requestContext.SendError(e); }
} });
} }
public async Task HandleListRegisteredServersRequest(ListRegisteredServersParams listServerParams, RequestContext<ListRegisteredServersResult> requestContext) public async Task HandleListRegisteredServersRequest(ListRegisteredServersParams listServerParams, RequestContext<ListRegisteredServersResult> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleListRegisteredServersRequest"); Logger.Write(TraceEventType.Verbose, "HandleListRegisteredServersRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try //Validate and create connection
{ ServerConnection serverConn = ValidateAndCreateConnection(listServerParams.ParentOwnerUri);
//Validate and create connection
ServerConnection serverConn = ValidateAndCreateConnection(listServerParams.ParentOwnerUri);
if (serverConn != null) if (serverConn != null)
{
// Get registered Servers
RegisteredServersStore store = new RegisteredServersStore(serverConn);
ServerGroup parentGroup = NavigateToServerGroup(store, listServerParams.RelativePath);
ListRegisteredServersResult result = GetChildrenfromParentGroup(parentGroup);
await requestContext.SendResult(result);
}
else
{
await requestContext.SendResult(null);
}
}
catch (Exception e)
{ {
await requestContext.SendError(e); // Get registered Servers
RegisteredServersStore store = new RegisteredServersStore(serverConn);
ServerGroup parentGroup = NavigateToServerGroup(store, listServerParams.RelativePath);
ListRegisteredServersResult result = GetChildrenfromParentGroup(parentGroup);
await requestContext.SendResult(result);
} }
}); else
} {
catch (Exception e) await requestContext.SendResult(null);
{ }
await requestContext.SendError(e); }
} catch (Exception e)
{
await requestContext.SendError(e);
}
});
} }
public async Task HandleRemoveRegisteredServerRequest(RemoveRegisteredServerParams removeServerParams, RequestContext<bool> requestContext) public async Task HandleRemoveRegisteredServerRequest(RemoveRegisteredServerParams removeServerParams, RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleRemoveServerRequest"); Logger.Write(TraceEventType.Verbose, "HandleRemoveServerRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try // Validate and Connect
ServerConnection serverConn = ValidateAndCreateConnection(removeServerParams.ParentOwnerUri);
if (serverConn != null)
{ {
// Validate and Connect // Get list of registered Servers
ServerConnection serverConn = ValidateAndCreateConnection(removeServerParams.ParentOwnerUri); RegisteredServersStore store = new RegisteredServersStore(serverConn);
if (serverConn != null) ServerGroup parentGroup = NavigateToServerGroup(store, removeServerParams.RelativePath, false);
if (parentGroup != null)
{ {
// Get list of registered Servers RegisteredServer regServ = parentGroup.RegisteredServers.OfType<RegisteredServer>().FirstOrDefault(r => r.Name == removeServerParams.RegisteredServerName); // since duplicates are not allowed
RegisteredServersStore store = new RegisteredServersStore(serverConn); regServ?.Drop();
ServerGroup parentGroup = NavigateToServerGroup(store, removeServerParams.RelativePath, false); await requestContext.SendResult(true);
if (parentGroup != null)
{
RegisteredServer regServ = parentGroup.RegisteredServers.OfType<RegisteredServer>().FirstOrDefault(r => r.Name == removeServerParams.RegisteredServerName); // since duplicates are not allowed
regServ?.Drop();
await requestContext.SendResult(true);
}
}
else
{
await requestContext.SendResult(false);
} }
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); await requestContext.SendResult(false);
} }
}); }
} catch (Exception e)
catch (Exception e) {
{ await requestContext.SendError(e);
await requestContext.SendError(e); }
} });
} }
public async Task HandleAddServerGroupRequest(AddServerGroupParams addServerGroupParams, RequestContext<bool> requestContext) public async Task HandleAddServerGroupRequest(AddServerGroupParams addServerGroupParams, RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleAddServerGroupRequest"); Logger.Write(TraceEventType.Verbose, "HandleAddServerGroupRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try ServerConnection serverConn = ValidateAndCreateConnection(addServerGroupParams.ParentOwnerUri);
if (serverConn != null)
{ {
ServerConnection serverConn = ValidateAndCreateConnection(addServerGroupParams.ParentOwnerUri); ServerGroup parentGroup;
if (serverConn != null) RegisteredServersStore store = new RegisteredServersStore(serverConn);
// It's a CMS server
if (string.IsNullOrEmpty(addServerGroupParams.RelativePath))
{ {
ServerGroup parentGroup; parentGroup = store.DatabaseEngineServerGroup;
RegisteredServersStore store = new RegisteredServersStore(serverConn);
// It's a CMS server
if (string.IsNullOrEmpty(addServerGroupParams.RelativePath))
{
parentGroup = store.DatabaseEngineServerGroup;
}
else
{
parentGroup = NavigateToServerGroup(store, addServerGroupParams.RelativePath);
}
// Add the new group (intentionally not cheching existence to reuse the exception message)
ServerGroup serverGroup = new ServerGroup(parentGroup, addServerGroupParams.GroupName)
{
Description = addServerGroupParams.GroupDescription
};
serverGroup.Create();
await requestContext.SendResult(true);
} }
else else
{ {
await requestContext.SendResult(false); parentGroup = NavigateToServerGroup(store, addServerGroupParams.RelativePath);
} }
// Add the new group (intentionally not cheching existence to reuse the exception message)
ServerGroup serverGroup = new ServerGroup(parentGroup, addServerGroupParams.GroupName)
{
Description = addServerGroupParams.GroupDescription
};
serverGroup.Create();
await requestContext.SendResult(true);
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); await requestContext.SendResult(false);
} }
}); }
} catch (Exception e)
catch (Exception e) {
{ await requestContext.SendError(e);
await requestContext.SendError(e); }
} });
} }
public async Task HandleRemoveServerGroupRequest(RemoveServerGroupParams removeServerGroupParams, RequestContext<bool> requestContext) public async Task HandleRemoveServerGroupRequest(RemoveServerGroupParams removeServerGroupParams, RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleRemoveServerGroupRequest"); Logger.Write(TraceEventType.Verbose, "HandleRemoveServerGroupRequest");
try CmsTask = Task.Run(async () =>
{ {
CmsTask = Task.Run(async () => try
{ {
try ServerConnection serverConn = ValidateAndCreateConnection(removeServerGroupParams.ParentOwnerUri);
if (serverConn != null)
{ {
ServerConnection serverConn = ValidateAndCreateConnection(removeServerGroupParams.ParentOwnerUri); RegisteredServersStore store = new RegisteredServersStore(serverConn);
if (serverConn != null)
{
RegisteredServersStore store = new RegisteredServersStore(serverConn);
ServerGroup parentGroup = NavigateToServerGroup(store, removeServerGroupParams.RelativePath, false); ServerGroup parentGroup = NavigateToServerGroup(store, removeServerGroupParams.RelativePath, false);
ServerGroup serverGrouptoRemove = parentGroup.ServerGroups.OfType<ServerGroup>().FirstOrDefault(r => r.Name == removeServerGroupParams.GroupName); // since duplicates are not allowed ServerGroup serverGrouptoRemove = parentGroup.ServerGroups.OfType<ServerGroup>().FirstOrDefault(r => r.Name == removeServerGroupParams.GroupName); // since duplicates are not allowed
serverGrouptoRemove?.Drop(); serverGrouptoRemove?.Drop();
await requestContext.SendResult(true); await requestContext.SendResult(true);
}
else
{
await requestContext.SendResult(false);
}
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); await requestContext.SendResult(false);
} }
}); }
} catch (Exception e)
catch (Exception e) {
{ await requestContext.SendError(e);
await requestContext.SendError(e); }
} });
} }
#endregion #endregion

View File

@@ -1119,16 +1119,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
RequestContext<bool> requestContext) RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleCancelConnectRequest"); Logger.Write(TraceEventType.Verbose, "HandleCancelConnectRequest");
bool result = CancelConnect(cancelParams);
try await requestContext.SendResult(result);
{
bool result = CancelConnect(cancelParams);
await requestContext.SendResult(result);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
} }
/// <summary> /// <summary>
@@ -1139,16 +1131,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
RequestContext<bool> requestContext) RequestContext<bool> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleDisconnectRequest"); Logger.Write(TraceEventType.Verbose, "HandleDisconnectRequest");
bool result = Instance.Disconnect(disconnectParams);
try await requestContext.SendResult(result);
{
bool result = Instance.Disconnect(disconnectParams);
await requestContext.SendResult(result);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
} }
@@ -1403,34 +1387,27 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
string connectionString = string.Empty; string connectionString = string.Empty;
ConnectionInfo info; ConnectionInfo info;
SqlConnectionStringBuilder connStringBuilder; SqlConnectionStringBuilder connStringBuilder;
try // set connection string using connection uri if connection details are undefined
if (connStringParams.ConnectionDetails == null)
{ {
// set connection string using connection uri if connection details are undefined TryFindConnection(connStringParams.OwnerUri, out info);
if (connStringParams.ConnectionDetails == null) connStringBuilder = CreateConnectionStringBuilder(info.ConnectionDetails);
{
TryFindConnection(connStringParams.OwnerUri, out info);
connStringBuilder = CreateConnectionStringBuilder(info.ConnectionDetails);
}
// set connection string using connection details
else
{
connStringBuilder = CreateConnectionStringBuilder(connStringParams.ConnectionDetails as ConnectionDetails);
}
if (!connStringParams.IncludePassword)
{
connStringBuilder.Password = ConnectionService.PasswordPlaceholder;
}
// default connection string application name to always be included unless set to false
if (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true)
{
connStringBuilder.ApplicationName = "sqlops-connection-string";
}
connectionString = connStringBuilder.ConnectionString;
} }
catch (Exception e) // set connection string using connection details
else
{ {
await requestContext.SendError(e.ToString()); connStringBuilder = CreateConnectionStringBuilder(connStringParams.ConnectionDetails as ConnectionDetails);
} }
if (!connStringParams.IncludePassword)
{
connStringBuilder.Password = ConnectionService.PasswordPlaceholder;
}
// default connection string application name to always be included unless set to false
if (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true)
{
connStringBuilder.ApplicationName = "sqlops-connection-string";
}
connectionString = connStringBuilder.ConnectionString;
await requestContext.SendResult(connectionString); await requestContext.SendResult(connectionString);
} }

View File

@@ -69,24 +69,18 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// Handles request to export a bacpac /// Handles request to export a bacpac
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task HandleExportRequest(ExportParams parameters, RequestContext<DacFxResult> requestContext) public Task HandleExportRequest(ExportParams parameters, RequestContext<DacFxResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; ExportOperation operation = new ExportOperation(parameters, connInfo);
ConnectionServiceInstance.TryFindConnection( ExecuteOperation(operation, parameters, SR.ExportBacpacTaskName, requestContext);
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{
ExportOperation operation = new ExportOperation(parameters, connInfo);
ExecuteOperation(operation, parameters, SR.ExportBacpacTaskName, requestContext);
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
return Task.CompletedTask;
} }
/// <summary> /// <summary>
@@ -95,21 +89,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// <returns></returns> /// <returns></returns>
public async Task HandleImportRequest(ImportParams parameters, RequestContext<DacFxResult> requestContext) public async Task HandleImportRequest(ImportParams parameters, RequestContext<DacFxResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; ImportOperation operation = new ImportOperation(parameters, connInfo);
ConnectionServiceInstance.TryFindConnection( ExecuteOperation(operation, parameters, SR.ImportBacpacTaskName, requestContext);
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{
ImportOperation operation = new ImportOperation(parameters, connInfo);
ExecuteOperation(operation, parameters, SR.ImportBacpacTaskName, requestContext);
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
} }
@@ -117,51 +104,39 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// Handles request to extract a dacpac /// Handles request to extract a dacpac
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task HandleExtractRequest(ExtractParams parameters, RequestContext<DacFxResult> requestContext) public Task HandleExtractRequest(ExtractParams parameters, RequestContext<DacFxResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; // Set connection details database name to ensure the connection string gets created correctly for DW(extract doesn't work if connection is to master)
ConnectionServiceInstance.TryFindConnection( connInfo.ConnectionDetails.DatabaseName = parameters.DatabaseName;
parameters.OwnerUri, ExtractOperation operation = new ExtractOperation(parameters, connInfo);
out connInfo); string taskName = parameters.ExtractTarget == DacExtractTarget.DacPac ? SR.ExtractDacpacTaskName : SR.ProjectExtractTaskName;
if (connInfo != null) ExecuteOperation(operation, parameters, taskName, requestContext);
{
// Set connection details database name to ensure the connection string gets created correctly for DW(extract doesn't work if connection is to master)
connInfo.ConnectionDetails.DatabaseName = parameters.DatabaseName;
ExtractOperation operation = new ExtractOperation(parameters, connInfo);
string taskName = parameters.ExtractTarget == DacExtractTarget.DacPac ? SR.ExtractDacpacTaskName : SR.ProjectExtractTaskName;
ExecuteOperation(operation, parameters, taskName, requestContext);
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
return Task.CompletedTask;
} }
/// <summary> /// <summary>
/// Handles request to deploy a dacpac /// Handles request to deploy a dacpac
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task HandleDeployRequest(DeployParams parameters, RequestContext<DacFxResult> requestContext) public Task HandleDeployRequest(DeployParams parameters, RequestContext<DacFxResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; DeployOperation operation = new DeployOperation(parameters, connInfo);
ConnectionServiceInstance.TryFindConnection( ExecuteOperation(operation, parameters, SR.DeployDacpacTaskName, requestContext);
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{
DeployOperation operation = new DeployOperation(parameters, connInfo);
ExecuteOperation(operation, parameters, SR.DeployDacpacTaskName, requestContext);
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
return Task.CompletedTask;
} }
/// <summary> /// <summary>
@@ -170,36 +145,29 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// <returns></returns> /// <returns></returns>
public async Task HandleGenerateDeployScriptRequest(GenerateDeployScriptParams parameters, RequestContext<DacFxResult> requestContext) public async Task HandleGenerateDeployScriptRequest(GenerateDeployScriptParams parameters, RequestContext<DacFxResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; GenerateDeployScriptOperation operation = new GenerateDeployScriptOperation(parameters, connInfo);
ConnectionServiceInstance.TryFindConnection( SqlTask sqlTask = null;
parameters.OwnerUri, TaskMetadata metadata = new TaskMetadata();
out connInfo); metadata.TaskOperation = operation;
if (connInfo != null) metadata.TaskExecutionMode = parameters.TaskExecutionMode;
metadata.ServerName = connInfo.ConnectionDetails.ServerName;
metadata.DatabaseName = parameters.DatabaseName;
metadata.Name = SR.GenerateScriptTaskName;
sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
await requestContext.SendResult(new DacFxResult()
{ {
GenerateDeployScriptOperation operation = new GenerateDeployScriptOperation(parameters, connInfo); OperationId = operation.OperationId,
SqlTask sqlTask = null; Success = true,
TaskMetadata metadata = new TaskMetadata(); ErrorMessage = string.Empty
metadata.TaskOperation = operation; });
metadata.TaskExecutionMode = parameters.TaskExecutionMode;
metadata.ServerName = connInfo.ConnectionDetails.ServerName;
metadata.DatabaseName = parameters.DatabaseName;
metadata.Name = SR.GenerateScriptTaskName;
sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
await requestContext.SendResult(new DacFxResult()
{
OperationId = operation.OperationId,
Success = true,
ErrorMessage = string.Empty
});
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
} }
@@ -209,29 +177,22 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// <returns></returns> /// <returns></returns>
public async Task HandleGenerateDeployPlanRequest(GenerateDeployPlanParams parameters, RequestContext<GenerateDeployPlanRequestResult> requestContext) public async Task HandleGenerateDeployPlanRequest(GenerateDeployPlanParams parameters, RequestContext<GenerateDeployPlanRequestResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; GenerateDeployPlanOperation operation = new GenerateDeployPlanOperation(parameters, connInfo);
ConnectionServiceInstance.TryFindConnection( operation.Execute(parameters.TaskExecutionMode);
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{
GenerateDeployPlanOperation operation = new GenerateDeployPlanOperation(parameters, connInfo);
operation.Execute(parameters.TaskExecutionMode);
await requestContext.SendResult(new GenerateDeployPlanRequestResult() await requestContext.SendResult(new GenerateDeployPlanRequestResult()
{ {
OperationId = operation.OperationId, OperationId = operation.OperationId,
Success = true, Success = true,
ErrorMessage = string.Empty, ErrorMessage = string.Empty,
Report = operation.DeployReport Report = operation.DeployReport
}); });
}
}
catch (Exception e)
{
await requestContext.SendError(e);
} }
} }
@@ -241,30 +202,23 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// <returns></returns> /// <returns></returns>
public async Task HandleGetOptionsFromProfileRequest(GetOptionsFromProfileParams parameters, RequestContext<DacFxOptionsResult> requestContext) public async Task HandleGetOptionsFromProfileRequest(GetOptionsFromProfileParams parameters, RequestContext<DacFxOptionsResult> requestContext)
{ {
try DeploymentOptions options = null;
if (parameters.ProfilePath != null)
{ {
DeploymentOptions options = null; DacProfile profile = DacProfile.Load(parameters.ProfilePath);
if (parameters.ProfilePath != null) if (profile.DeployOptions != null)
{ {
DacProfile profile = DacProfile.Load(parameters.ProfilePath); options = DeploymentOptions.GetDefaultPublishOptions();
if (profile.DeployOptions != null) await options.InitializeFromProfile(profile.DeployOptions, parameters.ProfilePath);
{
options = DeploymentOptions.GetDefaultPublishOptions();
await options.InitializeFromProfile(profile.DeployOptions, parameters.ProfilePath);
}
} }
}
await requestContext.SendResult(new DacFxOptionsResult() await requestContext.SendResult(new DacFxOptionsResult()
{
DeploymentOptions = options,
Success = true,
ErrorMessage = string.Empty,
});
}
catch (Exception e)
{ {
await requestContext.SendError(e); DeploymentOptions = options,
} Success = true,
ErrorMessage = string.Empty,
});
} }
/// <summary> /// <summary>
@@ -273,17 +227,10 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
/// <returns></returns> /// <returns></returns>
public async Task HandleValidateStreamingJobRequest(ValidateStreamingJobParams parameters, RequestContext<ValidateStreamingJobResult> requestContext) public async Task HandleValidateStreamingJobRequest(ValidateStreamingJobParams parameters, RequestContext<ValidateStreamingJobResult> requestContext)
{ {
try ValidateStreamingJobOperation operation = new ValidateStreamingJobOperation(parameters);
{ ValidateStreamingJobResult result = operation.ValidateQuery();
ValidateStreamingJobOperation operation = new ValidateStreamingJobOperation(parameters);
ValidateStreamingJobResult result = operation.ValidateQuery();
await requestContext.SendResult(result); await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>
@@ -317,18 +264,11 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
public async Task HandleParseTSqlScriptRequest(ParseTSqlScriptRequestParams requestParams, RequestContext<ParseTSqlScriptResult> requestContext) public async Task HandleParseTSqlScriptRequest(ParseTSqlScriptRequestParams requestParams, RequestContext<ParseTSqlScriptResult> requestContext)
{ {
try var script = System.IO.File.ReadAllText(requestParams.FilePath);
await requestContext.SendResult(new ParseTSqlScriptResult()
{ {
var script = System.IO.File.ReadAllText(requestParams.FilePath); ContainsCreateTableStatement = DacTableDesigner.ScriptContainsCreateTableStatements(script, requestParams.DatabaseSchemaProvider)
await requestContext.SendResult(new ParseTSqlScriptResult() });
{
ContainsCreateTableStatement = DacTableDesigner.ScriptContainsCreateTableStatements(script, requestParams.DatabaseSchemaProvider)
});
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
public async Task HandleGenerateTSqlModelRequest(GenerateTSqlModelParams requestParams, RequestContext<ResultStatus> requestContext) public async Task HandleGenerateTSqlModelRequest(GenerateTSqlModelParams requestParams, RequestContext<ResultStatus> requestContext)

View File

@@ -137,35 +137,28 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
DefaultDatabaseInfoParams optionsParams, DefaultDatabaseInfoParams optionsParams,
RequestContext<BackupConfigInfoResponse> requestContext) RequestContext<BackupConfigInfoResponse> requestContext)
{ {
try var response = new BackupConfigInfoResponse();
{ ConnectionInfo connInfo;
var response = new BackupConfigInfoResponse(); DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; optionsParams.OwnerUri,
DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection( out connInfo);
optionsParams.OwnerUri,
out connInfo);
if (connInfo != null) if (connInfo != null)
{
using (DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true))
{ {
using (DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true)) using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup"))
{ {
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup")) if (sqlConn != null && !connInfo.IsCloud)
{ {
if (sqlConn != null && !connInfo.IsCloud) BackupConfigInfo backupConfigInfo = this.GetBackupConfigInfo(helper.DataContainer, sqlConn, sqlConn.Database);
{ response.BackupConfigInfo = backupConfigInfo;
BackupConfigInfo backupConfigInfo = this.GetBackupConfigInfo(helper.DataContainer, sqlConn, sqlConn.Database);
response.BackupConfigInfo = backupConfigInfo;
}
} }
} }
} }
}
await requestContext.SendResult(response); await requestContext.SendResult(response);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
} }
/// <summary> /// <summary>
@@ -322,54 +315,47 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
BackupParams backupParams, BackupParams backupParams,
RequestContext<BackupResponse> requestContext) RequestContext<BackupResponse> requestContext)
{ {
try BackupResponse response = new BackupResponse();
ConnectionInfo connInfo;
bool supported = IsBackupRestoreOperationSupported(backupParams.OwnerUri, out connInfo);
if (supported && connInfo != null)
{ {
BackupResponse response = new BackupResponse(); DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true);
ConnectionInfo connInfo; // Open a new connection to use for the backup, which will be closed when the backup task is completed
bool supported = IsBackupRestoreOperationSupported(backupParams.OwnerUri, out connInfo); // (or an error occurs)
SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup");
if (supported && connInfo != null) try
{ {
DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true); BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo);
// Open a new connection to use for the backup, which will be closed when the backup task is completed
// (or an error occurs) // create task metadata
SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup"); TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
try
SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
sqlTask.StatusChanged += (object sender, TaskEventArgs<SqlTaskStatus> e) =>
{ {
BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo); SqlTask sqlTask = e.SqlTask;
if (sqlTask != null && sqlTask.IsCompleted)
// create task metadata
TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
sqlTask.StatusChanged += (object sender, TaskEventArgs<SqlTaskStatus> e) =>
{ {
SqlTask sqlTask = e.SqlTask; sqlConn.Dispose();
if (sqlTask != null && sqlTask.IsCompleted) }
{ };
sqlConn.Dispose();
}
};
}
catch
{
// Ensure that the connection is closed if any error occurs while starting up the task
sqlConn.Dispose();
throw;
}
} }
else catch
{ {
response.Result = false; // Ensure that the connection is closed if any error occurs while starting up the task
sqlConn.Dispose();
throw;
} }
await requestContext.SendResult(response);
} }
catch (Exception ex) else
{ {
await requestContext.SendError(ex.ToString()); response.Result = false;
} }
await requestContext.SendResult(response);
} }
private bool IsBackupRestoreOperationSupported(string ownerUri, out ConnectionInfo connectionInfo) private bool IsBackupRestoreOperationSupported(string ownerUri, out ConnectionInfo connectionInfo)

View File

@@ -91,18 +91,11 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
internal async Task HandleSessionRequest<TResult>(SessionOperationParams sessionParams, internal async Task HandleSessionRequest<TResult>(SessionOperationParams sessionParams,
RequestContext<TResult> requestContext, Func<EditSession, TResult> sessionOperation) RequestContext<TResult> requestContext, Func<EditSession, TResult> sessionOperation)
{ {
try EditSession editSession = GetActiveSessionOrThrow(sessionParams.OwnerUri);
{
EditSession editSession = GetActiveSessionOrThrow(sessionParams.OwnerUri);
// Get the result from execution of the editSession operation // Get the result from execution of the editSession operation
TResult result = sessionOperation(editSession); TResult result = sessionOperation(editSession);
await requestContext.SendResult(result); await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e.Message);
}
} }
internal Task HandleCreateRowRequest(EditCreateRowParams createParams, internal Task HandleCreateRowRequest(EditCreateRowParams createParams,
@@ -125,26 +118,18 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
internal async Task HandleDisposeRequest(EditDisposeParams disposeParams, internal async Task HandleDisposeRequest(EditDisposeParams disposeParams,
RequestContext<EditDisposeResult> requestContext) RequestContext<EditDisposeResult> requestContext)
{ {
try // Sanity check the owner URI
{ Validate.IsNotNullOrWhitespaceString(nameof(disposeParams.OwnerUri), disposeParams.OwnerUri);
// Sanity check the owner URI
Validate.IsNotNullOrWhitespaceString(nameof(disposeParams.OwnerUri), disposeParams.OwnerUri);
// Attempt to remove the editSession // Attempt to remove the editSession
EditSession editSession; EditSession editSession;
if (!ActiveSessions.TryRemove(disposeParams.OwnerUri, out editSession)) if (!ActiveSessions.TryRemove(disposeParams.OwnerUri, out editSession))
{
await requestContext.SendError(SR.EditDataSessionNotFound);
return;
}
// Everything was successful, return success
await requestContext.SendResult(new EditDisposeResult());
}
catch (Exception e)
{ {
await requestContext.SendError(e.Message); throw new Exception(SR.EditDataSessionNotFound);
} }
// Everything was successful, return success
await requestContext.SendResult(new EditDisposeResult());
} }
internal async Task HandleInitializeRequest(EditInitializeParams initParams, internal async Task HandleInitializeRequest(EditInitializeParams initParams,
@@ -157,32 +142,25 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
EditSession.Connector connector = () => connectionService.GetOrOpenConnection(initParams.OwnerUri, ConnectionType.Edit, alwaysPersistSecurity: true); EditSession.Connector connector = () => connectionService.GetOrOpenConnection(initParams.OwnerUri, ConnectionType.Edit, alwaysPersistSecurity: true);
EditSession.QueryRunner queryRunner = q => SessionInitializeQueryRunner(initParams.OwnerUri, context, q); EditSession.QueryRunner queryRunner = q => SessionInitializeQueryRunner(initParams.OwnerUri, context, q);
try // Make sure we have info to process this request
Validate.IsNotNullOrWhitespaceString(nameof(initParams.OwnerUri), initParams.OwnerUri);
Validate.IsNotNullOrWhitespaceString(nameof(initParams.ObjectName), initParams.ObjectName);
Validate.IsNotNullOrWhitespaceString(nameof(initParams.ObjectType), initParams.ObjectType);
// Create a session and add it to the session list
EditSession session = new EditSession(metadataFactory);
if (!ActiveSessions.TryAdd(initParams.OwnerUri, session))
{ {
// Make sure we have info to process this request throw new InvalidOperationException(SR.EditDataSessionAlreadyExists);
Validate.IsNotNullOrWhitespaceString(nameof(initParams.OwnerUri), initParams.OwnerUri);
Validate.IsNotNullOrWhitespaceString(nameof(initParams.ObjectName), initParams.ObjectName);
Validate.IsNotNullOrWhitespaceString(nameof(initParams.ObjectType), initParams.ObjectType);
// Create a session and add it to the session list
EditSession session = new EditSession(metadataFactory);
if (!ActiveSessions.TryAdd(initParams.OwnerUri, session))
{
throw new InvalidOperationException(SR.EditDataSessionAlreadyExists);
}
context.ResultSetHandler = (ResultSetEventParams resultSetEventParams) => { session.UpdateColumnInformationWithMetadata(resultSetEventParams.ResultSetSummary.ColumnInfo); };
// Initialize the session
session.Initialize(initParams, connector, queryRunner, executionSuccessHandler, executionFailureHandler);
// Send the result
await requestContext.SendResult(new EditInitializeResult());
}
catch (Exception e)
{
await requestContext.SendError(e.Message);
} }
context.ResultSetHandler = (ResultSetEventParams resultSetEventParams) => { session.UpdateColumnInformationWithMetadata(resultSetEventParams.ResultSetSummary.ColumnInfo); };
// Initialize the session
session.Initialize(initParams, connector, queryRunner, executionSuccessHandler, executionFailureHandler);
// Send the result
await requestContext.SendResult(new EditInitializeResult());
} }
internal Task HandleRevertCellRequest(EditRevertCellParams revertParams, internal Task HandleRevertCellRequest(EditRevertCellParams revertParams,
@@ -205,23 +183,16 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
internal async Task HandleSubsetRequest(EditSubsetParams subsetParams, internal async Task HandleSubsetRequest(EditSubsetParams subsetParams,
RequestContext<EditSubsetResult> requestContext) RequestContext<EditSubsetResult> requestContext)
{ {
try EditSession session = GetActiveSessionOrThrow(subsetParams.OwnerUri);
{
EditSession session = GetActiveSessionOrThrow(subsetParams.OwnerUri);
EditRow[] rows = await session.GetRows(subsetParams.RowStartIndex, subsetParams.RowCount); EditRow[] rows = await session.GetRows(subsetParams.RowStartIndex, subsetParams.RowCount);
EditSubsetResult result = new EditSubsetResult EditSubsetResult result = new EditSubsetResult
{
RowCount = rows.Length,
Subset = rows
};
await requestContext.SendResult(result);
}
catch (Exception e)
{ {
await requestContext.SendError(e.Message); RowCount = rows.Length,
} Subset = rows
};
await requestContext.SendResult(result);
} }
internal Task HandleUpdateCellRequest(EditUpdateCellParams updateParams, internal Task HandleUpdateCellRequest(EditUpdateCellParams updateParams,

View File

@@ -55,18 +55,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan
private async Task HandleGetExecutionPlan(GetExecutionPlanParams requestParams, RequestContext<GetExecutionPlanResult> requestContext) private async Task HandleGetExecutionPlan(GetExecutionPlanParams requestParams, RequestContext<GetExecutionPlanResult> requestContext)
{ {
try var plans = ExecutionPlanGraphUtils.CreateShowPlanGraph(requestParams.GraphInfo.GraphFileContent, "");
await requestContext.SendResult(new GetExecutionPlanResult
{ {
var plans = ExecutionPlanGraphUtils.CreateShowPlanGraph(requestParams.GraphInfo.GraphFileContent, ""); Graphs = plans
await requestContext.SendResult(new GetExecutionPlanResult });
{
Graphs = plans
});
}
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
} }
/// <summary> /// <summary>
@@ -76,39 +69,32 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan
ExecutionPlanComparisonParams requestParams, ExecutionPlanComparisonParams requestParams,
RequestContext<ExecutionPlanComparisonResult> requestContext) RequestContext<ExecutionPlanComparisonResult> requestContext)
{ {
try var nodeBuilder = new XmlPlanNodeBuilder(ShowPlanType.Unknown);
var firstPlanXml = nodeBuilder.GetSingleStatementXml(requestParams.FirstExecutionPlanGraphInfo.GraphFileContent, requestParams.FirstExecutionPlanGraphInfo.PlanIndexInFile);
var firstGraphSet = ShowPlanGraph.ParseShowPlanXML(firstPlanXml, ShowPlanType.Unknown);
var firstRootNode = firstGraphSet?[0]?.Root;
var secondPlanXml = nodeBuilder.GetSingleStatementXml(requestParams.SecondExecutionPlanGraphInfo.GraphFileContent, requestParams.SecondExecutionPlanGraphInfo.PlanIndexInFile);
var secondGraphSet = ShowPlanGraph.ParseShowPlanXML(secondPlanXml, ShowPlanType.Unknown);
var secondRootNode = secondGraphSet?[0]?.Root;
var manager = new SkeletonManager();
var firstSkeletonNode = manager.CreateSkeleton(firstRootNode);
var secondSkeletonNode = manager.CreateSkeleton(secondRootNode);
manager.ColorMatchingSections(firstSkeletonNode, secondSkeletonNode, requestParams.IgnoreDatabaseName);
var firstGraphComparisonResultDTO = firstSkeletonNode.ConvertToDTO();
var secondGraphComparisonResultDTO = secondSkeletonNode.ConvertToDTO();
ExecutionPlanGraphUtils.CopyMatchingNodesIntoSkeletonDTO(firstGraphComparisonResultDTO, secondGraphComparisonResultDTO);
ExecutionPlanGraphUtils.CopyMatchingNodesIntoSkeletonDTO(secondGraphComparisonResultDTO, firstGraphComparisonResultDTO);
var result = new ExecutionPlanComparisonResult()
{ {
var nodeBuilder = new XmlPlanNodeBuilder(ShowPlanType.Unknown); FirstComparisonResult = firstGraphComparisonResultDTO,
var firstPlanXml = nodeBuilder.GetSingleStatementXml(requestParams.FirstExecutionPlanGraphInfo.GraphFileContent, requestParams.FirstExecutionPlanGraphInfo.PlanIndexInFile); SecondComparisonResult = secondGraphComparisonResultDTO
var firstGraphSet = ShowPlanGraph.ParseShowPlanXML(firstPlanXml, ShowPlanType.Unknown); };
var firstRootNode = firstGraphSet?[0]?.Root;
var secondPlanXml = nodeBuilder.GetSingleStatementXml(requestParams.SecondExecutionPlanGraphInfo.GraphFileContent, requestParams.SecondExecutionPlanGraphInfo.PlanIndexInFile); await requestContext.SendResult(result);
var secondGraphSet = ShowPlanGraph.ParseShowPlanXML(secondPlanXml, ShowPlanType.Unknown);
var secondRootNode = secondGraphSet?[0]?.Root;
var manager = new SkeletonManager();
var firstSkeletonNode = manager.CreateSkeleton(firstRootNode);
var secondSkeletonNode = manager.CreateSkeleton(secondRootNode);
manager.ColorMatchingSections(firstSkeletonNode, secondSkeletonNode, requestParams.IgnoreDatabaseName);
var firstGraphComparisonResultDTO = firstSkeletonNode.ConvertToDTO();
var secondGraphComparisonResultDTO = secondSkeletonNode.ConvertToDTO();
ExecutionPlanGraphUtils.CopyMatchingNodesIntoSkeletonDTO(firstGraphComparisonResultDTO, secondGraphComparisonResultDTO);
ExecutionPlanGraphUtils.CopyMatchingNodesIntoSkeletonDTO(secondGraphComparisonResultDTO, firstGraphComparisonResultDTO);
var result = new ExecutionPlanComparisonResult()
{
FirstComparisonResult = firstGraphComparisonResultDTO,
SecondComparisonResult = secondGraphComparisonResultDTO
};
await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
} }
/// <summary> /// <summary>

View File

@@ -78,23 +78,17 @@ namespace Microsoft.SqlTools.ServiceLayer.Formatter
public async Task HandleDocFormatRequest(DocumentFormattingParams docFormatParams, RequestContext<TextEdit[]> requestContext) public async Task HandleDocFormatRequest(DocumentFormattingParams docFormatParams, RequestContext<TextEdit[]> requestContext)
{ {
Func<Task<TextEdit[]>> requestHandler = () => Logger.Verbose("HandleDocFormatRequest");
{ TextEdit[] result = await FormatAndReturnEdits(docFormatParams);
return FormatAndReturnEdits(docFormatParams); await requestContext.SendResult(result);
};
await HandleRequest(requestHandler, requestContext, "HandleDocFormatRequest");
DocumentStatusHelper.SendTelemetryEvent(requestContext, CreateTelemetryProps(isDocFormat: true)); DocumentStatusHelper.SendTelemetryEvent(requestContext, CreateTelemetryProps(isDocFormat: true));
} }
public async Task HandleDocRangeFormatRequest(DocumentRangeFormattingParams docRangeFormatParams, RequestContext<TextEdit[]> requestContext) public async Task HandleDocRangeFormatRequest(DocumentRangeFormattingParams docRangeFormatParams, RequestContext<TextEdit[]> requestContext)
{ {
Func<Task<TextEdit[]>> requestHandler = () => Logger.Verbose("HandleDocRangeFormatRequest");
{ TextEdit[] result = await FormatRangeAndReturnEdits(docRangeFormatParams);
return FormatRangeAndReturnEdits(docRangeFormatParams); await requestContext.SendResult(result);
};
await HandleRequest(requestHandler, requestContext, "HandleDocRangeFormatRequest");
DocumentStatusHelper.SendTelemetryEvent(requestContext, CreateTelemetryProps(isDocFormat: false)); DocumentStatusHelper.SendTelemetryEvent(requestContext, CreateTelemetryProps(isDocFormat: false));
} }
private static TelemetryProperties CreateTelemetryProps(bool isDocFormat) private static TelemetryProperties CreateTelemetryProps(bool isDocFormat)
@@ -230,23 +224,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Formatter
return edit; return edit;
} }
private async Task HandleRequest<T>(Func<Task<T>> handler, RequestContext<T> requestContext, string requestType)
{
Logger.Write(TraceEventType.Verbose, requestType);
try
{
T result = await handler();
await requestContext.SendResult(result);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
}
public string Format(TextReader input) public string Format(TextReader input)
{ {
string originalSql = input.ReadToEnd(); string originalSql = input.ReadToEnd();

View File

@@ -78,34 +78,26 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageExtensibility
public async Task HandleExternalLanguageDeleteRequest(ExternalLanguageDeleteRequestParams parameters, RequestContext<ExternalLanguageDeleteResponseParams> requestContext) public async Task HandleExternalLanguageDeleteRequest(ExternalLanguageDeleteRequestParams parameters, RequestContext<ExternalLanguageDeleteResponseParams> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageDeleteRequest"); Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageDeleteRequest");
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageDeleteResponseParams response = new ExternalLanguageDeleteResponseParams
{ {
ConnectionInfo connInfo; };
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageDeleteResponseParams response = new ExternalLanguageDeleteResponseParams
{
};
if (connInfo == null) if (connInfo == null)
{ {
await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri))); await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri)));
}
else
{
using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
{
ExternalLanguageOperations.DeleteLanguage(dbConnection, parameters.LanguageName);
}
await requestContext.SendResult(response);
}
} }
catch (Exception e) else
{ {
// Exception related to run task will be captured here using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
await requestContext.SendError(e); {
ExternalLanguageOperations.DeleteLanguage(dbConnection, parameters.LanguageName);
}
await requestContext.SendResult(response);
} }
} }
@@ -118,34 +110,26 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageExtensibility
public async Task HandleExternalLanguageUpdateRequest(ExternalLanguageUpdateRequestParams parameters, RequestContext<ExternalLanguageUpdateResponseParams> requestContext) public async Task HandleExternalLanguageUpdateRequest(ExternalLanguageUpdateRequestParams parameters, RequestContext<ExternalLanguageUpdateResponseParams> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageUpdateRequest"); Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageUpdateRequest");
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageUpdateResponseParams response = new ExternalLanguageUpdateResponseParams
{ {
ConnectionInfo connInfo; };
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageUpdateResponseParams response = new ExternalLanguageUpdateResponseParams
{
};
if (connInfo == null) if (connInfo == null)
{ {
await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri))); await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri)));
}
else
{
using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
{
ExternalLanguageOperations.UpdateLanguage(dbConnection, parameters.Language);
}
await requestContext.SendResult(response);
}
} }
catch (Exception e) else
{ {
// Exception related to run task will be captured here using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
await requestContext.SendError(e); {
ExternalLanguageOperations.UpdateLanguage(dbConnection, parameters.Language);
}
await requestContext.SendResult(response);
} }
} }
@@ -158,35 +142,27 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageExtensibility
public async Task HandleExternalLanguageStatusRequest(ExternalLanguageStatusRequestParams parameters, RequestContext<ExternalLanguageStatusResponseParams> requestContext) public async Task HandleExternalLanguageStatusRequest(ExternalLanguageStatusRequestParams parameters, RequestContext<ExternalLanguageStatusResponseParams> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageStatusRequest"); Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageStatusRequest");
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageStatusResponseParams response = new ExternalLanguageStatusResponseParams
{ {
ConnectionInfo connInfo; Status = false,
ConnectionServiceInstance.TryFindConnection( };
parameters.OwnerUri,
out connInfo);
ExternalLanguageStatusResponseParams response = new ExternalLanguageStatusResponseParams
{
Status = false,
};
if (connInfo == null) if (connInfo == null)
{ {
await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri))); await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri)));
}
else
{
using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
{
response.Status = ExternalLanguageOperations.GetLanguageStatus(dbConnection, parameters.LanguageName);
}
await requestContext.SendResult(response);
}
} }
catch (Exception e) else
{ {
// Exception related to run task will be captured here using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
await requestContext.SendError(e); {
response.Status = ExternalLanguageOperations.GetLanguageStatus(dbConnection, parameters.LanguageName);
}
await requestContext.SendResult(response);
} }
} }
@@ -199,34 +175,26 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageExtensibility
public async Task HandleExternalLanguageListRequest(ExternalLanguageListRequestParams parameters, RequestContext<ExternalLanguageListResponseParams> requestContext) public async Task HandleExternalLanguageListRequest(ExternalLanguageListRequestParams parameters, RequestContext<ExternalLanguageListResponseParams> requestContext)
{ {
Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageListRequest"); Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageListRequest");
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageListResponseParams response = new ExternalLanguageListResponseParams
{ {
ConnectionInfo connInfo; };
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
ExternalLanguageListResponseParams response = new ExternalLanguageListResponseParams
{
};
if (connInfo == null) if (connInfo == null)
{ {
await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri))); await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri)));
}
else
{
using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
{
response.Languages = ExternalLanguageOperations.GetLanguages(dbConnection);
}
await requestContext.SendResult(response);
}
} }
catch (Exception e) else
{ {
// Exception related to run task will be captured here using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
await requestContext.SendError(e); {
response.Languages = ExternalLanguageOperations.GetLanguages(dbConnection);
}
await requestContext.SendResult(response);
} }
} }
} }

View File

@@ -315,49 +315,41 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
/// <returns></returns> /// <returns></returns>
internal async Task HandleCompletionExtLoadRequest(CompletionExtensionParams param, RequestContext<bool> requestContext) internal async Task HandleCompletionExtLoadRequest(CompletionExtensionParams param, RequestContext<bool> requestContext)
{ {
try //register the new assembly
var serviceProvider = (ExtensionServiceProvider)ServiceHostInstance.ServiceProvider;
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(param.AssemblyPath);
var assemblies = new Assembly[] { assembly };
serviceProvider.AddAssembliesToConfiguration(assemblies);
foreach (var ext in serviceProvider.GetServices<ICompletionExtension>())
{ {
//register the new assembly var cancellationTokenSource = new CancellationTokenSource(ExtensionLoadingTimeout);
var serviceProvider = (ExtensionServiceProvider)ServiceHostInstance.ServiceProvider; var cancellationToken = cancellationTokenSource.Token;
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(param.AssemblyPath); string extName = ext.Name;
var assemblies = new Assembly[] { assembly }; string extTypeName = ext.GetType().FullName;
serviceProvider.AddAssembliesToConfiguration(assemblies); if (extTypeName != param.TypeName)
foreach (var ext in serviceProvider.GetServices<ICompletionExtension>())
{ {
var cancellationTokenSource = new CancellationTokenSource(ExtensionLoadingTimeout); continue;
var cancellationToken = cancellationTokenSource.Token; }
string extName = ext.Name;
string extTypeName = ext.GetType().FullName; if (!CheckIfAssemblyShouldBeLoaded(param.AssemblyPath, extTypeName))
if (extTypeName != param.TypeName) {
{ await requestContext.SendError(string.Format("Skip loading {0} because it's already loaded", param.AssemblyPath));
continue; return;
} }
if (!CheckIfAssemblyShouldBeLoaded(param.AssemblyPath, extTypeName)) await ext.Initialize(param.Properties, cancellationToken).WithTimeout(ExtensionLoadingTimeout);
{ cancellationTokenSource.Dispose();
await requestContext.SendError(string.Format("Skip loading {0} because it's already loaded", param.AssemblyPath)); if (!string.IsNullOrEmpty(extName))
return; {
} completionExtensions[extName] = ext;
await requestContext.SendResult(true);
await ext.Initialize(param.Properties, cancellationToken).WithTimeout(ExtensionLoadingTimeout); return;
cancellationTokenSource.Dispose(); }
if (!string.IsNullOrEmpty(extName)) else
{ {
completionExtensions[extName] = ext; await requestContext.SendError(string.Format("Skip loading an unnamed completion extension from {0}", param.AssemblyPath));
await requestContext.SendResult(true); return;
return;
}
else
{
await requestContext.SendError(string.Format("Skip loading an unnamed completion extension from {0}", param.AssemblyPath));
return;
}
} }
}
catch (Exception ex)
{
await requestContext.SendError(ex.Message);
return;
} }
await requestContext.SendError(string.Format("Couldn't discover completion extension with type {0} in {1}", param.TypeName, param.AssemblyPath)); await requestContext.SendError(string.Format("Couldn't discover completion extension with type {0} in {1}", param.TypeName, param.AssemblyPath));
@@ -399,30 +391,23 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
/// <returns></returns> /// <returns></returns>
internal async Task HandleSyntaxParseRequest(SyntaxParseParams param, RequestContext<SyntaxParseResult> requestContext) internal async Task HandleSyntaxParseRequest(SyntaxParseParams param, RequestContext<SyntaxParseResult> requestContext)
{ {
try ParseResult result = Parser.Parse(param.Query);
SyntaxParseResult syntaxResult = new SyntaxParseResult();
if (result != null && !result.Errors.Any())
{ {
ParseResult result = Parser.Parse(param.Query); syntaxResult.Parseable = true;
SyntaxParseResult syntaxResult = new SyntaxParseResult();
if (result != null && !result.Errors.Any())
{
syntaxResult.Parseable = true;
}
else
{
syntaxResult.Parseable = false;
string[] errorMessages = new string[result.Errors.Count()];
for (int i = 0; i < result.Errors.Count(); i++)
{
errorMessages[i] = result.Errors.ElementAt(i).Message;
}
syntaxResult.Errors = errorMessages;
}
await requestContext.SendResult(syntaxResult);
} }
catch (Exception ex) else
{ {
await requestContext.SendError(ex.ToString()); syntaxResult.Parseable = false;
string[] errorMessages = new string[result.Errors.Count()];
for (int i = 0; i < result.Errors.Count(); i++)
{
errorMessages[i] = result.Errors.ElementAt(i).Message;
}
syntaxResult.Errors = errorMessages;
} }
await requestContext.SendResult(syntaxResult);
} }
/// <summary> /// <summary>
@@ -435,39 +420,32 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
TextDocumentPosition textDocumentPosition, TextDocumentPosition textDocumentPosition,
RequestContext<CompletionItem[]> requestContext) RequestContext<CompletionItem[]> requestContext)
{ {
try var scriptFile = CurrentWorkspace.GetFile(textDocumentPosition.TextDocument.Uri);
if (scriptFile == null)
{ {
var scriptFile = CurrentWorkspace.GetFile(textDocumentPosition.TextDocument.Uri); await requestContext.SendResult(null);
if (scriptFile == null) return;
{
await requestContext.SendResult(null);
return;
}
// check if Intellisense suggestions are enabled
if (ShouldSkipIntellisense(scriptFile.ClientUri))
{
await requestContext.SendResult(null);
}
else
{
ConnectionInfo connInfo = null;
// Check if we need to refresh the auth token, and if we do then don't pass in the
// connection so that we only show the default options until the refreshed token is returned
if (!await connectionService.TryRequestRefreshAuthToken(scriptFile.ClientUri))
{
ConnectionServiceInstance.TryFindConnection(
scriptFile.ClientUri,
out connInfo);
}
var completionItems = await GetCompletionItems(
textDocumentPosition, scriptFile, connInfo);
await requestContext.SendResult(completionItems);
}
} }
catch (Exception ex) // check if Intellisense suggestions are enabled
if (ShouldSkipIntellisense(scriptFile.ClientUri))
{ {
await requestContext.SendError(ex.ToString()); await requestContext.SendResult(null);
}
else
{
ConnectionInfo connInfo = null;
// Check if we need to refresh the auth token, and if we do then don't pass in the
// connection so that we only show the default options until the refreshed token is returned
if (!await connectionService.TryRequestRefreshAuthToken(scriptFile.ClientUri))
{
ConnectionServiceInstance.TryFindConnection(
scriptFile.ClientUri,
out connInfo);
}
var completionItems = await GetCompletionItems(
textDocumentPosition, scriptFile, connInfo);
await requestContext.SendResult(completionItems);
} }
} }
@@ -482,70 +460,56 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
CompletionItem completionItem, CompletionItem completionItem,
RequestContext<CompletionItem> requestContext) RequestContext<CompletionItem> requestContext)
{ {
try // check if Intellisense suggestions are enabled
// Note: Do not know file, so no need to check for MSSQL flavor
if (!CurrentWorkspaceSettings.IsSuggestionsEnabled)
{ {
// check if Intellisense suggestions are enabled await requestContext.SendResult(completionItem);
// Note: Do not know file, so no need to check for MSSQL flavor
if (!CurrentWorkspaceSettings.IsSuggestionsEnabled)
{
await requestContext.SendResult(completionItem);
}
else
{
completionItem = ResolveCompletionItem(completionItem);
await requestContext.SendResult(completionItem);
}
} }
catch (Exception ex) else
{ {
await requestContext.SendError(ex.ToString()); completionItem = ResolveCompletionItem(completionItem);
await requestContext.SendResult(completionItem);
} }
} }
internal async Task HandleDefinitionRequest(TextDocumentPosition textDocumentPosition, RequestContext<Location[]> requestContext) internal async Task HandleDefinitionRequest(TextDocumentPosition textDocumentPosition, RequestContext<Location[]> requestContext)
{ {
try DocumentStatusHelper.SendStatusChange(requestContext, textDocumentPosition, DocumentStatusHelper.DefinitionRequested);
if (!ShouldSkipIntellisense(textDocumentPosition.TextDocument.Uri))
{ {
DocumentStatusHelper.SendStatusChange(requestContext, textDocumentPosition, DocumentStatusHelper.DefinitionRequested); // Retrieve document and connection
ConnectionInfo connInfo;
if (!ShouldSkipIntellisense(textDocumentPosition.TextDocument.Uri)) var scriptFile = CurrentWorkspace.GetFile(textDocumentPosition.TextDocument.Uri);
bool isConnected = false;
bool succeeded = false;
DefinitionResult definitionResult = null;
if (scriptFile != null)
{ {
// Retrieve document and connection isConnected = ConnectionServiceInstance.TryFindConnection(scriptFile.ClientUri, out connInfo);
ConnectionInfo connInfo; definitionResult = GetDefinition(textDocumentPosition, scriptFile, connInfo);
var scriptFile = CurrentWorkspace.GetFile(textDocumentPosition.TextDocument.Uri); }
bool isConnected = false;
bool succeeded = false;
DefinitionResult definitionResult = null;
if (scriptFile != null)
{
isConnected = ConnectionServiceInstance.TryFindConnection(scriptFile.ClientUri, out connInfo);
definitionResult = GetDefinition(textDocumentPosition, scriptFile, connInfo);
}
if (definitionResult != null && !definitionResult.IsErrorResult) if (definitionResult != null && !definitionResult.IsErrorResult)
{ {
await requestContext.SendResult(definitionResult.Locations); await requestContext.SendResult(definitionResult.Locations);
succeeded = true; succeeded = true;
}
else
{
await requestContext.SendResult(Array.Empty<Location>());
}
DocumentStatusHelper.SendTelemetryEvent(requestContext, CreatePeekTelemetryProps(succeeded, isConnected));
} }
else else
{ {
// Send an empty result so that processing does not hang when peek def service called from non-mssql clients
await requestContext.SendResult(Array.Empty<Location>()); await requestContext.SendResult(Array.Empty<Location>());
} }
DocumentStatusHelper.SendStatusChange(requestContext, textDocumentPosition, DocumentStatusHelper.DefinitionRequestCompleted); DocumentStatusHelper.SendTelemetryEvent(requestContext, CreatePeekTelemetryProps(succeeded, isConnected));
} }
catch (Exception ex) else
{ {
await requestContext.SendError(ex.ToString()); // Send an empty result so that processing does not hang when peek def service called from non-mssql clients
await requestContext.SendResult(Array.Empty<Location>());
} }
DocumentStatusHelper.SendStatusChange(requestContext, textDocumentPosition, DocumentStatusHelper.DefinitionRequestCompleted);
} }
private static TelemetryProperties CreatePeekTelemetryProps(bool succeeded, bool connected) private static TelemetryProperties CreatePeekTelemetryProps(bool succeeded, bool connected)
@@ -582,67 +546,53 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
TextDocumentPosition textDocumentPosition, TextDocumentPosition textDocumentPosition,
RequestContext<SignatureHelp> requestContext) RequestContext<SignatureHelp> requestContext)
{ {
try // check if Intellisense suggestions are enabled
if (ShouldSkipNonMssqlFile(textDocumentPosition))
{ {
// check if Intellisense suggestions are enabled await requestContext.SendResult(null);
if (ShouldSkipNonMssqlFile(textDocumentPosition)) }
else
{
ScriptFile scriptFile = CurrentWorkspace.GetFile(
textDocumentPosition.TextDocument.Uri);
SignatureHelp help = null;
if (scriptFile != null)
{ {
await requestContext.SendResult(null); help = GetSignatureHelp(textDocumentPosition, scriptFile);
}
if (help != null)
{
await requestContext.SendResult(help);
} }
else else
{ {
ScriptFile scriptFile = CurrentWorkspace.GetFile( await requestContext.SendResult(new SignatureHelp());
textDocumentPosition.TextDocument.Uri);
SignatureHelp help = null;
if (scriptFile != null)
{
help = GetSignatureHelp(textDocumentPosition, scriptFile);
}
if (help != null)
{
await requestContext.SendResult(help);
}
else
{
await requestContext.SendResult(new SignatureHelp());
}
} }
} }
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
} }
private async Task HandleHoverRequest( private async Task HandleHoverRequest(
TextDocumentPosition textDocumentPosition, TextDocumentPosition textDocumentPosition,
RequestContext<Hover> requestContext) RequestContext<Hover> requestContext)
{ {
try // check if Quick Info hover tooltips are enabled
if (CurrentWorkspaceSettings.IsQuickInfoEnabled
&& !ShouldSkipNonMssqlFile(textDocumentPosition))
{ {
// check if Quick Info hover tooltips are enabled var scriptFile = CurrentWorkspace.GetFile(
if (CurrentWorkspaceSettings.IsQuickInfoEnabled textDocumentPosition.TextDocument.Uri);
&& !ShouldSkipNonMssqlFile(textDocumentPosition))
{
var scriptFile = CurrentWorkspace.GetFile(
textDocumentPosition.TextDocument.Uri);
Hover hover = null; Hover hover = null;
if (scriptFile != null) if (scriptFile != null)
{ {
hover = GetHoverItem(textDocumentPosition, scriptFile); hover = GetHoverItem(textDocumentPosition, scriptFile);
} }
if (hover != null) if (hover != null)
{ {
await requestContext.SendResult(hover); await requestContext.SendResult(hover);
}
} }
await requestContext.SendResult(null);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
} }
await requestContext.SendResult(null);
} }
#endregion #endregion

View File

@@ -65,40 +65,33 @@ namespace Microsoft.SqlTools.ServiceLayer.Metadata
MetadataQueryParams metadataParams, MetadataQueryParams metadataParams,
RequestContext<MetadataQueryResult> requestContext) RequestContext<MetadataQueryResult> requestContext)
{ {
try Func<Task> requestHandler = async () =>
{ {
Func<Task> requestHandler = async () => ConnectionInfo connInfo;
{ MetadataService.ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; metadataParams.OwnerUri,
MetadataService.ConnectionServiceInstance.TryFindConnection( out connInfo);
metadataParams.OwnerUri,
out connInfo);
var metadata = new List<ObjectMetadata>(); var metadata = new List<ObjectMetadata>();
if (connInfo != null) if (connInfo != null)
{
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Metadata"))
{ {
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Metadata")) ReadMetadata(sqlConn, metadata);
{
ReadMetadata(sqlConn, metadata);
}
} }
}
await requestContext.SendResult(new MetadataQueryResult await requestContext.SendResult(new MetadataQueryResult
{
Metadata = metadata.ToArray()
});
};
Task task = Task.Run(async () => await requestHandler()).ContinueWithOnFaulted(async t =>
{ {
await requestContext.SendError(t.Exception.ToString()); Metadata = metadata.ToArray()
}); });
MetadataListTask = task; };
}
catch (Exception ex) Task task = Task.Run(async () => await requestHandler()).ContinueWithOnFaulted(async t =>
{ {
await requestContext.SendError(ex.ToString()); await requestContext.SendError(t.Exception.ToString());
} });
MetadataListTask = task;
} }
internal Task MetadataListTask { get; set; } internal Task MetadataListTask { get; set; }
@@ -131,34 +124,27 @@ namespace Microsoft.SqlTools.ServiceLayer.Metadata
string objectType, string objectType,
RequestContext<TableMetadataResult> requestContext) RequestContext<TableMetadataResult> requestContext)
{ {
try ConnectionInfo connInfo;
{ MetadataService.ConnectionServiceInstance.TryFindConnection(
ConnectionInfo connInfo; metadataParams.OwnerUri,
MetadataService.ConnectionServiceInstance.TryFindConnection( out connInfo);
metadataParams.OwnerUri,
out connInfo);
ColumnMetadata[] metadata = null; ColumnMetadata[] metadata = null;
if (connInfo != null) if (connInfo != null)
{
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Metadata"))
{ {
using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Metadata")) TableMetadata table = new SmoMetadataFactory().GetObjectMetadata(
{ sqlConn, metadataParams.Schema,
TableMetadata table = new SmoMetadataFactory().GetObjectMetadata( metadataParams.ObjectName, objectType);
sqlConn, metadataParams.Schema, metadata = table.Columns;
metadataParams.ObjectName, objectType);
metadata = table.Columns;
}
} }
}
await requestContext.SendResult(new TableMetadataResult await requestContext.SendResult(new TableMetadataResult
{
Columns = metadata
});
}
catch (Exception ex)
{ {
await requestContext.SendError(ex.ToString()); Columns = metadata
} });
} }
internal static bool IsSystemDatabase(string database) internal static bool IsSystemDatabase(string database)

View File

@@ -157,10 +157,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration
await requestContext.SendResult(results); await requestContext.SendResult(results);
} }
} }
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
finally finally
{ {
ConnectionService.Disconnect(new DisconnectParams { OwnerUri = randomUri, Type = null }); ConnectionService.Disconnect(new DisconnectParams { OwnerUri = randomUri, Type = null });
@@ -208,10 +204,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration
// TO-DO: what should be returned? // TO-DO: what should be returned?
await requestContext.SendResult(new StartPerfDataCollectionResult() { DateTimeStarted = DateTime.UtcNow }); await requestContext.SendResult(new StartPerfDataCollectionResult() { DateTimeStarted = DateTime.UtcNow });
} }
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
finally finally
{ {
ConnectionService.Disconnect(new DisconnectParams { OwnerUri = randomUri, Type = null }); ConnectionService.Disconnect(new DisconnectParams { OwnerUri = randomUri, Type = null });
@@ -225,17 +217,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration
StopPerfDataCollectionParams parameters, StopPerfDataCollectionParams parameters,
RequestContext<StopPerfDataCollectionResult> requestContext) RequestContext<StopPerfDataCollectionResult> requestContext)
{ {
try this.DataCollectionController.Dispose();
{
this.DataCollectionController.Dispose();
// TO-DO: what should be returned? // TO-DO: what should be returned?
await requestContext.SendResult(new StopPerfDataCollectionResult() { DateTimeStopped = DateTime.UtcNow }); await requestContext.SendResult(new StopPerfDataCollectionResult() { DateTimeStopped = DateTime.UtcNow });
}
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
} }
/// <summary> /// <summary>
@@ -245,26 +230,19 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration
RefreshPerfDataCollectionParams parameters, RefreshPerfDataCollectionParams parameters,
RequestContext<RefreshPerfDataCollectionResult> requestContext) RequestContext<RefreshPerfDataCollectionResult> requestContext)
{ {
try bool isCollecting = !(this.DataCollectionController is null) ? this.DataCollectionController.IsRunning() : false;
{ List<string> messages = !(this.DataCollectionController is null) ? this.DataCollectionController.FetchLatestMessages(parameters.LastRefreshedTime) : new List<string>();
bool isCollecting = !(this.DataCollectionController is null) ? this.DataCollectionController.IsRunning() : false; List<string> errors = !(this.DataCollectionController is null) ? this.DataCollectionController.FetchLatestErrors(parameters.LastRefreshedTime) : new List<string>();
List<string> messages = !(this.DataCollectionController is null) ? this.DataCollectionController.FetchLatestMessages(parameters.LastRefreshedTime) : new List<string>();
List<string> errors = !(this.DataCollectionController is null) ? this.DataCollectionController.FetchLatestErrors(parameters.LastRefreshedTime) : new List<string>();
RefreshPerfDataCollectionResult result = new RefreshPerfDataCollectionResult() RefreshPerfDataCollectionResult result = new RefreshPerfDataCollectionResult()
{
RefreshTime = DateTime.UtcNow,
IsCollecting = isCollecting,
Messages = messages,
Errors = errors,
};
await requestContext.SendResult(result);
}
catch (Exception e)
{ {
await requestContext.SendError(e.ToString()); RefreshTime = DateTime.UtcNow,
} IsCollecting = isCollecting,
Messages = messages,
Errors = errors,
};
await requestContext.SendResult(result);
} }
/// <summary> /// <summary>
/// Handle request to generate SKU recommendations /// Handle request to generate SKU recommendations
@@ -396,10 +374,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration
{ {
await requestContext.SendError($"Unable to read collected performance data from {parameters.DataFolder}. Please specify another folder or start data collection instead."); await requestContext.SendError($"Unable to read collected performance data from {parameters.DataFolder}. Please specify another folder or start data collection instead.");
} }
catch (Exception e)
{
await requestContext.SendError(e.ToString());
}
} }
internal class AssessmentRequest : IAssessmentRequest internal class AssessmentRequest : IAssessmentRequest

View File

@@ -76,42 +76,28 @@ namespace Microsoft.SqlTools.ServiceLayer.NotebookConvert
internal async Task HandleConvertNotebookToSqlRequest(ConvertNotebookToSqlParams parameters, RequestContext<ConvertNotebookToSqlResult> requestContext) internal async Task HandleConvertNotebookToSqlRequest(ConvertNotebookToSqlParams parameters, RequestContext<ConvertNotebookToSqlResult> requestContext)
{ {
try var notebookDoc = JsonConvert.DeserializeObject<NotebookDocument>(parameters.Content);
{
var notebookDoc = JsonConvert.DeserializeObject<NotebookDocument>(parameters.Content);
var result = new ConvertNotebookToSqlResult var result = new ConvertNotebookToSqlResult
{
Content = ConvertNotebookDocToSql(notebookDoc)
};
await requestContext.SendResult(result);
}
catch (Exception e)
{ {
await requestContext.SendError(e); Content = ConvertNotebookDocToSql(notebookDoc)
} };
await requestContext.SendResult(result);
} }
internal async Task HandleConvertSqlToNotebookRequest(ConvertSqlToNotebookParams parameters, RequestContext<ConvertSqlToNotebookResult> requestContext) internal async Task HandleConvertSqlToNotebookRequest(ConvertSqlToNotebookParams parameters, RequestContext<ConvertSqlToNotebookResult> requestContext)
{ {
try // This URI doesn't come in escaped - so if it's a file path with reserved characters (such as %)
// then we'll fail to find it since GetFile expects the URI to be a fully-escaped URI as that's
// what the document events are sent in as.
var escapedClientUri = Uri.EscapeUriString(parameters.ClientUri);
var file = WorkspaceService<SqlToolsSettings>.Instance.Workspace.GetFile(escapedClientUri);
// Temporary notebook that we just fill in with the sql until the parsing logic is added
var result = new ConvertSqlToNotebookResult
{ {
// This URI doesn't come in escaped - so if it's a file path with reserved characters (such as %) Content = JsonConvert.SerializeObject(ConvertSqlToNotebook(file.Contents))
// then we'll fail to find it since GetFile expects the URI to be a fully-escaped URI as that's };
// what the document events are sent in as. await requestContext.SendResult(result);
var escapedClientUri = Uri.EscapeUriString(parameters.ClientUri);
var file = WorkspaceService<SqlToolsSettings>.Instance.Workspace.GetFile(escapedClientUri);
// Temporary notebook that we just fill in with the sql until the parsing logic is added
var result = new ConvertSqlToNotebookResult
{
Content = JsonConvert.SerializeObject(ConvertSqlToNotebook(file.Contents))
};
await requestContext.SendResult(result);
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
#endregion // Convert Handlers #endregion // Convert Handlers

View File

@@ -108,7 +108,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
connectionService.RegisterConnectedQueue(connectionName, bindingQueue); connectionService.RegisterConnectedQueue(connectionName, bindingQueue);
} }
catch(Exception ex) catch (Exception ex)
{ {
Logger.Write(TraceEventType.Error, ex.Message); Logger.Write(TraceEventType.Error, ex.Message);
} }
@@ -164,30 +164,23 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
internal async Task HandleCreateSessionRequest(ConnectionDetails connectionDetails, RequestContext<CreateSessionResponse> context) internal async Task HandleCreateSessionRequest(ConnectionDetails connectionDetails, RequestContext<CreateSessionResponse> context)
{ {
try Logger.Write(TraceEventType.Verbose, "HandleCreateSessionRequest");
Func<Task<CreateSessionResponse>> doCreateSession = async () =>
{ {
Logger.Write(TraceEventType.Verbose, "HandleCreateSessionRequest"); Validate.IsNotNull(nameof(connectionDetails), connectionDetails);
Func<Task<CreateSessionResponse>> doCreateSession = async () => Validate.IsNotNull(nameof(context), context);
return await Task.Run(() =>
{ {
Validate.IsNotNull(nameof(connectionDetails), connectionDetails); string uri = GenerateUri(connectionDetails);
Validate.IsNotNull(nameof(context), context);
return await Task.Run(() =>
{
string uri = GenerateUri(connectionDetails);
return new CreateSessionResponse { SessionId = uri }; return new CreateSessionResponse { SessionId = uri };
}); });
}; };
CreateSessionResponse response = await HandleRequestAsync(doCreateSession, context, "HandleCreateSessionRequest"); CreateSessionResponse response = await HandleRequestAsync(doCreateSession, context, "HandleCreateSessionRequest");
if (response != null) if (response != null)
{
RunCreateSessionTask(connectionDetails, response.SessionId);
}
}
catch (Exception ex)
{ {
await context.SendError(ex.ToString()); RunCreateSessionTask(connectionDetails, response.SessionId);
} }
} }
@@ -225,34 +218,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
internal async Task HandleRefreshRequest(RefreshParams refreshParams, RequestContext<bool> context) internal async Task HandleRefreshRequest(RefreshParams refreshParams, RequestContext<bool> context)
{ {
try Logger.Write(TraceEventType.Verbose, "HandleRefreshRequest");
{ Validate.IsNotNull(nameof(refreshParams), refreshParams);
Logger.Write(TraceEventType.Verbose, "HandleRefreshRequest"); Validate.IsNotNull(nameof(context), context);
Validate.IsNotNull(nameof(refreshParams), refreshParams);
Validate.IsNotNull(nameof(context), context);
string uri = refreshParams.SessionId; string uri = refreshParams.SessionId;
ObjectExplorerSession session = null; ObjectExplorerSession session = null;
if (string.IsNullOrEmpty(uri) || !sessionMap.TryGetValue(uri, out session)) if (string.IsNullOrEmpty(uri) || !sessionMap.TryGetValue(uri, out session))
{
Logger.Write(TraceEventType.Verbose, $"Cannot expand object explorer node. Couldn't find session for uri. {uri} ");
await serviceHost.SendEvent(ExpandCompleteNotification.Type, new ExpandResponse
{
SessionId = refreshParams.SessionId,
NodePath = refreshParams.NodePath,
ErrorMessage = $"Couldn't find session for session: {uri}"
});
}
else
{
RunExpandTask(session, refreshParams, true);
}
await context.SendResult(true);
}
catch (Exception ex)
{ {
await context.SendError(ex.ToString()); Logger.Write(TraceEventType.Verbose, $"Cannot expand object explorer node. Couldn't find session for uri. {uri} ");
await serviceHost.SendEvent(ExpandCompleteNotification.Type, new ExpandResponse
{
SessionId = refreshParams.SessionId,
NodePath = refreshParams.NodePath,
ErrorMessage = $"Couldn't find session for session: {uri}"
});
} }
else
{
RunExpandTask(session, refreshParams, true);
}
await context.SendResult(true);
} }
internal async Task HandleCloseSessionRequest(CloseSessionParams closeSessionParams, RequestContext<CloseSessionResponse> context) internal async Task HandleCloseSessionRequest(CloseSessionParams closeSessionParams, RequestContext<CloseSessionResponse> context)
@@ -304,7 +290,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
if (sessionMap.TryGetValue(uri, out session)) if (sessionMap.TryGetValue(uri, out session))
{ {
// Remove the session from active sessions and disconnect // Remove the session from active sessions and disconnect
if(sessionMap.TryRemove(session.Uri, out session)) if (sessionMap.TryRemove(session.Uri, out session))
{ {
if (session != null && session.ConnectionInfo != null) if (session != null && session.ConnectionInfo != null)
{ {
@@ -442,7 +428,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
bindingContext.ServerConnection.SqlConnectionObject.ChangeDatabase(bindingContext.ServerConnection.DatabaseName); bindingContext.ServerConnection.SqlConnectionObject.ChangeDatabase(bindingContext.ServerConnection.DatabaseName);
} }
} }
catch(Exception ex) catch (Exception ex)
{ {
Logger.Write(TraceEventType.Warning, $"Failed to change the database in OE connection. error: {ex.Message}"); Logger.Write(TraceEventType.Warning, $"Failed to change the database in OE connection. error: {ex.Message}");
// We should just try to change the connection. If it fails, there's not much we can do // We should just try to change the connection. If it fails, there's not much we can do
@@ -515,7 +501,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
} }
return session; return session;
} }
catch(Exception ex) catch (Exception ex)
{ {
await SendSessionFailedNotification(uri, ex.Message); await SendSessionFailedNotification(uri, ex.Message);
return null; return null;
@@ -529,7 +515,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
{ {
// open connection based on request details // open connection based on request details
ConnectionCompleteParams result = await connectionService.Connect(connectParams); ConnectionCompleteParams result = await connectionService.Connect(connectParams);
connectionErrorMessage = result != null ? $"{result.Messages} error code:{result.ErrorNumber}" : string.Empty; connectionErrorMessage = result != null ? $"{result.Messages} error code:{result.ErrorNumber}" : string.Empty;
if (result != null && !string.IsNullOrEmpty(result.ConnectionId)) if (result != null && !string.IsNullOrEmpty(result.ConnectionId))
{ {
return result; return result;
@@ -575,18 +561,18 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
private void RunExpandTask(ObjectExplorerSession session, ExpandParams expandParams, bool forceRefresh = false) private void RunExpandTask(ObjectExplorerSession session, ExpandParams expandParams, bool forceRefresh = false)
{ {
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
Task task = ExpandNodeAsync(session, expandParams, cancellationTokenSource.Token, forceRefresh); Task task = ExpandNodeAsync(session, expandParams, cancellationTokenSource.Token, forceRefresh);
ExpandTask = task; ExpandTask = task;
Task.Run(async () => Task.Run(async () =>
{ {
ObjectExplorerTaskResult result = await RunTaskWithTimeout(task, ObjectExplorerTaskResult result = await RunTaskWithTimeout(task,
settings?.ExpandTimeout ?? ObjectExplorerSettings.DefaultExpandTimeout); settings?.ExpandTimeout ?? ObjectExplorerSettings.DefaultExpandTimeout);
if (result != null && !result.IsCompleted) if (result != null && !result.IsCompleted)
{ {
cancellationTokenSource.Cancel(); cancellationTokenSource.Cancel();
ExpandResponse response = CreateExpandResponse(session, expandParams); ExpandResponse response = CreateExpandResponse(session, expandParams);
response.ErrorMessage = result.Exception != null ? result.Exception.Message: $"Failed to expand node: {expandParams.NodePath} in session {session.Uri}"; response.ErrorMessage = result.Exception != null ? result.Exception.Message : $"Failed to expand node: {expandParams.NodePath} in session {session.Uri}";
await serviceHost.SendEvent(ExpandCompleteNotification.Type, response); await serviceHost.SendEvent(ExpandCompleteNotification.Type, response);
} }
return result; return result;
@@ -599,7 +585,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
TimeSpan timeout = TimeSpan.FromSeconds(timeoutInSec); TimeSpan timeout = TimeSpan.FromSeconds(timeoutInSec);
await Task.WhenAny(task, Task.Delay(timeout)); await Task.WhenAny(task, Task.Delay(timeout));
result.IsCompleted = task.IsCompleted; result.IsCompleted = task.IsCompleted;
if(task.Exception != null) if (task.Exception != null)
{ {
result.Exception = task.Exception; result.Exception = task.Exception;
} }

View File

@@ -115,55 +115,48 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandleCreateXEventSessionRequest(CreateXEventSessionParams parameters, RequestContext<CreateXEventSessionResult> requestContext) internal async Task HandleCreateXEventSessionRequest(CreateXEventSessionParams parameters, RequestContext<CreateXEventSessionResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo == null)
{ {
ConnectionInfo connInfo; throw new Exception(SR.ProfilerConnectionNotFound);
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo == null)
{
throw new Exception(SR.ProfilerConnectionNotFound);
}
else if (parameters.SessionName == null)
{
throw new ArgumentNullException("SessionName");
}
else if (parameters.Template == null)
{
throw new ArgumentNullException("Template");
}
else
{
IXEventSession xeSession = null;
// first check whether the session with the given name already exists.
// if so skip the creation part. An exception will be thrown if no session with given name can be found,
// and it can be ignored.
try
{
xeSession = this.XEventSessionFactory.GetXEventSession(parameters.SessionName, connInfo);
}
catch { }
if (xeSession == null)
{
// create a new XEvent session and Profiler session
xeSession = this.XEventSessionFactory.CreateXEventSession(parameters.Template.CreateStatement, parameters.SessionName, connInfo);
}
// start monitoring the profiler session
monitor.StartMonitoringSession(parameters.OwnerUri, xeSession);
var result = new CreateXEventSessionResult();
await requestContext.SendResult(result);
SessionCreatedNotification(parameters.OwnerUri, parameters.SessionName, parameters.Template.Name);
}
} }
catch (Exception e) else if (parameters.SessionName == null)
{ {
await requestContext.SendError(new Exception(SR.CreateSessionFailed(e.Message))); throw new ArgumentNullException("SessionName");
}
else if (parameters.Template == null)
{
throw new ArgumentNullException("Template");
}
else
{
IXEventSession xeSession = null;
// first check whether the session with the given name already exists.
// if so skip the creation part. An exception will be thrown if no session with given name can be found,
// and it can be ignored.
try
{
xeSession = this.XEventSessionFactory.GetXEventSession(parameters.SessionName, connInfo);
}
catch { }
if (xeSession == null)
{
// create a new XEvent session and Profiler session
xeSession = this.XEventSessionFactory.CreateXEventSession(parameters.Template.CreateStatement, parameters.SessionName, connInfo);
}
// start monitoring the profiler session
monitor.StartMonitoringSession(parameters.OwnerUri, xeSession);
var result = new CreateXEventSessionResult();
await requestContext.SendResult(result);
SessionCreatedNotification(parameters.OwnerUri, parameters.SessionName, parameters.Template.Name);
} }
} }
@@ -172,30 +165,23 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandleStartProfilingRequest(StartProfilingParams parameters, RequestContext<StartProfilingResult> requestContext) internal async Task HandleStartProfilingRequest(StartProfilingParams parameters, RequestContext<StartProfilingResult> requestContext)
{ {
try ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo != null)
{ {
ConnectionInfo connInfo; // create a new XEvent session and Profiler session
ConnectionServiceInstance.TryFindConnection( var xeSession = this.XEventSessionFactory.GetXEventSession(parameters.SessionName, connInfo);
parameters.OwnerUri, // start monitoring the profiler session
out connInfo); monitor.StartMonitoringSession(parameters.OwnerUri, xeSession);
if (connInfo != null)
{
// create a new XEvent session and Profiler session
var xeSession = this.XEventSessionFactory.GetXEventSession(parameters.SessionName, connInfo);
// start monitoring the profiler session
monitor.StartMonitoringSession(parameters.OwnerUri, xeSession);
var result = new StartProfilingResult(); var result = new StartProfilingResult();
await requestContext.SendResult(result); await requestContext.SendResult(result);
}
else
{
throw new Exception(SR.ProfilerConnectionNotFound);
}
} }
catch (Exception e) else
{ {
await requestContext.SendError(new Exception(SR.StartSessionFailed(e.Message))); throw new Exception(SR.ProfilerConnectionNotFound);
} }
} }
@@ -204,43 +190,36 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandleStopProfilingRequest(StopProfilingParams parameters, RequestContext<StopProfilingResult> requestContext) internal async Task HandleStopProfilingRequest(StopProfilingParams parameters, RequestContext<StopProfilingResult> requestContext)
{ {
try ProfilerSession session;
{ monitor.StopMonitoringSession(parameters.OwnerUri, out session);
ProfilerSession session;
monitor.StopMonitoringSession(parameters.OwnerUri, out session);
if (session != null) if (session != null)
{
// Occasionally we might see the InvalidOperationException due to a read is
// in progress, add the following retry logic will solve the problem.
int remainingAttempts = 3;
while (true)
{ {
// Occasionally we might see the InvalidOperationException due to a read is try
// in progress, add the following retry logic will solve the problem.
int remainingAttempts = 3;
while (true)
{ {
try session.XEventSession.Stop();
await requestContext.SendResult(new StopProfilingResult { });
break;
}
catch (InvalidOperationException)
{
remainingAttempts--;
if (remainingAttempts == 0)
{ {
session.XEventSession.Stop(); throw;
await requestContext.SendResult(new StopProfilingResult { });
break;
}
catch (InvalidOperationException)
{
remainingAttempts--;
if (remainingAttempts == 0)
{
throw;
}
Thread.Sleep(500);
} }
Thread.Sleep(500);
} }
} }
else
{
throw new Exception(SR.SessionNotFound);
}
} }
catch (Exception e) else
{ {
await requestContext.SendError(new Exception(SR.StopSessionFailed(e.Message))); throw new Exception(SR.SessionNotFound);
} }
} }
@@ -249,16 +228,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandlePauseProfilingRequest(PauseProfilingParams parameters, RequestContext<PauseProfilingResult> requestContext) internal async Task HandlePauseProfilingRequest(PauseProfilingParams parameters, RequestContext<PauseProfilingResult> requestContext)
{ {
try monitor.PauseViewer(parameters.OwnerUri);
{
monitor.PauseViewer(parameters.OwnerUri);
await requestContext.SendResult(new PauseProfilingResult { }); await requestContext.SendResult(new PauseProfilingResult { });
}
catch (Exception e)
{
await requestContext.SendError(new Exception(SR.PauseSessionFailed(e.Message)));
}
} }
/// <summary> /// <summary>
@@ -266,27 +238,20 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandleGetXEventSessionsRequest(GetXEventSessionsParams parameters, RequestContext<GetXEventSessionsResult> requestContext) internal async Task HandleGetXEventSessionsRequest(GetXEventSessionsParams parameters, RequestContext<GetXEventSessionsResult> requestContext)
{ {
try var result = new GetXEventSessionsResult();
ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo == null)
{ {
var result = new GetXEventSessionsResult(); await requestContext.SendError(new Exception(SR.ProfilerConnectionNotFound));
ConnectionInfo connInfo;
ConnectionServiceInstance.TryFindConnection(
parameters.OwnerUri,
out connInfo);
if (connInfo == null)
{
await requestContext.SendError(new Exception(SR.ProfilerConnectionNotFound));
}
else
{
List<string> sessions = GetXEventSessionList(parameters.OwnerUri, connInfo);
result.Sessions = sessions;
await requestContext.SendResult(result);
}
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); List<string> sessions = GetXEventSessionList(parameters.OwnerUri, connInfo);
result.Sessions = sessions;
await requestContext.SendResult(result);
} }
} }
@@ -295,14 +260,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
/// </summary> /// </summary>
internal async Task HandleDisconnectSessionRequest(DisconnectSessionParams parameters, RequestContext<DisconnectSessionResult> requestContext) internal async Task HandleDisconnectSessionRequest(DisconnectSessionParams parameters, RequestContext<DisconnectSessionResult> requestContext)
{ {
try monitor.StopMonitoringSession(parameters.OwnerUri, out _);
{
monitor.StopMonitoringSession(parameters.OwnerUri, out _);
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>

View File

@@ -201,42 +201,36 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
/// <summary> /// <summary>
/// Handles request to execute a selection of a document in the workspace service /// Handles request to execute a selection of a document in the workspace service
/// </summary> /// </summary>
internal async Task HandleExecuteRequest(ExecuteRequestParamsBase executeParams, internal Task HandleExecuteRequest(ExecuteRequestParamsBase executeParams,
RequestContext<ExecuteRequestResult> requestContext) RequestContext<ExecuteRequestResult> requestContext)
{ {
try // Setup actions to perform upon successful start and on failure to start
Func<Query, Task<bool>> queryCreateSuccessAction = async q =>
{ {
// Setup actions to perform upon successful start and on failure to start await requestContext.SendResult(new ExecuteRequestResult());
Func<Query, Task<bool>> queryCreateSuccessAction = async q => Logger.Write(TraceEventType.Stop, $"Response for Query: '{executeParams.OwnerUri} sent. Query Complete!");
{ return true;
await requestContext.SendResult(new ExecuteRequestResult()); };
Logger.Write(TraceEventType.Stop, $"Response for Query: '{executeParams.OwnerUri} sent. Query Complete!"); Func<string, Task> queryCreateFailureAction = message =>
return true; {
}; Logger.Write(TraceEventType.Warning, $"Failed to create Query: '{executeParams.OwnerUri}. Message: '{message}' Complete!");
Func<string, Task> queryCreateFailureAction = message => return requestContext.SendError(message);
{ };
Logger.Write(TraceEventType.Warning, $"Failed to create Query: '{executeParams.OwnerUri}. Message: '{message}' Complete!");
return requestContext.SendError(message);
};
// Use the internal handler to launch the query // Use the internal handler to launch the query
WorkTask = Task.Run(async () => WorkTask = Task.Run(async () =>
{
await InterServiceExecuteQuery(
executeParams,
null,
requestContext,
queryCreateSuccessAction,
queryCreateFailureAction,
null,
null,
isQueryEditor(executeParams.OwnerUri));
});
}
catch (Exception ex)
{ {
await requestContext.SendError(ex.ToString()); await InterServiceExecuteQuery(
} executeParams,
null,
requestContext,
queryCreateSuccessAction,
queryCreateFailureAction,
null,
null,
isQueryEditor(executeParams.OwnerUri));
});
return Task.CompletedTask;
} }
/// <summary> /// <summary>
@@ -245,116 +239,109 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
internal async Task HandleSimpleExecuteRequest(SimpleExecuteParams executeParams, internal async Task HandleSimpleExecuteRequest(SimpleExecuteParams executeParams,
RequestContext<SimpleExecuteResult> requestContext) RequestContext<SimpleExecuteResult> requestContext)
{ {
try string randomUri = Guid.NewGuid().ToString();
ExecuteStringParams executeStringParams = new ExecuteStringParams
{ {
string randomUri = Guid.NewGuid().ToString(); Query = executeParams.QueryString,
ExecuteStringParams executeStringParams = new ExecuteStringParams // generate guid as the owner uri to make sure every query is unique
OwnerUri = randomUri
};
// get connection
ConnectionInfo connInfo;
if (!ConnectionService.TryFindConnection(executeParams.OwnerUri, out connInfo))
{
await requestContext.SendError(SR.QueryServiceQueryInvalidOwnerUri);
return;
}
ConnectParams connectParams = new ConnectParams
{
OwnerUri = randomUri,
Connection = connInfo.ConnectionDetails,
Type = ConnectionType.Default
};
Task workTask = Task.Run(async () =>
{
await ConnectionService.Connect(connectParams);
ConnectionInfo newConn;
ConnectionService.TryFindConnection(randomUri, out newConn);
Func<string, Task> queryCreateFailureAction = message => requestContext.SendError(message);
ResultOnlyContext<SimpleExecuteResult> newContext = new ResultOnlyContext<SimpleExecuteResult>(requestContext);
// handle sending event back when the query completes
Query.QueryAsyncEventHandler queryComplete = async query =>
{ {
Query = executeParams.QueryString, try
// generate guid as the owner uri to make sure every query is unique
OwnerUri = randomUri
};
// get connection
ConnectionInfo connInfo;
if (!ConnectionService.TryFindConnection(executeParams.OwnerUri, out connInfo))
{
await requestContext.SendError(SR.QueryServiceQueryInvalidOwnerUri);
return;
}
ConnectParams connectParams = new ConnectParams
{
OwnerUri = randomUri,
Connection = connInfo.ConnectionDetails,
Type = ConnectionType.Default
};
Task workTask = Task.Run(async () =>
{
await ConnectionService.Connect(connectParams);
ConnectionInfo newConn;
ConnectionService.TryFindConnection(randomUri, out newConn);
Func<string, Task> queryCreateFailureAction = message => requestContext.SendError(message);
ResultOnlyContext<SimpleExecuteResult> newContext = new ResultOnlyContext<SimpleExecuteResult>(requestContext);
// handle sending event back when the query completes
Query.QueryAsyncEventHandler queryComplete = async query =>
{ {
try // check to make sure any results were recieved
if (query.Batches.Length == 0
|| query.Batches[0].ResultSets.Count == 0)
{ {
// check to make sure any results were recieved await requestContext.SendError(SR.QueryServiceResultSetHasNoResults);
if (query.Batches.Length == 0 return;
|| query.Batches[0].ResultSets.Count == 0)
{
await requestContext.SendError(SR.QueryServiceResultSetHasNoResults);
return;
}
long rowCount = query.Batches[0].ResultSets[0].RowCount;
// check to make sure there is a safe amount of rows to load into memory
if (rowCount > Int32.MaxValue)
{
await requestContext.SendError(SR.QueryServiceResultSetTooLarge);
return;
}
SimpleExecuteResult result = new SimpleExecuteResult
{
RowCount = rowCount,
ColumnInfo = query.Batches[0].ResultSets[0].Columns,
Rows = new DbCellValue[0][]
};
if (rowCount > 0)
{
SubsetParams subsetRequestParams = new SubsetParams
{
OwnerUri = randomUri,
BatchIndex = 0,
ResultSetIndex = 0,
RowsStartIndex = 0,
RowsCount = Convert.ToInt32(rowCount)
};
// get the data to send back
ResultSetSubset subset = await InterServiceResultSubset(subsetRequestParams);
result.Rows = subset.Rows;
}
await requestContext.SendResult(result);
} }
finally
long rowCount = query.Batches[0].ResultSets[0].RowCount;
// check to make sure there is a safe amount of rows to load into memory
if (rowCount > Int32.MaxValue)
{ {
Query removedQuery; await requestContext.SendError(SR.QueryServiceResultSetTooLarge);
Task removedTask; return;
// remove the active query since we are done with it }
ActiveQueries.TryRemove(randomUri, out removedQuery);
ActiveSimpleExecuteRequests.TryRemove(randomUri, out removedTask); SimpleExecuteResult result = new SimpleExecuteResult
ConnectionService.Disconnect(new DisconnectParams() {
RowCount = rowCount,
ColumnInfo = query.Batches[0].ResultSets[0].Columns,
Rows = new DbCellValue[0][]
};
if (rowCount > 0)
{
SubsetParams subsetRequestParams = new SubsetParams
{ {
OwnerUri = randomUri, OwnerUri = randomUri,
Type = null BatchIndex = 0,
}); ResultSetIndex = 0,
RowsStartIndex = 0,
RowsCount = Convert.ToInt32(rowCount)
};
// get the data to send back
ResultSetSubset subset = await InterServiceResultSubset(subsetRequestParams);
result.Rows = subset.Rows;
} }
}; await requestContext.SendResult(result);
}
// handle sending error back when query fails finally
Query.QueryAsyncErrorEventHandler queryFail = async (q, e) =>
{ {
await requestContext.SendError(e); Query removedQuery;
}; Task removedTask;
// remove the active query since we are done with it
ActiveQueries.TryRemove(randomUri, out removedQuery);
ActiveSimpleExecuteRequests.TryRemove(randomUri, out removedTask);
ConnectionService.Disconnect(new DisconnectParams()
{
OwnerUri = randomUri,
Type = null
});
}
};
await InterServiceExecuteQuery(executeStringParams, newConn, newContext, null, queryCreateFailureAction, queryComplete, queryFail); // handle sending error back when query fails
}); Query.QueryAsyncErrorEventHandler queryFail = async (q, e) =>
{
await requestContext.SendError(e);
};
ActiveSimpleExecuteRequests.TryAdd(randomUri, workTask); await InterServiceExecuteQuery(executeStringParams, newConn, newContext, null, queryCreateFailureAction, queryComplete, queryFail);
} });
catch (Exception ex)
{ ActiveSimpleExecuteRequests.TryAdd(randomUri, workTask);
await requestContext.SendError(ex.ToString());
}
} }
@@ -392,21 +379,13 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
internal async Task HandleResultSubsetRequest(SubsetParams subsetParams, internal async Task HandleResultSubsetRequest(SubsetParams subsetParams,
RequestContext<SubsetResult> requestContext) RequestContext<SubsetResult> requestContext)
{ {
try ResultSetSubset subset = await InterServiceResultSubset(subsetParams);
var result = new SubsetResult
{ {
ResultSetSubset subset = await InterServiceResultSubset(subsetParams); ResultSubset = subset
var result = new SubsetResult };
{ await requestContext.SendResult(result);
ResultSubset = subset Logger.Write(TraceEventType.Stop, $"Done Handler for Subset request with for Query:'{subsetParams.OwnerUri}', Batch:'{subsetParams.BatchIndex}', ResultSetIndex:'{subsetParams.ResultSetIndex}', RowsStartIndex'{subsetParams.RowsStartIndex}', Requested RowsCount:'{subsetParams.RowsCount}'\r\n\t\t with subset response of:[ RowCount:'{subset.RowCount}', Rows array of length:'{subset.Rows.Length}']");
};
await requestContext.SendResult(result);
Logger.Write(TraceEventType.Stop, $"Done Handler for Subset request with for Query:'{subsetParams.OwnerUri}', Batch:'{subsetParams.BatchIndex}', ResultSetIndex:'{subsetParams.ResultSetIndex}', RowsStartIndex'{subsetParams.RowsStartIndex}', Requested RowsCount:'{subsetParams.RowsCount}'\r\n\t\t with subset response of:[ RowCount:'{subset.RowCount}', Rows array of length:'{subset.Rows.Length}']");
}
catch (Exception e)
{
// This was unexpected, so send back as error
await requestContext.SendError(e.Message);
}
} }
@@ -416,24 +395,16 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
internal async Task HandleQueryExecutionOptionsRequest(QueryExecutionOptionsParams queryExecutionOptionsParams, internal async Task HandleQueryExecutionOptionsRequest(QueryExecutionOptionsParams queryExecutionOptionsParams,
RequestContext<bool> requestContext) RequestContext<bool> requestContext)
{ {
try string uri = queryExecutionOptionsParams.OwnerUri;
if (ActiveQueryExecutionSettings.ContainsKey(uri))
{ {
string uri = queryExecutionOptionsParams.OwnerUri; QueryExecutionSettings settings;
if (ActiveQueryExecutionSettings.ContainsKey(uri)) ActiveQueryExecutionSettings.TryRemove(uri, out settings);
{
QueryExecutionSettings settings;
ActiveQueryExecutionSettings.TryRemove(uri, out settings);
}
ActiveQueryExecutionSettings.TryAdd(uri, queryExecutionOptionsParams.Options);
await requestContext.SendResult(true);
}
catch (Exception e)
{
// This was unexpected, so send back as error
await requestContext.SendError(e.Message);
} }
ActiveQueryExecutionSettings.TryAdd(uri, queryExecutionOptionsParams.Options);
await requestContext.SendResult(true);
} }
/// <summary> /// <summary>
@@ -442,28 +413,20 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
internal async Task HandleExecutionPlanRequest(QueryExecutionPlanParams planParams, internal async Task HandleExecutionPlanRequest(QueryExecutionPlanParams planParams,
RequestContext<QueryExecutionPlanResult> requestContext) RequestContext<QueryExecutionPlanResult> requestContext)
{ {
try // Attempt to load the query
Query query;
if (!ActiveQueries.TryGetValue(planParams.OwnerUri, out query))
{ {
// Attempt to load the query await requestContext.SendError(SR.QueryServiceRequestsNoQuery);
Query query; return;
if (!ActiveQueries.TryGetValue(planParams.OwnerUri, out query)) }
{
await requestContext.SendError(SR.QueryServiceRequestsNoQuery);
return;
}
// Retrieve the requested execution plan and return it // Retrieve the requested execution plan and return it
var result = new QueryExecutionPlanResult var result = new QueryExecutionPlanResult
{
ExecutionPlan = await query.GetExecutionPlan(planParams.BatchIndex, planParams.ResultSetIndex)
};
await requestContext.SendResult(result);
}
catch (Exception e)
{ {
// This was unexpected, so send back as error ExecutionPlan = await query.GetExecutionPlan(planParams.BatchIndex, planParams.ResultSetIndex)
await requestContext.SendError(e.Message); };
} await requestContext.SendResult(result);
} }
/// <summary> /// <summary>
@@ -511,10 +474,6 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
Messages = e.Message Messages = e.Message
}); });
} }
catch (Exception e)
{
await requestContext.SendError(e.Message);
}
} }
/// <summary> /// <summary>

View File

@@ -63,61 +63,55 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
/// Handles schema compare request /// Handles schema compare request
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task HandleSchemaCompareRequest(SchemaCompareParams parameters, RequestContext<SchemaCompareResult> requestContext) public Task HandleSchemaCompareRequest(SchemaCompareParams parameters, RequestContext<SchemaCompareResult> requestContext)
{ {
try ConnectionInfo sourceConnInfo;
{ ConnectionInfo targetConnInfo;
ConnectionInfo sourceConnInfo; ConnectionServiceInstance.TryFindConnection(
ConnectionInfo targetConnInfo; parameters.SourceEndpointInfo.OwnerUri,
ConnectionServiceInstance.TryFindConnection( out sourceConnInfo);
parameters.SourceEndpointInfo.OwnerUri, ConnectionServiceInstance.TryFindConnection(
out sourceConnInfo); parameters.TargetEndpointInfo.OwnerUri,
ConnectionServiceInstance.TryFindConnection( out targetConnInfo);
parameters.TargetEndpointInfo.OwnerUri,
out targetConnInfo);
CurrentSchemaCompareTask = Task.Run(async () => CurrentSchemaCompareTask = Task.Run(async () =>
{
SchemaCompareOperation operation = null;
try
{ {
SchemaCompareOperation operation = null; operation = new SchemaCompareOperation(parameters, sourceConnInfo, targetConnInfo);
currentComparisonCancellationAction.Value[operation.OperationId] = operation.Cancel;
operation.Execute(parameters.TaskExecutionMode);
try // add result to dictionary of results
schemaCompareResults.Value[operation.OperationId] = operation.ComparisonResult;
await requestContext.SendResult(new SchemaCompareResult()
{ {
operation = new SchemaCompareOperation(parameters, sourceConnInfo, targetConnInfo); OperationId = operation.OperationId,
currentComparisonCancellationAction.Value[operation.OperationId] = operation.Cancel; Success = operation.ComparisonResult.IsValid,
operation.Execute(parameters.TaskExecutionMode); ErrorMessage = operation.ErrorMessage,
AreEqual = operation.ComparisonResult.IsEqual,
Differences = operation.Differences
});
// add result to dictionary of results // clean up cancellation action now that the operation is complete (using try remove to avoid exception)
schemaCompareResults.Value[operation.OperationId] = operation.ComparisonResult; Action cancelAction = null;
currentComparisonCancellationAction.Value.TryRemove(operation.OperationId, out cancelAction);
await requestContext.SendResult(new SchemaCompareResult() }
{ catch (Exception e)
OperationId = operation.OperationId, {
Success = operation.ComparisonResult.IsValid, Logger.Write(TraceEventType.Error, "Failed to compare schema. Error: " + e);
ErrorMessage = operation.ErrorMessage, await requestContext.SendResult(new SchemaCompareResult()
AreEqual = operation.ComparisonResult.IsEqual,
Differences = operation.Differences
});
// clean up cancellation action now that the operation is complete (using try remove to avoid exception)
Action cancelAction = null;
currentComparisonCancellationAction.Value.TryRemove(operation.OperationId, out cancelAction);
}
catch (Exception e)
{ {
Logger.Write(TraceEventType.Error, "Failed to compare schema. Error: " + e); OperationId = operation != null ? operation.OperationId : null,
await requestContext.SendResult(new SchemaCompareResult() Success = false,
{ ErrorMessage = operation == null ? e.Message : operation.ErrorMessage,
OperationId = operation != null ? operation.OperationId : null, });
Success = false, }
ErrorMessage = operation == null ? e.Message : operation.ErrorMessage, });
}); return Task.CompletedTask;
}
});
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>
@@ -126,34 +120,26 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
/// <returns></returns> /// <returns></returns>
public async Task HandleSchemaCompareCancelRequest(SchemaCompareCancelParams parameters, RequestContext<ResultStatus> requestContext) public async Task HandleSchemaCompareCancelRequest(SchemaCompareCancelParams parameters, RequestContext<ResultStatus> requestContext)
{ {
try Action cancelAction = null;
if (currentComparisonCancellationAction.Value.TryRemove(parameters.OperationId, out cancelAction))
{ {
Action cancelAction = null; if (cancelAction != null)
if (currentComparisonCancellationAction.Value.TryRemove(parameters.OperationId, out cancelAction))
{
if (cancelAction != null)
{
cancelAction.Invoke();
await requestContext.SendResult(new ResultStatus()
{
Success = true,
ErrorMessage = null
});
}
}
else
{ {
cancelAction.Invoke();
await requestContext.SendResult(new ResultStatus() await requestContext.SendResult(new ResultStatus()
{ {
Success = false, Success = true,
ErrorMessage = SR.SchemaCompareSessionNotFound ErrorMessage = null
}); });
} }
} }
catch (Exception e) else
{ {
await requestContext.SendError(e); await requestContext.SendResult(new ResultStatus()
{
Success = false,
ErrorMessage = SR.SchemaCompareSessionNotFound
});
} }
} }
@@ -294,7 +280,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
operation.Execute(parameters.TaskExecutionMode); operation.Execute(parameters.TaskExecutionMode);
// update the comparison result if the include/exclude was successful // update the comparison result if the include/exclude was successful
if(operation.Success) if (operation.Success)
{ {
schemaCompareResults.Value[parameters.OperationId] = operation.ComparisonResult; schemaCompareResults.Value[parameters.OperationId] = operation.ComparisonResult;
} }
@@ -353,79 +339,66 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
/// <returns></returns> /// <returns></returns>
public async Task HandleSchemaCompareOpenScmpRequest(SchemaCompareOpenScmpParams parameters, RequestContext<SchemaCompareOpenScmpResult> requestContext) public async Task HandleSchemaCompareOpenScmpRequest(SchemaCompareOpenScmpParams parameters, RequestContext<SchemaCompareOpenScmpResult> requestContext)
{ {
try CurrentSchemaCompareTask = Task.Run(async () =>
{ {
CurrentSchemaCompareTask = Task.Run(async () => SchemaCompareOpenScmpOperation operation = null;
try
{ {
SchemaCompareOpenScmpOperation operation = null; operation = new SchemaCompareOpenScmpOperation(parameters);
operation.Execute(TaskExecutionMode.Execute);
try await requestContext.SendResult(operation.Result);
}
catch (Exception e)
{
await requestContext.SendResult(new SchemaCompareOpenScmpResult()
{ {
operation = new SchemaCompareOpenScmpOperation(parameters); Success = false,
operation.Execute(TaskExecutionMode.Execute); ErrorMessage = operation == null ? e.Message : operation.ErrorMessage,
});
await requestContext.SendResult(operation.Result); }
} });
catch (Exception e)
{
await requestContext.SendResult(new SchemaCompareOpenScmpResult()
{
Success = false,
ErrorMessage = operation == null ? e.Message : operation.ErrorMessage,
});
}
});
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>
/// Handles schema compare save SCMP request /// Handles schema compare save SCMP request
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task HandleSchemaCompareSaveScmpRequest(SchemaCompareSaveScmpParams parameters, RequestContext<ResultStatus> requestContext) public Task HandleSchemaCompareSaveScmpRequest(SchemaCompareSaveScmpParams parameters, RequestContext<ResultStatus> requestContext)
{ {
try ConnectionInfo sourceConnInfo;
{ ConnectionInfo targetConnInfo;
ConnectionInfo sourceConnInfo; ConnectionServiceInstance.TryFindConnection(parameters.SourceEndpointInfo.OwnerUri, out sourceConnInfo);
ConnectionInfo targetConnInfo; ConnectionServiceInstance.TryFindConnection(parameters.TargetEndpointInfo.OwnerUri, out targetConnInfo);
ConnectionServiceInstance.TryFindConnection(parameters.SourceEndpointInfo.OwnerUri, out sourceConnInfo);
ConnectionServiceInstance.TryFindConnection(parameters.TargetEndpointInfo.OwnerUri, out targetConnInfo);
CurrentSchemaCompareTask = Task.Run(async () => CurrentSchemaCompareTask = Task.Run(async () =>
{
SchemaCompareSaveScmpOperation operation = null;
try
{ {
SchemaCompareSaveScmpOperation operation = null; operation = new SchemaCompareSaveScmpOperation(parameters, sourceConnInfo, targetConnInfo);
operation.Execute(parameters.TaskExecutionMode);
try await requestContext.SendResult(new ResultStatus()
{ {
operation = new SchemaCompareSaveScmpOperation(parameters, sourceConnInfo, targetConnInfo); Success = true,
operation.Execute(parameters.TaskExecutionMode); ErrorMessage = operation.ErrorMessage,
});
await requestContext.SendResult(new ResultStatus() }
{ catch (Exception e)
Success = true, {
ErrorMessage = operation.ErrorMessage, Logger.Write(TraceEventType.Error, "Failed to save scmp file. Error: " + e);
}); await requestContext.SendResult(new SchemaCompareResult()
}
catch (Exception e)
{ {
Logger.Write(TraceEventType.Error, "Failed to save scmp file. Error: " + e); OperationId = operation != null ? operation.OperationId : null,
await requestContext.SendResult(new SchemaCompareResult() Success = false,
{ ErrorMessage = operation == null ? e.Message : operation.ErrorMessage,
OperationId = operation != null ? operation.OperationId : null, });
Success = false, }
ErrorMessage = operation == null ? e.Message : operation.ErrorMessage, });
}); return Task.CompletedTask;
}
});
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
private SqlTaskManager SqlTaskManagerInstance private SqlTaskManager SqlTaskManagerInstance

View File

@@ -84,75 +84,60 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
/// </summary> /// </summary>
private async Task HandleListObjectsRequest(ScriptingListObjectsParams parameters, RequestContext<ScriptingListObjectsResult> requestContext) private async Task HandleListObjectsRequest(ScriptingListObjectsParams parameters, RequestContext<ScriptingListObjectsResult> requestContext)
{ {
try ScriptingListObjectsOperation operation = new ScriptingListObjectsOperation(parameters);
{ operation.CompleteNotification += (sender, e) => requestContext.SendEvent(ScriptingListObjectsCompleteEvent.Type, e);
ScriptingListObjectsOperation operation = new ScriptingListObjectsOperation(parameters);
operation.CompleteNotification += (sender, e) => requestContext.SendEvent(ScriptingListObjectsCompleteEvent.Type, e);
RunTask(requestContext, operation); RunTask(requestContext, operation);
await requestContext.SendResult(new ScriptingListObjectsResult { OperationId = operation.OperationId }); await requestContext.SendResult(new ScriptingListObjectsResult { OperationId = operation.OperationId });
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
/// <summary> /// <summary>
/// Handles request to start the scripting operation /// Handles request to start the scripting operation
/// </summary> /// </summary>
public async Task HandleScriptExecuteRequest(ScriptingParams parameters, RequestContext<ScriptingResult> requestContext) public Task HandleScriptExecuteRequest(ScriptingParams parameters, RequestContext<ScriptingResult> requestContext)
{ {
SmoScriptingOperation operation = null; SmoScriptingOperation operation = null;
// if a connection string wasn't provided as a parameter then
try // use the owner uri property to lookup its associated ConnectionInfo
// and then build a connection string out of that
ConnectionInfo connInfo = null;
string accessToken = null;
if (parameters.ConnectionString == null)
{ {
// if a connection string wasn't provided as a parameter then ScriptingService.ConnectionServiceInstance.TryFindConnection(parameters.OwnerUri, out connInfo);
// use the owner uri property to lookup its associated ConnectionInfo if (connInfo != null)
// and then build a connection string out of that
ConnectionInfo connInfo = null;
string accessToken = null;
if (parameters.ConnectionString == null)
{ {
ScriptingService.ConnectionServiceInstance.TryFindConnection(parameters.OwnerUri, out connInfo); parameters.ConnectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails);
if (connInfo != null) accessToken = connInfo.ConnectionDetails.AzureAccountToken;
{
parameters.ConnectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails);
accessToken = connInfo.ConnectionDetails.AzureAccountToken;
}
else
{
throw new Exception("Could not find ConnectionInfo");
}
}
if (parameters.FilePath == null)
{
// Create a temporary and random path to handle this operation
parameters.FilePath = Path.GetTempFileName();
}
if (!ShouldCreateScriptAsOperation(parameters))
{
operation = new ScriptingScriptOperation(parameters, accessToken);
} }
else else
{ {
operation = new ScriptAsScriptingOperation(parameters, accessToken); throw new Exception("Could not find ConnectionInfo");
} }
operation.PlanNotification += (sender, e) => requestContext.SendEvent(ScriptingPlanNotificationEvent.Type, e).Wait();
operation.ProgressNotification += (sender, e) => requestContext.SendEvent(ScriptingProgressNotificationEvent.Type, e).Wait();
operation.CompleteNotification += (sender, e) => this.SendScriptingCompleteEvent(requestContext, ScriptingCompleteEvent.Type, e, operation, parameters.ScriptDestination);
RunTask(requestContext, operation);
} }
catch (Exception e)
if (parameters.FilePath == null)
{ {
await requestContext.SendError(e); // Create a temporary and random path to handle this operation
parameters.FilePath = Path.GetTempFileName();
} }
if (!ShouldCreateScriptAsOperation(parameters))
{
operation = new ScriptingScriptOperation(parameters, accessToken);
}
else
{
operation = new ScriptAsScriptingOperation(parameters, accessToken);
}
operation.PlanNotification += (sender, e) => requestContext.SendEvent(ScriptingPlanNotificationEvent.Type, e).Wait();
operation.ProgressNotification += (sender, e) => requestContext.SendEvent(ScriptingProgressNotificationEvent.Type, e).Wait();
operation.CompleteNotification += (sender, e) => this.SendScriptingCompleteEvent(requestContext, ScriptingCompleteEvent.Type, e, operation, parameters.ScriptDestination);
RunTask(requestContext, operation);
return Task.CompletedTask;
} }
private bool ShouldCreateScriptAsOperation(ScriptingParams parameters) private bool ShouldCreateScriptAsOperation(ScriptingParams parameters)
@@ -160,7 +145,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
// Scripting as operation should be used to script one object. // Scripting as operation should be used to script one object.
// Scripting data and scripting to file is not supported by scripting as operation // Scripting data and scripting to file is not supported by scripting as operation
// To script Select, alter and execute use scripting as operation. The other operation doesn't support those types // To script Select, alter and execute use scripting as operation. The other operation doesn't support those types
if( (parameters.ScriptingObjects != null && parameters.ScriptingObjects.Count == 1 && parameters.ScriptOptions != null if ((parameters.ScriptingObjects != null && parameters.ScriptingObjects.Count == 1 && parameters.ScriptOptions != null
&& parameters.ScriptOptions.TypeOfDataToScript == "SchemaOnly" && parameters.ScriptDestination == "ToEditor") || && parameters.ScriptOptions.TypeOfDataToScript == "SchemaOnly" && parameters.ScriptDestination == "ToEditor") ||
parameters.Operation == ScriptingOperationType.Select || parameters.Operation == ScriptingOperationType.Execute || parameters.Operation == ScriptingOperationType.Select || parameters.Operation == ScriptingOperationType.Execute ||
parameters.Operation == ScriptingOperationType.Alter) parameters.Operation == ScriptingOperationType.Alter)
@@ -178,24 +163,17 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
/// </summary> /// </summary>
public async Task HandleScriptCancelRequest(ScriptingCancelParams parameters, RequestContext<ScriptingCancelResult> requestContext) public async Task HandleScriptCancelRequest(ScriptingCancelParams parameters, RequestContext<ScriptingCancelResult> requestContext)
{ {
try ScriptingOperation operation = null;
if (this.ActiveOperations.TryRemove(parameters.OperationId, out operation))
{ {
ScriptingOperation operation = null; operation.Cancel();
if (this.ActiveOperations.TryRemove(parameters.OperationId, out operation)) }
{ else
operation.Cancel(); {
} Logger.Write(TraceEventType.Information, string.Format("Operation {0} was not found", operation.OperationId));
else }
{
Logger.Write(TraceEventType.Information, string.Format("Operation {0} was not found", operation.OperationId));
}
await requestContext.SendResult(new ScriptingCancelResult()); await requestContext.SendResult(new ScriptingCancelResult());
}
catch (Exception e)
{
await requestContext.SendError(e);
}
} }
private async void SendScriptingCompleteEvent<TParams>(RequestContext<ScriptingResult> requestContext, EventType<TParams> eventType, TParams parameters, private async void SendScriptingCompleteEvent<TParams>(RequestContext<ScriptingResult> requestContext, EventType<TParams> eventType, TParams parameters,

View File

@@ -44,6 +44,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Agent
/// Verify that a job history request returns the job history /// Verify that a job history request returns the job history
/// </summary> /// </summary>
[Test] [Test]
[Ignore("Skipping test since it doesn't work - there's no jobs so it just immediately throws.")]
public async Task TestHandleJobHistoryRequests() public async Task TestHandleJobHistoryRequests()
{ {
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())

View File

@@ -93,17 +93,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensibility
{ {
ExternalLanguageOperations = operations.Object ExternalLanguageOperations = operations.Object
}; };
await VerifyError<ExternalLanguageDeleteResponseParams>( using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
test: async (requestContext, connectionUrl) => {
{ var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams var requestContext = RequestContextMocks.Create<ExternalLanguageDeleteResponseParams>(r => { });
{ ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams
OwnerUri = connectionUrl, {
LanguageName = language.Name OwnerUri = queryTempFile.FilePath,
}; LanguageName = language.Name
await service.HandleExternalLanguageDeleteRequest(requestParams, requestContext); };
return null; Assert.That(() => service.HandleExternalLanguageDeleteRequest(requestParams, requestContext.Object), Throws.Exception);
}); }
} }
[Test] [Test]
@@ -174,17 +174,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensibility
{ {
ExternalLanguageOperations = operations.Object ExternalLanguageOperations = operations.Object
}; };
await VerifyError<ExternalLanguageUpdateResponseParams>( using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
test: async (requestContext, connectionUrl) => {
{ var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams var requestContext = RequestContextMocks.Create<ExternalLanguageUpdateResponseParams>(r => { });
{ ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams
OwnerUri = connectionUrl, {
Language = language OwnerUri = queryTempFile.FilePath,
}; Language = language
await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext); };
return null; Assert.That(() => service.HandleExternalLanguageUpdateRequest(requestParams, requestContext.Object), Throws.Exception);
}); }
} }
[Test] [Test]
@@ -254,16 +254,16 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensibility
{ {
ExternalLanguageOperations = operations.Object ExternalLanguageOperations = operations.Object
}; };
await VerifyError<ExternalLanguageListResponseParams>( using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
test: async (requestContext, connectionUrl) => {
{ var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams var requestContext = RequestContextMocks.Create<ExternalLanguageListResponseParams>(r => { });
{ var requestParams = new ExternalLanguageListRequestParams
OwnerUri = connectionUrl {
}; OwnerUri = queryTempFile.FilePath
await service.HandleExternalLanguageListRequest(requestParams, requestContext); };
return null; Assert.That(() => service.HandleExternalLanguageListRequest(requestParams, requestContext.Object), Throws.Exception);
}); }
} }
[Test] [Test]

View File

@@ -58,7 +58,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Scripting
var scriptingParams = new ScriptingParams var scriptingParams = new ScriptingParams
{ {
OwnerUri = ConnectionService.BuildConnectionString(result.ConnectionInfo.ConnectionDetails) OwnerUri = result.ScriptFile.ClientUri
}; };
if (isSelectScript) if (isSelectScript)
{ {

View File

@@ -75,25 +75,19 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Credentials
} }
[Test] [Test]
public async Task SaveCredentialThrowsIfCredentialIdMissing() public void SaveCredentialThrowsIfCredentialIdMissing()
{ {
string errorResponse = null; var contextMock = RequestContextMocks.Create<bool>(null);
var contextMock = RequestContextMocks.Create<bool>(null).AddErrorHandling((msg, code, data) => errorResponse = msg); // Verify throws with no ID
Assert.That(() => service.HandleSaveCredentialRequest(new Credential(null), contextMock.Object), Throws.ArgumentException);
await service.HandleSaveCredentialRequest(new Credential(null), contextMock.Object);
TestUtils.VerifyErrorSent(contextMock);
Assert.That(errorResponse, Does.Contain("ArgumentException"));
} }
[Test] [Test]
public async Task SaveCredentialThrowsIfPasswordMissing() public void SaveCredentialThrowsIfPasswordMissing()
{ {
string errorResponse = null; var contextMock = RequestContextMocks.Create<bool>(null);
var contextMock = RequestContextMocks.Create<bool>(null).AddErrorHandling((msg, code, data) => errorResponse = msg); // Verify throws with no ID
Assert.That(() => service.HandleSaveCredentialRequest(new Credential(CredentialId), contextMock.Object), Throws.ArgumentNullException);
await service.HandleSaveCredentialRequest(new Credential(CredentialId), contextMock.Object);
TestUtils.VerifyErrorSent(contextMock);
Assert.True(errorResponse.Contains("ArgumentException") || errorResponse.Contains("ArgumentNullException"));
} }
[Test] [Test]
@@ -193,27 +187,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Credentials
} }
[Test] [Test]
public async Task ReadCredentialThrowsIfCredentialIsNull() public void ReadCredentialThrowsIfCredentialIsNull()
{ {
string errorResponse = null; var contextMock = RequestContextMocks.Create<Credential>(null);
var contextMock = RequestContextMocks.Create<Credential>(null).AddErrorHandling((msg, code, data) => errorResponse = msg);
// Verify throws on null, and this is sent as an error
await service.HandleReadCredentialRequest(null, contextMock.Object);
TestUtils.VerifyErrorSent(contextMock);
Assert.That(errorResponse, Does.Contain("ArgumentNullException"));
}
[Test]
public async Task ReadCredentialThrowsIfIdMissing()
{
string errorResponse = null;
var contextMock = RequestContextMocks.Create<Credential>(null).AddErrorHandling((msg, code, data) => errorResponse = msg);
// Verify throws with no ID // Verify throws with no ID
await service.HandleReadCredentialRequest(new Credential(), contextMock.Object); Assert.That(() => service.HandleReadCredentialRequest(new Credential(), contextMock.Object), Throws.ArgumentException);
TestUtils.VerifyErrorSent(contextMock);
Assert.That(errorResponse, Does.Contain("ArgumentException"));
} }
[Test] [Test]
@@ -235,15 +213,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Credentials
} }
[Test] [Test]
public async Task DeleteCredentialThrowsIfIdMissing() public void DeleteCredentialThrowsIfIdMissing()
{ {
object errorResponse = null; var contextMock = RequestContextMocks.Create<bool>(null);
var contextMock = RequestContextMocks.Create<bool>(null).AddErrorHandling((msg, code, data) => errorResponse = msg);
// Verify throws with no ID // Verify throws with no ID
await service.HandleDeleteCredentialRequest(new Credential(), contextMock.Object); Assert.That(() => service.HandleDeleteCredentialRequest(new Credential(), contextMock.Object), Throws.ArgumentException);
TestUtils.VerifyErrorSent(contextMock);
Assert.True(((string)errorResponse).Contains("ArgumentException"));
} }
[Test] [Test]

View File

@@ -26,7 +26,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
#region EditSession Operation Helper Tests #region EditSession Operation Helper Tests
[Test] [Test]
public async Task NullOrMissingSessionId([Values(null, "", " \t\n\r", "Does not exist")] string sessionId) public void NullOrMissingSessionId([Values(null, "", " \t\n\r", "Does not exist")] string sessionId)
{ {
// Setup: // Setup:
// ... Create a edit data service // ... Create a edit data service
@@ -34,14 +34,10 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
// ... Create a session params that returns the provided session ID // ... Create a session params that returns the provided session ID
var mockParams = new EditCreateRowParams {OwnerUri = sessionId}; var mockParams = new EditCreateRowParams {OwnerUri = sessionId};
var contextMock = RequestContextMocks.Create<EditDisposeResult>(null);
// If: I ask to perform an action that requires a session // If: I ask to perform an action that requires a session
// Then: I should get an error from it // Then: I should get an error from it
var efv = new EventFlowValidator<EditDisposeResult>() Assert.That(() => eds.HandleSessionRequest(mockParams, contextMock.Object, session => null), Throws.Exception);
.AddStandardErrorValidation()
.Complete();
await eds.HandleSessionRequest(mockParams, efv.Object, session => null);
efv.Validate();
} }
[Test] [Test]
@@ -54,14 +50,10 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
// ... Create a session param that returns the common owner uri // ... Create a session param that returns the common owner uri
var mockParams = new EditCreateRowParams { OwnerUri = Common.OwnerUri }; var mockParams = new EditCreateRowParams { OwnerUri = Common.OwnerUri };
var contextMock = RequestContextMocks.Create<EditDisposeResult>(null);
// If: I ask to perform an action that requires a session // If: I ask to perform an action that requires a session
// Then: I should get an error from it // Then: I should get an error from it
var efv = new EventFlowValidator<EditDisposeResult>() Assert.That(() => eds.HandleSessionRequest(mockParams, contextMock.Object, s => { throw new Exception(); }), Throws.Exception);
.AddStandardErrorValidation()
.Complete();
await eds.HandleSessionRequest(mockParams, efv.Object, s => { throw new Exception(); });
efv.Validate();
} }
@@ -71,18 +63,15 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
#region Dispose Tests #region Dispose Tests
[Test] [Test]
public async Task DisposeNullOrMissingSessionId([Values(null, "", " \t\n\r", "Does not exist")] string sessionId) public void DisposeNullOrMissingSessionId([Values(null, "", " \t\n\r", "Does not exist")] string sessionId)
{ {
// Setup: Create a edit data service // Setup: Create a edit data service
var eds = new EditDataService(null, null, null); var eds = new EditDataService(null, null, null);
// If: I ask to perform an action that requires a session // If: I ask to perform an action that requires a session
// Then: I should get an error from it // Then: I should get an error from it
var efv = new EventFlowValidator<EditDisposeResult>() var contextMock = RequestContextMocks.Create<EditDisposeResult>(null);
.AddStandardErrorValidation() Assert.That(() => eds.HandleDisposeRequest(new EditDisposeParams { OwnerUri = sessionId }, contextMock.Object), Throws.Exception);
.Complete();
await eds.HandleDisposeRequest(new EditDisposeParams {OwnerUri = sessionId}, efv.Object);
efv.Validate();
} }
[Test] [Test]
@@ -293,16 +282,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
OwnerUri = ownerUri, OwnerUri = ownerUri,
ObjectType = objType ObjectType = objType
}; };
var contextMock = RequestContextMocks.Create<EditInitializeResult>(null);
// ... And I initialize an edit session with that // ... And I initialize an edit session with that
var efv = new EventFlowValidator<EditInitializeResult>()
.AddStandardErrorValidation()
.Complete();
await eds.HandleInitializeRequest(initParams, efv.Object);
// Then: // Then:
// ... An error event should have been raised // ... An error event should have been sent
efv.Validate(); Assert.That(() => eds.HandleInitializeRequest(initParams, contextMock.Object), Throws.ArgumentException);
// ... There should not be a session // ... There should not be a session
Assert.That(eds.ActiveSessions, Is.Empty); Assert.That(eds.ActiveSessions, Is.Empty);
@@ -324,14 +308,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.EditData
ObjectType = "Table", ObjectType = "Table",
Filters = new EditInitializeFiltering() Filters = new EditInitializeFiltering()
}; };
var efv = new EventFlowValidator<EditInitializeResult>() var contextMock = RequestContextMocks.Create<EditInitializeResult>(null);
.AddStandardErrorValidation()
.Complete();
await eds.HandleInitializeRequest(initParams, efv.Object);
// Then: // Then:
// ... An error event should have been sent // ... An error event should have been sent
efv.Validate(); Assert.That(() => eds.HandleInitializeRequest(initParams, contextMock.Object), Throws.ArgumentNullException);
// ... The original session should still be there // ... The original session should still be there
Assert.AreEqual(1, eds.ActiveSessions.Count); Assert.AreEqual(1, eds.ActiveSessions.Count);

View File

@@ -198,11 +198,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.QueryExecution
// ... And I then ask for a valid execution plan from it // ... And I then ask for a valid execution plan from it
var executionPlanParams = new QueryExecutionPlanParams { OwnerUri = Constants.OwnerUri, ResultSetIndex = 0, BatchIndex = 0 }; var executionPlanParams = new QueryExecutionPlanParams { OwnerUri = Constants.OwnerUri, ResultSetIndex = 0, BatchIndex = 0 };
var executionPlanRequest = new EventFlowValidator<QueryExecutionPlanResult>() var contextMock = RequestContextMocks.Create<QueryExecutionPlanResult>(null);
.AddStandardErrorValidation() Assert.That(() => queryService.HandleExecutionPlanRequest(executionPlanParams, contextMock.Object), Throws.InvalidOperationException);
.Complete();
await queryService.HandleExecutionPlanRequest(executionPlanParams, executionPlanRequest.Object);
executionPlanRequest.Validate();
} }
[Test] [Test]
@@ -229,11 +226,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.QueryExecution
// ... And I then ask for an execution plan from a result set // ... And I then ask for an execution plan from a result set
var executionPlanParams = new QueryExecutionPlanParams { OwnerUri = Constants.OwnerUri, ResultSetIndex = 0, BatchIndex = 0 }; var executionPlanParams = new QueryExecutionPlanParams { OwnerUri = Constants.OwnerUri, ResultSetIndex = 0, BatchIndex = 0 };
var executionPlanRequest = new EventFlowValidator<QueryExecutionPlanResult>() var contextMock = RequestContextMocks.Create<QueryExecutionPlanResult>(null);
.AddStandardErrorValidation() Assert.ThrowsAsync<ArgumentOutOfRangeException>(() => queryService.HandleExecutionPlanRequest(executionPlanParams, contextMock.Object));
.Complete();
await queryService.HandleExecutionPlanRequest(executionPlanParams, executionPlanRequest.Object);
executionPlanRequest.Validate();
} }
#endregion #endregion

View File

@@ -163,11 +163,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.QueryExecution
var workspaceService = Common.GetPrimedWorkspaceService(Constants.StandardQuery); var workspaceService = Common.GetPrimedWorkspaceService(Constants.StandardQuery);
var queryService = Common.GetPrimedExecutionService(null, true, false, false, workspaceService); var queryService = Common.GetPrimedExecutionService(null, true, false, false, workspaceService);
var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 }; var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 };
var subsetRequest = new EventFlowValidator<SubsetResult>() var contextMock = RequestContextMocks.Create<SubsetResult>(null);
.AddStandardErrorValidation() Assert.ThrowsAsync<ArgumentOutOfRangeException>(() => queryService.HandleResultSubsetRequest(subsetParams, contextMock.Object));
.Complete();
await queryService.HandleResultSubsetRequest(subsetParams, subsetRequest.Object);
subsetRequest.Validate();
} }
[Test] [Test]
@@ -186,11 +183,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.QueryExecution
// ... And I then ask for a valid set of results from it // ... And I then ask for a valid set of results from it
var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 }; var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 };
var subsetRequest = new EventFlowValidator<SubsetResult>() var contextMock = RequestContextMocks.Create<SubsetResult>(null);
.AddStandardErrorValidation() Assert.That(() => queryService.HandleResultSubsetRequest(subsetParams, contextMock.Object), Throws.InvalidOperationException);
.Complete();
await queryService.HandleResultSubsetRequest(subsetParams, subsetRequest.Object);
subsetRequest.Validate();
} }
[Test] [Test]
@@ -208,11 +202,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.QueryExecution
// ... And I then ask for a set of results from it // ... And I then ask for a set of results from it
var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 }; var subsetParams = new SubsetParams { OwnerUri = Constants.OwnerUri, RowsCount = 1, ResultSetIndex = 0, RowsStartIndex = 0 };
var subsetRequest = new EventFlowValidator<SubsetResult>() var contextMock = RequestContextMocks.Create<SubsetResult>(null);
.AddStandardErrorValidation() Assert.ThrowsAsync<ArgumentOutOfRangeException>(() => queryService.HandleResultSubsetRequest(subsetParams, contextMock.Object));
.Complete();
await queryService.HandleResultSubsetRequest(subsetParams, subsetRequest.Object);
subsetRequest.Validate();
} }
#endregion #endregion