diff --git a/.gitignore b/.gitignore
index c7a5b1b7..0c4dc1bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ project.lock.json
*.sln.docstates
*.exe
scratch.txt
+launchSettings.json
# mergetool conflict files
*.orig
diff --git a/src/Microsoft.SqlTools.Credentials/Program.cs b/src/Microsoft.SqlTools.Credentials/Program.cs
index 2a72f3bf..359f09f0 100644
--- a/src/Microsoft.SqlTools.Credentials/Program.cs
+++ b/src/Microsoft.SqlTools.Credentials/Program.cs
@@ -36,15 +36,12 @@ namespace Microsoft.SqlTools.Credentials
string logFilePath = commandOptions.LogFilePath;
if (string.IsNullOrWhiteSpace(logFilePath))
{
- logFilePath = "credentials";
- }
- if (!string.IsNullOrWhiteSpace(commandOptions.LoggingDirectory))
- {
- logFilePath = Logger.GenerateLogFilePath(Path.Combine(commandOptions.LoggingDirectory, logFilePath));
+ logFilePath = Logger.GenerateLogFilePath("credentials");
}
+ Logger.AutoFlush = commandOptions.AutoFlushLog;
+
Logger.Initialize(tracingLevel: commandOptions.TracingLevel, logFilePath: logFilePath, traceSource: "credentials");
- Logger.Write(TraceEventType.Information, "Starting SqlTools Credentials Provider");
// set up the host details and profile paths
var hostDetails = new HostDetails(
diff --git a/src/Microsoft.SqlTools.Hosting.v2/Utility/CommandOptions.cs b/src/Microsoft.SqlTools.Hosting.v2/Utility/CommandOptions.cs
index 364f0c6a..cdfdb568 100644
--- a/src/Microsoft.SqlTools.Hosting.v2/Utility/CommandOptions.cs
+++ b/src/Microsoft.SqlTools.Hosting.v2/Utility/CommandOptions.cs
@@ -28,19 +28,12 @@ namespace Microsoft.SqlTools.Hosting.Utility
ErrorMessage = string.Empty;
Locale = string.Empty;
- //set default log directory
- LoggingDirectory = DefaultLogRoot;
- if (!string.IsNullOrWhiteSpace(ServiceName))
- {
- LoggingDirectory = Path.Combine(LoggingDirectory, ServiceName);
- }
-
try
{
for (int i = 0; i < args.Length; ++i)
{
string arg = args[i];
- if (arg.StartsWith("--") || arg.StartsWith("-"))
+ if (arg != null && (arg.StartsWith("--") || arg.StartsWith("-")))
{
// Extracting arguments and properties
arg = arg.Substring(1).ToLowerInvariant();
@@ -48,17 +41,15 @@ namespace Microsoft.SqlTools.Hosting.Utility
switch (argName)
{
- case "-enable-logging":
- break; //ignore this old option for now for backward compat with older opsstudio code - to be removed in a future checkin
+ case "-autoflush-log":
+ AutoFlushLog = true;
+ break;
case "-tracing-level":
TracingLevel = args[++i];
break;
case "-log-file":
LogFilePath = args[++i];
break;
- case "-log-dir":
- SetLoggingDirectory(args[++i]);
- break;
case "-locale":
SetLocale(args[++i]);
break;
@@ -93,11 +84,6 @@ namespace Microsoft.SqlTools.Hosting.Utility
///
public string ErrorMessage { get; private set; }
- ///
- /// Gets the directory where log files are output.
- ///
- public string LoggingDirectory { get; private set; }
-
///
/// Whether the program should exit immediately. Set to true when the usage is printed.
///
@@ -123,11 +109,10 @@ namespace Microsoft.SqlTools.Hosting.Utility
var str = string.Format("{0}" + Environment.NewLine +
ServiceName + " " + Environment.NewLine +
" Options:" + Environment.NewLine +
- " [--enable-logging ] (obsolete - present for backward compat. Logging is always on, except -tracing-level Off has the effect of disabling logging)" + Environment.NewLine +
- " [--tracing-level **] (** can be any of: All, Off, Critical, Error, Warning, Information, Verbose. Default is Critical)" + Environment.NewLine +
- " [--log-file **]" + Environment.NewLine +
- " [--log-dir **] (default: %APPDATA%\\)" + Environment.NewLine +
+ " [--autoflush-log] (If passed in auto flushing of log files is enabled., Verbose. Default is to not auto-flush log files)" + Environment.NewLine +
" [--locale **] (default: 'en')" + Environment.NewLine,
+ " [--log-file **]" + Environment.NewLine +
+ " [--tracing-level **] (** can be any of: All, Off, Critical, Error, Warning, Information, Verbose. Default is Critical)" + Environment.NewLine +
" [--help]" + Environment.NewLine +
ErrorMessage);
return str;
@@ -138,15 +123,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
public string LogFilePath { get; private set; }
- private void SetLoggingDirectory(string loggingDirectory)
- {
- if (string.IsNullOrWhiteSpace(loggingDirectory))
- {
- return;
- }
-
- this.LoggingDirectory = Path.GetFullPath(loggingDirectory);
- }
+ public bool AutoFlushLog { get; private set; } = false;
public virtual void SetLocale(string locale)
{
diff --git a/src/Microsoft.SqlTools.Hosting.v2/Utility/Logger.cs b/src/Microsoft.SqlTools.Hosting.v2/Utility/Logger.cs
index 47ba6877..8480f283 100644
--- a/src/Microsoft.SqlTools.Hosting.v2/Utility/Logger.cs
+++ b/src/Microsoft.SqlTools.Hosting.v2/Utility/Logger.cs
@@ -86,7 +86,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
get => tracingLevel;
set
{
- // configures the source level filter. This alone is not enough for tracing that is done via "Trace" object instead of "TraceSource" object
+ // configures the source level filter. This alone is not enough for tracing that is done via "Trace" class instead of "TraceSource" object
TraceSource.Switch = new SourceSwitch(TraceSource.Name, value.ToString());
// configure the listener level filter
tracingLevel = value;
@@ -94,6 +94,8 @@ namespace Microsoft.SqlTools.Hosting.Utility
}
}
+ public static bool AutoFlush { get; set; } = false;
+
///
/// Initializes the Logger for the current process.
///
@@ -108,9 +110,11 @@ namespace Microsoft.SqlTools.Hosting.Utility
public static void Initialize(
SourceLevels tracingLevel = defaultTracingLevel,
string logFilePath = null,
- string traceSource = defaultTraceSource)
+ string traceSource = defaultTraceSource,
+ bool autoFlush = false)
{
Logger.tracingLevel = tracingLevel;
+ Logger.AutoFlush = autoFlush;
TraceSource = new TraceSource(traceSource, Logger.tracingLevel);
if (string.IsNullOrWhiteSpace(logFilePath))
{
@@ -118,7 +122,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
}
LogFileFullPath = logFilePath;
- Write(TraceEventType.Information, $"Initialized the {traceSource} logger");
+ Write(TraceEventType.Information, $"Initialized the {traceSource} logger. Log file is: {LogFileFullPath}");
}
///
@@ -185,7 +189,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
}
// make the log path unique
- return $"{logFilePrefix}_{DateTime.Now.Year,4:D4}{DateTime.Now.Month,2:D2}{DateTime.Now.Day,2:D2}{DateTime.Now.Hour,2:D2}{DateTime.Now.Minute,2:D2}{DateTime.Now.Second,2:D2}{uniqueId}.log";
+ return $"{logFilePrefix}_{DateTime.Now.Year,4:D4}{DateTime.Now.Month,2:D2}{DateTime.Now.Day,2:D2}{DateTime.Now.Hour,2:D2}{DateTime.Now.Minute,2:D2}{DateTime.Now.Second,2:D2}_{uniqueId}.log";
}
private static void ConfigureListener()
@@ -290,6 +294,10 @@ namespace Microsoft.SqlTools.Hosting.Utility
break;
}
}
+ if (AutoFlush)
+ {
+ Flush();
+ }
}
}
@@ -431,7 +439,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
return message;
}
- return $"{(IsEnabled(TraceOptions.DateTime) ? string.Format(CultureInfo.InvariantCulture, "{0} ", eventCache.DateTime.ToLocalTime().ToString("u", CultureInfo.InvariantCulture)) : string.Empty)}"
+ return $"{(IsEnabled(TraceOptions.DateTime) ? string.Format(CultureInfo.InvariantCulture, "{0} ", eventCache.DateTime.ToLocalTime().ToString("yy-MM-dd H:mm:ss.fffffff", CultureInfo.InvariantCulture)) : string.Empty)}"
+ $"{(IsEnabled(TraceOptions.ProcessId) ? string.Format(CultureInfo.InvariantCulture, "pid:{0} ", eventCache.ProcessId.ToString(CultureInfo.InvariantCulture)) : string.Empty)}"
+ $"{(IsEnabled(TraceOptions.ThreadId) ? string.Format(CultureInfo.InvariantCulture, "tid:{0} ", eventCache.ThreadId.ToString(CultureInfo.InvariantCulture)) : string.Empty)}"
+ message;
diff --git a/src/Microsoft.SqlTools.Hosting/Utility/CommandOptions.cs b/src/Microsoft.SqlTools.Hosting/Utility/CommandOptions.cs
index 364f0c6a..cdfdb568 100644
--- a/src/Microsoft.SqlTools.Hosting/Utility/CommandOptions.cs
+++ b/src/Microsoft.SqlTools.Hosting/Utility/CommandOptions.cs
@@ -28,19 +28,12 @@ namespace Microsoft.SqlTools.Hosting.Utility
ErrorMessage = string.Empty;
Locale = string.Empty;
- //set default log directory
- LoggingDirectory = DefaultLogRoot;
- if (!string.IsNullOrWhiteSpace(ServiceName))
- {
- LoggingDirectory = Path.Combine(LoggingDirectory, ServiceName);
- }
-
try
{
for (int i = 0; i < args.Length; ++i)
{
string arg = args[i];
- if (arg.StartsWith("--") || arg.StartsWith("-"))
+ if (arg != null && (arg.StartsWith("--") || arg.StartsWith("-")))
{
// Extracting arguments and properties
arg = arg.Substring(1).ToLowerInvariant();
@@ -48,17 +41,15 @@ namespace Microsoft.SqlTools.Hosting.Utility
switch (argName)
{
- case "-enable-logging":
- break; //ignore this old option for now for backward compat with older opsstudio code - to be removed in a future checkin
+ case "-autoflush-log":
+ AutoFlushLog = true;
+ break;
case "-tracing-level":
TracingLevel = args[++i];
break;
case "-log-file":
LogFilePath = args[++i];
break;
- case "-log-dir":
- SetLoggingDirectory(args[++i]);
- break;
case "-locale":
SetLocale(args[++i]);
break;
@@ -93,11 +84,6 @@ namespace Microsoft.SqlTools.Hosting.Utility
///
public string ErrorMessage { get; private set; }
- ///
- /// Gets the directory where log files are output.
- ///
- public string LoggingDirectory { get; private set; }
-
///
/// Whether the program should exit immediately. Set to true when the usage is printed.
///
@@ -123,11 +109,10 @@ namespace Microsoft.SqlTools.Hosting.Utility
var str = string.Format("{0}" + Environment.NewLine +
ServiceName + " " + Environment.NewLine +
" Options:" + Environment.NewLine +
- " [--enable-logging ] (obsolete - present for backward compat. Logging is always on, except -tracing-level Off has the effect of disabling logging)" + Environment.NewLine +
- " [--tracing-level **] (** can be any of: All, Off, Critical, Error, Warning, Information, Verbose. Default is Critical)" + Environment.NewLine +
- " [--log-file **]" + Environment.NewLine +
- " [--log-dir **] (default: %APPDATA%\\)" + Environment.NewLine +
+ " [--autoflush-log] (If passed in auto flushing of log files is enabled., Verbose. Default is to not auto-flush log files)" + Environment.NewLine +
" [--locale **] (default: 'en')" + Environment.NewLine,
+ " [--log-file **]" + Environment.NewLine +
+ " [--tracing-level **] (** can be any of: All, Off, Critical, Error, Warning, Information, Verbose. Default is Critical)" + Environment.NewLine +
" [--help]" + Environment.NewLine +
ErrorMessage);
return str;
@@ -138,15 +123,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
public string LogFilePath { get; private set; }
- private void SetLoggingDirectory(string loggingDirectory)
- {
- if (string.IsNullOrWhiteSpace(loggingDirectory))
- {
- return;
- }
-
- this.LoggingDirectory = Path.GetFullPath(loggingDirectory);
- }
+ public bool AutoFlushLog { get; private set; } = false;
public virtual void SetLocale(string locale)
{
diff --git a/src/Microsoft.SqlTools.Hosting/Utility/Logger.cs b/src/Microsoft.SqlTools.Hosting/Utility/Logger.cs
index 843e8436..69d7e34e 100644
--- a/src/Microsoft.SqlTools.Hosting/Utility/Logger.cs
+++ b/src/Microsoft.SqlTools.Hosting/Utility/Logger.cs
@@ -86,7 +86,7 @@ namespace Microsoft.SqlTools.Utility
get => tracingLevel;
set
{
- // configures the source level filter. This alone is not enough for tracing that is done via "Trace" object instead of "TraceSource" object
+ // configures the source level filter. This alone is not enough for tracing that is done via "Trace" class instead of "TraceSource" object
TraceSource.Switch = new SourceSwitch(TraceSource.Name, value.ToString());
// configure the listener level filter
tracingLevel = value;
@@ -94,6 +94,8 @@ namespace Microsoft.SqlTools.Utility
}
}
+ public static bool AutoFlush { get; set; } = false;
+
///
/// Initializes the Logger for the current process.
///
@@ -108,9 +110,11 @@ namespace Microsoft.SqlTools.Utility
public static void Initialize(
SourceLevels tracingLevel = defaultTracingLevel,
string logFilePath = null,
- string traceSource = defaultTraceSource)
+ string traceSource = defaultTraceSource,
+ bool autoFlush = false)
{
Logger.tracingLevel = tracingLevel;
+ Logger.AutoFlush = autoFlush;
TraceSource = new TraceSource(traceSource, Logger.tracingLevel);
if (string.IsNullOrWhiteSpace(logFilePath))
{
@@ -118,7 +122,7 @@ namespace Microsoft.SqlTools.Utility
}
LogFileFullPath = logFilePath;
- Write(TraceEventType.Information, $"Initialized the {traceSource} logger");
+ Write(TraceEventType.Information, $"Initialized the {traceSource} logger. Log file is: {LogFileFullPath}");
}
///
@@ -185,7 +189,7 @@ namespace Microsoft.SqlTools.Utility
}
// make the log path unique
- return $"{logFilePrefix}_{DateTime.Now.Year,4:D4}{DateTime.Now.Month,2:D2}{DateTime.Now.Day,2:D2}{DateTime.Now.Hour,2:D2}{DateTime.Now.Minute,2:D2}{DateTime.Now.Second,2:D2}{uniqueId}.log";
+ return $"{logFilePrefix}_{DateTime.Now.Year,4:D4}{DateTime.Now.Month,2:D2}{DateTime.Now.Day,2:D2}{DateTime.Now.Hour,2:D2}{DateTime.Now.Minute,2:D2}{DateTime.Now.Second,2:D2}_{uniqueId}.log";
}
private static void ConfigureListener()
@@ -290,6 +294,10 @@ namespace Microsoft.SqlTools.Utility
break;
}
}
+ if (AutoFlush)
+ {
+ Flush();
+ }
}
}
@@ -431,7 +439,7 @@ namespace Microsoft.SqlTools.Utility
return message;
}
- return $"{(IsEnabled(TraceOptions.DateTime) ? string.Format(CultureInfo.InvariantCulture, "{0} ", eventCache.DateTime.ToLocalTime().ToString("u", CultureInfo.InvariantCulture)) : string.Empty)}"
+ return $"{(IsEnabled(TraceOptions.DateTime) ? string.Format(CultureInfo.InvariantCulture, "{0} ", eventCache.DateTime.ToLocalTime().ToString("yy-MM-dd H:mm:ss.fffffff", CultureInfo.InvariantCulture)) : string.Empty)}"
+ $"{(IsEnabled(TraceOptions.ProcessId) ? string.Format(CultureInfo.InvariantCulture, "pid:{0} ", eventCache.ProcessId.ToString(CultureInfo.InvariantCulture)) : string.Empty)}"
+ $"{(IsEnabled(TraceOptions.ThreadId) ? string.Format(CultureInfo.InvariantCulture, "tid:{0} ", eventCache.ThreadId.ToString(CultureInfo.InvariantCulture)) : string.Empty)}"
+ message;
diff --git a/src/Microsoft.SqlTools.ResourceProvider/Program.cs b/src/Microsoft.SqlTools.ResourceProvider/Program.cs
index d0ab5f05..7d71f6aa 100644
--- a/src/Microsoft.SqlTools.ResourceProvider/Program.cs
+++ b/src/Microsoft.SqlTools.ResourceProvider/Program.cs
@@ -35,11 +35,7 @@ namespace Microsoft.SqlTools.ResourceProvider
string logFilePath = commandOptions.LogFilePath;
if (string.IsNullOrWhiteSpace(logFilePath))
{
- logFilePath = "SqlToolsResourceProviderService";
- }
- if (!string.IsNullOrWhiteSpace(commandOptions.LoggingDirectory))
- {
- logFilePath = Path.Combine(commandOptions.LoggingDirectory, logFilePath);
+ logFilePath = Logger.GenerateLogFilePath("SqlToolsResourceProviderService");
}
// turn on Verbose logging during early development
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoColumnCustomNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoColumnCustomNode.cs
index 0daa4ff2..e23f643c 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoColumnCustomNode.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoColumnCustomNode.cs
@@ -23,80 +23,76 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
return SmoColumnCustomNodeHelper.CalculateCustomLabel(smoObject, smoContext);
}
- public override IEnumerable SmoProperties
+ private readonly Lazy> smoPropertiesLazy = new Lazy>(() => new List
{
- get
+ new NodeSmoProperty
{
- return new List
- {
- new NodeSmoProperty
- {
- Name = "Computed",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "IsColumnSet",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "Nullable",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "DataType",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "InPrimaryKey",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "IsForeignKey",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "SystemType",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "Length",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "NumericPrecision",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "NumericScale",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "XmlSchemaNamespaceSchema",
- ValidFor = ValidForFlag.NotSqlDw
- },
- new NodeSmoProperty
- {
- Name = "XmlSchemaNamespace",
- ValidFor = ValidForFlag.NotSqlDw
- },
- new NodeSmoProperty
- {
- Name = "XmlDocumentConstraint",
- ValidFor = ValidForFlag.NotSqlDw
- }
- };
+ Name = "Computed",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "IsColumnSet",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "Nullable",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "DataType",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "InPrimaryKey",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "IsForeignKey",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "SystemType",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "Length",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "NumericPrecision",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "NumericScale",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "XmlSchemaNamespaceSchema",
+ ValidFor = ValidForFlag.NotSqlDw
+ },
+ new NodeSmoProperty
+ {
+ Name = "XmlSchemaNamespace",
+ ValidFor = ValidForFlag.NotSqlDw
+ },
+ new NodeSmoProperty
+ {
+ Name = "XmlDocumentConstraint",
+ ValidFor = ValidForFlag.NotSqlDw
}
- }
+ });
+
+ public override IEnumerable SmoProperties => smoPropertiesLazy.Value;
}
///
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoKeyCustomNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoKeyCustomNode.cs
index 34ad3f02..88806197 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoKeyCustomNode.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoKeyCustomNode.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using System;
using System.Collections.Generic;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
@@ -25,30 +26,26 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
///
internal partial class IndexesChildFactory : SmoChildFactoryBase
{
- public override IEnumerable SmoProperties
+ private readonly Lazy> smoPropertiesLazy = new Lazy>(() => new List
{
- get
+ new NodeSmoProperty
{
- return new List
- {
- new NodeSmoProperty
- {
- Name = "IsUnique",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "IsClustered",
- ValidFor = ValidForFlag.All
- },
- new NodeSmoProperty
- {
- Name = "IndexKeyType",
- ValidFor = ValidForFlag.All
- }
- };
+ Name = "IsUnique",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "IsClustered",
+ ValidFor = ValidForFlag.All
+ },
+ new NodeSmoProperty
+ {
+ Name = "IndexKeyType",
+ ValidFor = ValidForFlag.All
}
- }
+ });
+
+ public override IEnumerable SmoProperties => smoPropertiesLazy.Value;
public override string GetNodeSubType(object smoObject, SmoQueryContext smoContext)
{
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoLoginCustomNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoLoginCustomNode.cs
index a11a9519..cffb14f6 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoLoginCustomNode.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoLoginCustomNode.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using System;
using System.Collections.Generic;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
@@ -18,21 +19,17 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
{
return LoginCustomNodeHelper.GetStatus(smoObject);
}
-
- public override IEnumerable SmoProperties
+
+ private readonly Lazy> smoPropertiesLazy = new Lazy>(() => new List
{
- get
+ new NodeSmoProperty
{
- return new List
- {
- new NodeSmoProperty
- {
- Name = "IsDisabled",
- ValidFor = ValidForFlag.All
- }
- };
+ Name = "IsDisabled",
+ ValidFor = ValidForFlag.All
}
- }
+ });
+
+ public override IEnumerable SmoProperties => smoPropertiesLazy.Value;
}
internal static class LoginCustomNodeHelper
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTriggerCustomNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTriggerCustomNode.cs
index 0e2c382f..ec10615f 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTriggerCustomNode.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoTriggerCustomNode.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using System;
using System.Collections.Generic;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
@@ -14,27 +15,21 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
///
internal partial class TriggersChildFactory : SmoChildFactoryBase
{
- public static readonly List SmoPropertyList = new List
+ public static readonly Lazy> SmoPropertiesLazy = new Lazy>(() => new List
{
new NodeSmoProperty
{
Name = "IsEnabled",
ValidFor = ValidForFlag.All
}
- };
+ });
public override string GetNodeStatus(object smoObject, SmoQueryContext smoContext)
{
return TriggersCustomeNodeHelper.GetStatus(smoObject);
}
- public override IEnumerable SmoProperties
- {
- get
- {
- return TriggersChildFactory.SmoPropertyList;
- }
- }
+ public override IEnumerable SmoProperties => SmoPropertiesLazy.Value;
}
internal partial class ServerLevelServerTriggersChildFactory : SmoChildFactoryBase
@@ -48,7 +43,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
{
get
{
- return TriggersChildFactory.SmoPropertyList;
+ return TriggersChildFactory.SmoPropertiesLazy.Value;
}
}
}
@@ -64,7 +59,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
{
get
{
- return TriggersChildFactory.SmoPropertyList;
+ return TriggersChildFactory.SmoPropertiesLazy.Value;
}
}
}
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoUserCustomNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoUserCustomNode.cs
index 10794e4d..1da7db12 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoUserCustomNode.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/SmoUserCustomNode.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using System;
using System.Collections.Generic;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
@@ -19,20 +20,16 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
return UserCustomeNodeHelper.GetStatus(smoObject);
}
- public override IEnumerable SmoProperties
+ private readonly Lazy> smoPropertiesLazy = new Lazy>(() => new List
{
- get
+ new NodeSmoProperty
{
- return new List
- {
- new NodeSmoProperty
- {
- Name = "HasDBAccess",
- ValidFor = ValidForFlag.All
- }
- };
+ Name = "HasDBAccess",
+ ValidFor = ValidForFlag.All
}
- }
+ });
+
+ public override IEnumerable SmoProperties => smoPropertiesLazy.Value;
}
internal static class UserCustomeNodeHelper
diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/TreeNodeGenerator.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/TreeNodeGenerator.cs
index 039aad41..9d3614a2 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/TreeNodeGenerator.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/TreeNodeGenerator.cs
@@ -180,34 +180,29 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
{
public override IEnumerable ApplicableParents() { return new[] { "Databases" }; }
- public override IEnumerable Filters
- {
- get
- {
- var filters = new List();
- filters.Add(new NodeFilter
- {
- Property = "IsSystemObject",
- Type = typeof(bool),
- Values = new List