From 0b247e507e4b837bf78b948fdd06cb7dc803e6ec Mon Sep 17 00:00:00 2001 From: Lewis Sanchez <87730006+lewis-sanchez@users.noreply.github.com> Date: Fri, 2 Jun 2023 12:29:52 -0700 Subject: [PATCH] Stops OE from breaking when paused DBs are expanded (#2083) * Send session failed notification for paused DBs * Creates error node when connections fail * Revert "Send session failed notification for paused DBs" This reverts commit 1f09d8adf9aadb61a7644f84f40558710b0ba5f2. * Adjusts error node label * Code clean up * Update src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs Co-authored-by: Charles Gagnon * Cleans up error node info creation * Rename create error node method --------- Co-authored-by: Charles Gagnon --- .../ObjectExplorer/Contracts/NodeInfo.cs | 25 +++++++++++++++++++ .../ObjectExplorer/ObjectExplorerService.cs | 15 +++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs index 1fe09604..014a4d52 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/Contracts/NodeInfo.cs @@ -78,6 +78,31 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Contracts public NodeFilterProperty[] FilterableProperties { get; set; } } + /// + /// Creates a NodeInfo and configures it for error situations + /// + public static class ErrorNodeInfo + { + /// + /// Helper function to create an error node. + /// + /// The parent node the error node will appear under + /// The error message to display in the error node + /// NodeInfo instance with the specified parent path and error message + public static NodeInfo Create(string parentNodePath, string errorMessage) + { + return new NodeInfo() + { + ParentNodePath = parentNodePath, + ErrorMessage = errorMessage, + Label = errorMessage, + ObjectType = "error", + NodeType = "error", + IsLeaf = true + }; + } + } + /// /// The filterable properties that a node supports /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs index af77b8b1..a4cc1513 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs @@ -1,4 +1,4 @@ -// +// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // @@ -453,7 +453,18 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer else { Logger.Verbose($"Expanding {nodePath}"); - nodes = node.Expand(cancelToken, securityToken?.Token, filters).Select(x => x.ToNodeInfo()).ToArray(); + try + { + nodes = node.Expand(cancelToken, securityToken?.Token, filters).Select(x => x.ToNodeInfo()).ToArray(); + } + catch (ConnectionFailureException ex) + { + var errorMessage = ex.InnerException?.Message ?? ex.Message; + + Logger.Error($"Failed to expand node: {errorMessage}"); + var errorNode = ErrorNodeInfo.Create(parentNodePath: nodePath, errorMessage: errorMessage); + nodes = new NodeInfo[] { errorNode }; + } } response.Nodes = nodes; response.ErrorMessage = node.ErrorMessage;