//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
using System;
using System.Composition;
using System.Threading.Tasks;
using Microsoft.SqlTools.Extensibility;
using Microsoft.SqlTools.Hosting;
using Microsoft.SqlTools.Hosting.Protocol;
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
using Microsoft.SqlTools.Utility;
namespace Microsoft.SqlTools.Serialization
{
///
/// Service responsible for securing credentials in a platform-neutral manner. This provides
/// a generic API for read, save and delete credentials
///
[Export(typeof(IHostedService))]
public class SerializationService : HostedService, IComposableService
{
public override void InitializeService(IProtocolEndpoint serviceHost)
{
Logger.Write(LogLevel.Verbose, "Serialization initialized");
// Register request and event handlers with the Service Host
serviceHost.SetRequestHandler(SaveAsRequest.Type, HandleSaveAsRequest);
}
public async Task HandleSaveAsRequest(SaveResultsInfo resultsInfo, RequestContext requestContext)
{
Func> doSave = () =>
{
return SaveAsAsync(resultsInfo, requestContext);
};
await HandleRequest(doSave, requestContext, "HandleSaveAsRequest");
}
public async Task SaveAsAsync(SaveResultsInfo resultsInfo, RequestContext requestContext)
{
// TODO: Refactor currently available serialization code in sqltools to be utilized here
// Issue here: https://github.com/Microsoft/carbon/issues/1789
switch (resultsInfo.SaveFormat) {
case "json":
throw new NotImplementedException("Converting to " + resultsInfo.SaveFormat + " is not implemented.");
break;
case "csv":
throw new NotImplementedException("Converting to " + resultsInfo.SaveFormat + " is not implemented.");
break;
case "excel":
throw new NotImplementedException("Converting to " + resultsInfo.SaveFormat + " is not implemented.");
break;
default:
throw new NotImplementedException("Converting to " + resultsInfo.SaveFormat + " is not implemented.");
}
}
private async Task HandleRequest(Func> handler, RequestContext requestContext, string requestType)
{
Logger.Write(LogLevel.Verbose, requestType);
try
{
T result = await handler();
await requestContext.SendResult(result);
}
catch (Exception ex)
{
await requestContext.SendError(ex.ToString());
}
}
}
}