// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using Microsoft.SqlTools.Hosting.Protocol; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.Hosting; using Microsoft.SqlTools.ServiceLayer.ModelManagement.Contracts; using Microsoft.SqlTools.Utility; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Threading.Tasks; namespace Microsoft.SqlTools.ServiceLayer.ModelManagement { public class ModelManagementService { private ModelOperations serviceOperations = new ModelOperations(); private ConnectionService connectionService = null; private static readonly Lazy instance = new Lazy(() => new ModelManagementService()); /// /// Gets the singleton instance object /// public static ModelManagementService Instance { get { return instance.Value; } } /// /// Internal for testing purposes only /// internal ConnectionService ConnectionServiceInstance { get { if (connectionService == null) { connectionService = ConnectionService.Instance; } return connectionService; } set { connectionService = value; } } public ModelOperations ModelOperations { get { return serviceOperations; } set { serviceOperations = value; } } public void InitializeService(ServiceHost serviceHost) { serviceHost.SetRequestHandler(ImportModelRequest.Type, this.HandleModelImportRequest); serviceHost.SetRequestHandler(ConfigureModelTableRequest.Type, this.HandleConfigureModelTableRequest); serviceHost.SetRequestHandler(DeleteModelRequest.Type, this.HandleDeleteModelRequest); serviceHost.SetRequestHandler(DownloadModelRequest.Type, this.HandleDownloadModelRequest); serviceHost.SetRequestHandler(GetModelsRequest.Type, this.HandleGetModelsRequest); serviceHost.SetRequestHandler(UpdateModelRequest.Type, this.HandleUpdateModelRequest); serviceHost.SetRequestHandler(VerifyModelTableRequest.Type, this.HandleVerifyModelTableRequest); } /// /// Handles import model request /// /// Request parameters /// Request Context public async Task HandleModelImportRequest(ImportModelRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleModelImportRequest"); ImportModelResponseParams response = new ImportModelResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { ModelOperations.ImportModel(dbConnection, parameters); return response; }); } /// /// Handles get models request /// /// Request parameters /// Request Context public async Task HandleGetModelsRequest(GetModelsRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleGetModelsRequest"); GetModelsResponseParams response = new GetModelsResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { List models = ModelOperations.GetModels(dbConnection, parameters); response.Models = models; return response; }); } /// /// Handles update model request /// /// Request parameters /// Request Context public async Task HandleUpdateModelRequest(UpdateModelRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleUpdateModelRequest"); UpdateModelResponseParams response = new UpdateModelResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { ModelOperations.UpdateModel(dbConnection, parameters); return response; }); } /// /// Handles delete model request /// /// Request parameters /// Request Context public async Task HandleDeleteModelRequest(DeleteModelRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleDeleteModelRequest"); DeleteModelResponseParams response = new DeleteModelResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { ModelOperations.DeleteModel(dbConnection, parameters); return response; }); } /// /// Handles download model request /// /// Request parameters /// Request Context public async Task HandleDownloadModelRequest(DownloadModelRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleDownloadModelRequest"); DownloadModelResponseParams response = new DownloadModelResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { response.FilePath = ModelOperations.DownloadModel(dbConnection, parameters); return response; }); } /// /// Handles verify model table request /// /// Request parameters /// Request Context public async Task HandleVerifyModelTableRequest(VerifyModelTableRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleVerifyModelTableRequest"); VerifyModelTableResponseParams response = new VerifyModelTableResponseParams { }; await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { response.Verified = ModelOperations.VerifyImportTable(dbConnection, parameters); return response; }); } /// /// Handles configure model table request /// /// Request parameters /// Request Context public async Task HandleConfigureModelTableRequest(ConfigureModelTableRequestParams parameters, RequestContext requestContext) { Logger.Write(TraceEventType.Verbose, "HandleConfigureModelTableRequest"); ConfigureModelTableResponseParams response = new ConfigureModelTableResponseParams(); await HandleRequest(parameters, response, requestContext, (dbConnection, parameters, response) => { ModelOperations.ConfigureImportTable(dbConnection, parameters); return response; }); } private async Task HandleRequest( T parameters, TResponse response, RequestContext requestContext, Func operation) where T : ModelRequestBase where TResponse : ModelResponseBase { try { ConnectionInfo connInfo; ConnectionServiceInstance.TryFindConnection( parameters.OwnerUri, out connInfo); if (connInfo == null) { await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri))); } else { using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo)) { response = operation(dbConnection, parameters, response); } await requestContext.SendResult(response); } } catch (Exception e) { // Exception related to run task will be captured here await requestContext.SendError(e); } } } }