mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-26 09:35:38 -05:00
fixed the bug with not closing data reader for oe (#352)
* fixed the bug with not closing data reader for oe * fixed the bug with triggers not sending back status
This commit is contained in:
@@ -23,18 +23,23 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||
|
||||
public override IEnumerable<TreeNode> Expand(TreeNode parent, bool refresh)
|
||||
{
|
||||
List<TreeNode> allChildren = new List<TreeNode>();
|
||||
|
||||
try
|
||||
{
|
||||
List<TreeNode> allChildren = new List<TreeNode>();
|
||||
OnExpandPopulateFolders(allChildren, parent);
|
||||
RemoveFoldersFromInvalidSqlServerVersions(allChildren, parent);
|
||||
OnExpandPopulateNonFolders(allChildren, parent, refresh);
|
||||
OnBeginAsyncOperations(parent);
|
||||
return allChildren;
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
Logger.Write(LogLevel.Error, $"Failed expanding oe children. error:{ex.Message} {ex.StackTrace}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
}
|
||||
return allChildren;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -22,6 +22,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||
public abstract class SmoQuerier : IComposableService
|
||||
{
|
||||
public abstract Type[] SupportedObjectTypes { get; }
|
||||
private static object lockObject = new object();
|
||||
|
||||
/// <summary>
|
||||
/// Queries SMO for a collection of objects using the <see cref="SmoQueryContext"/>
|
||||
@@ -78,21 +79,26 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||
/// </summary>
|
||||
protected HashSet<string> GetUrns(EnumResult enumResult)
|
||||
{
|
||||
HashSet<string> urns = null;
|
||||
if (enumResult != null && enumResult.Data != null)
|
||||
lock (lockObject)
|
||||
{
|
||||
urns = new HashSet<string>();
|
||||
IDataReader reader = GetDataReader(enumResult.Data);
|
||||
if (reader != null)
|
||||
HashSet<string> urns = null;
|
||||
if (enumResult != null && enumResult.Data != null)
|
||||
{
|
||||
while (reader.Read())
|
||||
urns = new HashSet<string>();
|
||||
using (IDataReader reader = GetDataReader(enumResult.Data))
|
||||
{
|
||||
urns.Add(reader.GetString(0));
|
||||
if (reader != null)
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
urns.Add(reader.GetString(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return urns;
|
||||
return urns;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,14 +10,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||
/// <summary>
|
||||
/// Status for triggers
|
||||
/// </summary>
|
||||
public class SmoTriggerCustomNode
|
||||
internal partial class TriggersChildFactory : SmoChildFactoryBase
|
||||
{
|
||||
internal partial class TriggersChildFactory : SmoChildFactoryBase
|
||||
public override string GetNodeStatus(object context)
|
||||
{
|
||||
public override string GetNodeStatus(object context)
|
||||
{
|
||||
return TriggersCustomeNodeHelper.GetStatus(context);
|
||||
}
|
||||
return TriggersCustomeNodeHelper.GetStatus(context);
|
||||
}
|
||||
}
|
||||
|
||||
internal partial class ServerLevelServerTriggersChildFactory : SmoChildFactoryBase
|
||||
{
|
||||
public override string GetNodeStatus(object context)
|
||||
{
|
||||
return TriggersCustomeNodeHelper.GetStatus(context);
|
||||
}
|
||||
}
|
||||
|
||||
internal partial class DatabaseTriggersChildFactory : SmoChildFactoryBase
|
||||
{
|
||||
public override string GetNodeStatus(object context)
|
||||
{
|
||||
return TriggersCustomeNodeHelper.GetStatus(context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +47,24 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||
}
|
||||
}
|
||||
|
||||
ServerDdlTrigger serverDdlTrigger = context as ServerDdlTrigger;
|
||||
if (serverDdlTrigger != null)
|
||||
{
|
||||
if (!serverDdlTrigger.IsEnabled)
|
||||
{
|
||||
return "Disabled";
|
||||
}
|
||||
}
|
||||
|
||||
DatabaseDdlTrigger databaseDdlTrigger = context as DatabaseDdlTrigger;
|
||||
if (databaseDdlTrigger != null)
|
||||
{
|
||||
if (!databaseDdlTrigger.IsEnabled)
|
||||
{
|
||||
return "Disabled";
|
||||
}
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,42 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyServerTriggers()
|
||||
{
|
||||
var query = @"IF EXISTS (SELECT * FROM sys.server_triggers WHERE name = 'OE_ddl_trig_database')
|
||||
|
||||
Begin
|
||||
DROP TRIGGER OE_ddl_trig_database ON ALL SERVER
|
||||
|
||||
ENd
|
||||
GO
|
||||
|
||||
CREATE TRIGGER OE_ddl_trig_database
|
||||
ON ALL SERVER
|
||||
FOR CREATE_DATABASE
|
||||
AS
|
||||
PRINT 'Database Created.'
|
||||
GO
|
||||
GO
|
||||
Disable TRIGGER OE_ddl_trig_database ON ALL SERVER ;";
|
||||
string databaseName = "tempdb";
|
||||
await RunTest(databaseName, query, "TepmDb", async (testDbName, session) =>
|
||||
{
|
||||
var serverChildren = await _service.ExpandNode(session, session.Root.GetNodePath());
|
||||
var serverObjectsNode = serverChildren.FirstOrDefault(x => x.Label == SR.SchemaHierarchy_ServerObjects);
|
||||
var serverObjectsChildren = await _service.ExpandNode(session, serverObjectsNode.NodePath);
|
||||
var triggersNode = serverObjectsChildren.FirstOrDefault(x => x.Label == SR.SchemaHierarchy_Triggers);
|
||||
var triggersChildren = await _service.ExpandNode(session, triggersNode.NodePath);
|
||||
var trigger = triggersChildren.FirstOrDefault(x => x.Label == "OE_ddl_trig_database");
|
||||
Assert.NotNull(trigger);
|
||||
|
||||
Assert.True(trigger.NodeStatus == "Disabled");
|
||||
await TestServiceProvider.Instance.RunQueryAsync(TestServerType.OnPrem, testDbName, "DROP TRIGGER OE_ddl_trig_database");
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void CreateSessionAndExpandOnTheDatabaseShouldReturnDatabaseAsTheRoot()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user