From 4866515bde8805b3ab371e2aeae25e0f06890853 Mon Sep 17 00:00:00 2001
From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com>
Date: Mon, 28 Nov 2022 17:35:26 -0800
Subject: [PATCH] Send Error Code with session failed notification (#1773)
---
.../Contracts/CreateSessionRequest.cs | 4 ++++
.../ObjectExplorer/ObjectExplorerService.cs | 23 +++++++++++++++----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/CreateSessionRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/CreateSessionRequest.cs
index 64172ab1..fa559491 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/CreateSessionRequest.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/CreateSessionRequest.cs
@@ -46,6 +46,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Contracts
///
public NodeInfo RootNode { get; set; }
+ ///
+ /// Error number returned from the engine, if any.
+ ///
+ public int? ErrorNumber { get; set; }
///
/// Error message returned from the engine for a object explorer session failure reason, if any.
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs
index 81015fd1..9a95825f 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs
@@ -12,6 +12,7 @@ using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Data.SqlClient;
using Microsoft.Data.Tools.Sql.DesignServices.TableDesigner;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlTools.Extensibility;
@@ -280,7 +281,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
{
var foundNodes = FindNodes(findNodesParams.SessionId, findNodesParams.Type, findNodesParams.Schema, findNodesParams.Name, findNodesParams.Database, findNodesParams.ParentObjectNames);
foundNodes ??= new List();
-
+
await context.SendResult(new FindNodesResponse { Nodes = foundNodes.Select(node => node.ToNodeInfo()).ToList() });
}
@@ -324,6 +325,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
{
Success = false,
SessionId = uri,
+ ErrorNumber = result.Exception != null && result.Exception is SqlException sqlEx ? sqlEx.ErrorCode : null,
ErrorMessage = result.Exception != null ? result.Exception.Message : $"Failed to create session for session id {uri}"
};
@@ -361,6 +363,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
Success = true,
RootNode = session.Root.ToNodeInfo(),
SessionId = uri,
+ ErrorNumber = session.ErrorNumber,
ErrorMessage = session.ErrorMessage
};
await serviceHost.SendEvent(CreateSessionCompleteNotification.Type, response);
@@ -524,7 +527,8 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
}
catch (Exception ex)
{
- await SendSessionFailedNotification(uri, ex.Message);
+ int? errorCode = ex is SqlException sqlEx ? sqlEx.ErrorCode : null;
+ await SendSessionFailedNotification(uri, ex.Message, errorCode);
return null;
}
}
@@ -543,25 +547,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
}
else
{
- await SendSessionFailedNotification(uri, result.ErrorMessage);
+ await SendSessionFailedNotification(uri, result.ErrorMessage, result.ErrorNumber);
return null;
}
}
catch (Exception ex)
{
- await SendSessionFailedNotification(uri, ex.ToString());
+ int? errorNum = ex is SqlException sqlEx ? sqlEx.Number : null;
+ await SendSessionFailedNotification(uri, ex.ToString(), errorNum);
return null;
}
}
- private async Task SendSessionFailedNotification(string uri, string errorMessage)
+ private async Task SendSessionFailedNotification(string uri, string errorMessage, int? errorCode)
{
Logger.Write(TraceEventType.Warning, $"Failed To create OE session: {errorMessage}");
SessionCreatedParameters result = new SessionCreatedParameters()
{
Success = false,
ErrorMessage = errorMessage,
+ ErrorNumber = errorCode,
SessionId = uri
};
await serviceHost.SendEvent(CreateSessionCompleteNotification.Type, result);
@@ -809,6 +815,8 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
public ConnectionInfo ConnectionInfo { get; set; }
+ public int? ErrorNumber { get; set; }
+
public string ErrorMessage { get; set; }
public static ObjectExplorerSession CreateSession(ConnectionCompleteParams response, IMultiServiceProvider serviceProvider, ServerConnection serverConnection, bool isDefaultOrSystemDatabase)
@@ -822,6 +830,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
session.Root = databaseNode;
}
+ if (response?.ErrorMessage != null)
+ {
+ session.ErrorMessage = response.ErrorMessage;
+ session.ErrorNumber = response.ErrorNumber;
+ }
return session;
}