diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionInfo.cs
new file mode 100644
index 00000000..7490b33c
--- /dev/null
+++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionInfo.cs
@@ -0,0 +1,38 @@
+//
+// 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.Data.Common;
+using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
+
+namespace Microsoft.SqlTools.ServiceLayer.Connection
+{
+ ///
+ /// Information pertaining to a unique connection instance.
+ ///
+ public class ConnectionInfo
+ {
+ public ConnectionInfo(ISqlConnectionFactory factory, string ownerUri, ConnectionDetails details)
+ {
+ Factory = factory;
+ OwnerUri = ownerUri;
+ ConnectionDetails = details;
+ ConnectionId = Guid.NewGuid();
+ }
+
+ ///
+ /// Unique Id, helpful to identify a connection info object
+ ///
+ public Guid ConnectionId { get; private set; }
+
+ public string OwnerUri { get; private set; }
+
+ public ISqlConnectionFactory Factory {get; private set;}
+
+ public ConnectionDetails ConnectionDetails { get; private set; }
+
+ public DbConnection SqlConnection { get; set; }
+ }
+}
diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs
index 8f430e29..8905ab92 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs
@@ -5,42 +5,16 @@
using System;
using System.Collections.Generic;
-using System.Data.Common;
using System.Data.SqlClient;
using System.Threading.Tasks;
using Microsoft.SqlTools.EditorServices.Utility;
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
-using Microsoft.SqlTools.ServiceLayer.Hosting;
using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol;
using Microsoft.SqlTools.ServiceLayer.SqlContext;
using Microsoft.SqlTools.ServiceLayer.Workspace;
namespace Microsoft.SqlTools.ServiceLayer.Connection
{
- public class ConnectionInfo
- {
- public ConnectionInfo(ISqlConnectionFactory factory, string ownerUri, ConnectionDetails details)
- {
- Factory = factory;
- OwnerUri = ownerUri;
- ConnectionDetails = details;
- ConnectionId = Guid.NewGuid();
- }
-
- ///
- /// Unique Id, helpful to identify a connection info object
- ///
- public Guid ConnectionId { get; private set; }
-
- public string OwnerUri { get; private set; }
-
- public ISqlConnectionFactory Factory {get; private set;}
-
- public ConnectionDetails ConnectionDetails { get; private set; }
-
- public DbConnection SqlConnection { get; set; }
- }
-
///
/// Main class for the Connection Management services
///
diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectMessagesExtensions.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectMessagesExtensions.cs
index b9e73e09..d15adae6 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectMessagesExtensions.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectMessagesExtensions.cs
@@ -27,4 +27,23 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts
);
}
}
+
+ ///
+ /// Extension methods to ConnectionSummary
+ ///
+ public static class ConnectionSummaryExtensions
+ {
+ ///
+ /// Create a copy of a ConnectionSummary object
+ ///
+ public static ConnectionSummary Clone(this ConnectionSummary summary)
+ {
+ return new ConnectionSummary()
+ {
+ ServerName = summary.ServerName,
+ DatabaseName = summary.DatabaseName,
+ UserName = summary.UserName
+ };
+ }
+ }
}
diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectionSummaryComparer.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectionSummaryComparer.cs
new file mode 100644
index 00000000..dfeb0ab4
--- /dev/null
+++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/ConnectionSummaryComparer.cs
@@ -0,0 +1,53 @@
+//
+// 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.Collections.Generic;
+
+namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts
+{
+
+ ///
+ /// Treats connections as the same if their server, db and usernames all match
+ ///
+ public class ConnectionSummaryComparer : IEqualityComparer
+ {
+ public bool Equals(ConnectionSummary x, ConnectionSummary y)
+ {
+ if(x == y) { return true; }
+ else if(x != null)
+ {
+ if(y == null) { return false; }
+
+ // Compare server, db, username. Note: server is case-insensitive in the driver
+ return string.Compare(x.ServerName, y.ServerName, StringComparison.OrdinalIgnoreCase) == 0
+ && string.Compare(x.DatabaseName, y.DatabaseName, StringComparison.Ordinal) == 0
+ && string.Compare(x.UserName, y.UserName, StringComparison.Ordinal) == 0;
+ }
+ return false;
+ }
+
+ public int GetHashCode(ConnectionSummary obj)
+ {
+ int hashcode = 31;
+ if(obj != null)
+ {
+ if(obj.ServerName != null)
+ {
+ hashcode ^= obj.ServerName.GetHashCode();
+ }
+ if (obj.DatabaseName != null)
+ {
+ hashcode ^= obj.DatabaseName.GetHashCode();
+ }
+ if (obj.UserName != null)
+ {
+ hashcode ^= obj.UserName.GetHashCode();
+ }
+ }
+ return hashcode;
+ }
+ }
+}
diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/AutoCompleteService.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/AutoCompleteService.cs
index 14148778..616fc2c6 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/AutoCompleteService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/AutoCompleteService.cs
@@ -5,8 +5,6 @@
using System;
using System.Collections.Generic;
-using System.Data;
-using System.Data.Common;
using System.Threading.Tasks;
using Microsoft.SqlTools.ServiceLayer.Connection;
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
@@ -16,159 +14,6 @@ using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
{
- internal class IntellisenseCache
- {
- // connection used to query for intellisense info
- private DbConnection connection;
-
- // number of documents (URI's) that are using the cache for the same database
- // the autocomplete service uses this to remove unreferenced caches
- public int ReferenceCount { get; set; }
-
- public IntellisenseCache(ISqlConnectionFactory connectionFactory, ConnectionDetails connectionDetails)
- {
- ReferenceCount = 0;
- DatabaseInfo = CopySummary(connectionDetails);
-
- // TODO error handling on this. Intellisense should catch or else the service should handle
- connection = connectionFactory.CreateSqlConnection(ConnectionService.BuildConnectionString(connectionDetails));
- connection.Open();
- }
-
- ///
- /// Used to identify a database for which this cache is used
- ///
- public ConnectionSummary DatabaseInfo
- {
- get;
- private set;
- }
- ///
- /// Gets the current autocomplete candidate list
- ///
- public IEnumerable AutoCompleteList { get; private set; }
-
- public async Task UpdateCache()
- {
- DbCommand command = connection.CreateCommand();
- command.CommandText = "SELECT name FROM sys.tables";
- command.CommandTimeout = 15;
- command.CommandType = CommandType.Text;
- var reader = await command.ExecuteReaderAsync();
-
- List results = new List();
- while (await reader.ReadAsync())
- {
- results.Add(reader[0].ToString());
- }
-
- AutoCompleteList = results;
- await Task.FromResult(0);
- }
-
- public List GetAutoCompleteItems(TextDocumentPosition textDocumentPosition)
- {
- List completions = new List();
-
- int i = 0;
-
- // Take a reference to the list at a point in time in case we update and replace the list
- var suggestions = AutoCompleteList;
- // the completion list will be null is user not connected to server
- if (this.AutoCompleteList != null)
- {
-
- foreach (var autoCompleteItem in suggestions)
- {
- // convert the completion item candidates into CompletionItems
- completions.Add(new CompletionItem()
- {
- Label = autoCompleteItem,
- Kind = CompletionItemKind.Keyword,
- Detail = autoCompleteItem + " details",
- Documentation = autoCompleteItem + " documentation",
- TextEdit = new TextEdit
- {
- NewText = autoCompleteItem,
- Range = new Range
- {
- Start = new Position
- {
- Line = textDocumentPosition.Position.Line,
- Character = textDocumentPosition.Position.Character
- },
- End = new Position
- {
- Line = textDocumentPosition.Position.Line,
- Character = textDocumentPosition.Position.Character + 5
- }
- }
- }
- });
-
- // only show 50 items
- if (++i == 50)
- {
- break;
- }
- }
- }
-
- return completions;
- }
-
- private static ConnectionSummary CopySummary(ConnectionSummary summary)
- {
- return new ConnectionSummary()
- {
- ServerName = summary.ServerName,
- DatabaseName = summary.DatabaseName,
- UserName = summary.UserName
- };
- }
- }
-
- ///
- /// Treats connections as the same if their server, db and usernames all match
- ///
- public class ConnectionSummaryComparer : IEqualityComparer
- {
- public bool Equals(ConnectionSummary x, ConnectionSummary y)
- {
- if(x == y) { return true; }
- else if(x != null)
- {
- if(y == null) { return false; }
-
- // Compare server, db, username. Note: server is case-insensitive in the driver
- return string.Compare(x.ServerName, y.ServerName, StringComparison.OrdinalIgnoreCase) == 0
- && string.Compare(x.DatabaseName, y.DatabaseName, StringComparison.Ordinal) == 0
- && string.Compare(x.UserName, y.UserName, StringComparison.Ordinal) == 0;
- }
- return false;
- }
-
- public int GetHashCode(ConnectionSummary obj)
- {
- int hashcode = 31;
- if(obj != null)
- {
- if(obj.ServerName != null)
- {
- hashcode ^= obj.ServerName.GetHashCode();
- }
- if (obj.DatabaseName != null)
- {
- hashcode ^= obj.DatabaseName.GetHashCode();
- }
- if (obj.UserName != null)
- {
- hashcode ^= obj.UserName.GetHashCode();
- }
- }
- return hashcode;
- }
- }
///
/// Main class for Autocomplete functionality
///
diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/IntellisenseCache.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/IntellisenseCache.cs
new file mode 100644
index 00000000..ca4c155a
--- /dev/null
+++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/IntellisenseCache.cs
@@ -0,0 +1,119 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.Connection;
+using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
+using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts;
+using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts;
+
+namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
+{
+
+ internal class IntellisenseCache
+ {
+ // connection used to query for intellisense info
+ private DbConnection connection;
+
+ // number of documents (URI's) that are using the cache for the same database
+ // the autocomplete service uses this to remove unreferenced caches
+ public int ReferenceCount { get; set; }
+
+ public IntellisenseCache(ISqlConnectionFactory connectionFactory, ConnectionDetails connectionDetails)
+ {
+ ReferenceCount = 0;
+ DatabaseInfo = connectionDetails.Clone();
+
+ // TODO error handling on this. Intellisense should catch or else the service should handle
+ connection = connectionFactory.CreateSqlConnection(ConnectionService.BuildConnectionString(connectionDetails));
+ connection.Open();
+ }
+
+ ///
+ /// Used to identify a database for which this cache is used
+ ///
+ public ConnectionSummary DatabaseInfo
+ {
+ get;
+ private set;
+ }
+ ///
+ /// Gets the current autocomplete candidate list
+ ///
+ public IEnumerable AutoCompleteList { get; private set; }
+
+ public async Task UpdateCache()
+ {
+ DbCommand command = connection.CreateCommand();
+ command.CommandText = "SELECT name FROM sys.tables";
+ command.CommandTimeout = 15;
+ command.CommandType = CommandType.Text;
+ var reader = await command.ExecuteReaderAsync();
+
+ List results = new List();
+ while (await reader.ReadAsync())
+ {
+ results.Add(reader[0].ToString());
+ }
+
+ AutoCompleteList = results;
+ await Task.FromResult(0);
+ }
+
+ public List GetAutoCompleteItems(TextDocumentPosition textDocumentPosition)
+ {
+ List completions = new List();
+
+ int i = 0;
+
+ // Take a reference to the list at a point in time in case we update and replace the list
+ var suggestions = AutoCompleteList;
+ // the completion list will be null is user not connected to server
+ if (this.AutoCompleteList != null)
+ {
+
+ foreach (var autoCompleteItem in suggestions)
+ {
+ // convert the completion item candidates into CompletionItems
+ completions.Add(new CompletionItem()
+ {
+ Label = autoCompleteItem,
+ Kind = CompletionItemKind.Keyword,
+ Detail = autoCompleteItem + " details",
+ Documentation = autoCompleteItem + " documentation",
+ TextEdit = new TextEdit
+ {
+ NewText = autoCompleteItem,
+ Range = new Range
+ {
+ Start = new Position
+ {
+ Line = textDocumentPosition.Position.Line,
+ Character = textDocumentPosition.Position.Character
+ },
+ End = new Position
+ {
+ Line = textDocumentPosition.Position.Line,
+ Character = textDocumentPosition.Position.Character + 5
+ }
+ }
+ }
+ });
+
+ // only show 50 items
+ if (++i == 50)
+ {
+ break;
+ }
+ }
+ }
+
+ return completions;
+ }
+ }
+}