diff --git a/bin/nuget/Microsoft.SqlServer.Smo.140.17051.0.nupkg b/bin/nuget/Microsoft.SqlServer.Smo.140.17051.0.nupkg deleted file mode 100644 index 524be7a7..00000000 Binary files a/bin/nuget/Microsoft.SqlServer.Smo.140.17051.0.nupkg and /dev/null differ diff --git a/bin/nuget/Microsoft.SqlServer.Smo.140.17053.0.nupkg b/bin/nuget/Microsoft.SqlServer.Smo.140.17053.0.nupkg new file mode 100644 index 00000000..61529622 Binary files /dev/null and b/bin/nuget/Microsoft.SqlServer.Smo.140.17053.0.nupkg differ diff --git a/docs/samples/jsonrpc/netcore/executequery/project.json b/docs/samples/jsonrpc/netcore/executequery/project.json index 847ad937..f7e9559b 100644 --- a/docs/samples/jsonrpc/netcore/executequery/project.json +++ b/docs/samples/jsonrpc/netcore/executequery/project.json @@ -12,7 +12,7 @@ "Newtonsoft.Json": "9.0.1", "System.Data.Common": "4.1.0", "System.Data.SqlClient": "4.4.0-sqltools-24613-04", - "Microsoft.SqlServer.Smo": "140.17051.0", + "Microsoft.SqlServer.Smo": "140.17053.0", "System.Security.SecureString": "4.0.0", "System.Collections.Specialized": "4.0.1", "System.ComponentModel.TypeConverter": "4.1.0", diff --git a/docs/samples/smo/netcore/ModifySetting/project.json b/docs/samples/smo/netcore/ModifySetting/project.json index 347469e1..3b5292fb 100644 --- a/docs/samples/smo/netcore/ModifySetting/project.json +++ b/docs/samples/smo/netcore/ModifySetting/project.json @@ -5,7 +5,7 @@ "emitEntryPoint": true }, "dependencies": { - "Microsoft.SqlServer.Smo": "140.17051.0" + "Microsoft.SqlServer.Smo": "140.17053.0" }, "frameworks": { "netcoreapp1.0": { diff --git a/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs b/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs index 84c0e978..1aabc31f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs @@ -12,11 +12,12 @@ using System; using System.Threading.Tasks; using System.Xml; using Microsoft.SqlServer.Management.Smo; +using System.Collections.Concurrent; namespace Microsoft.SqlTools.ServiceLayer.Admin { /// - /// Datasource admin task service class + /// Admin task service class /// public class AdminService { @@ -24,6 +25,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin private static ConnectionService connectionService = null; + private static readonly ConcurrentDictionary serverTaskHelperMap = + new ConcurrentDictionary(); + + private static DatabaseTaskHelper taskHelper; + /// /// Default, parameterless constructor. /// @@ -69,30 +75,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin serviceHost.SetRequestHandler(DefaultDatabaseInfoRequest.Type, HandleDefaultDatabaseInfoRequest); } - private static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo) - { - XmlDocument xmlDoc = CreateDataContainerDocument(connInfo); - char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray(); - CDataContainer dataContainer; - - unsafe - { - fixed (char* passwordPtr = passwordArray) - { - dataContainer = new CDataContainer( - CDataContainer.ServerType.SQL, - connInfo.ConnectionDetails.ServerName, - false, - connInfo.ConnectionDetails.UserName, - new System.Security.SecureString(passwordPtr, passwordArray.Length), - xmlDoc.InnerXml); - } - } - - var taskHelper = new DatabaseTaskHelper(dataContainer); - return taskHelper; - } - /// /// Handle a request for the default database prototype info /// @@ -106,12 +88,87 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin optionsParams.OwnerUri, out connInfo); - DatabaseTaskHelper taskHelper = CreateDatabaseTaskHelper(connInfo); + if (taskHelper == null) + { + taskHelper = CreateDatabaseTaskHelper(connInfo); + } response.DefaultDatabaseInfo = DatabaseTaskHelper.DatabasePrototypeToDatabaseInfo(taskHelper.Prototype); await requestContext.SendResult(response); } + /// + /// Handles a create database request + /// + internal static async Task HandleCreateDatabaseRequest( + CreateDatabaseParams databaseParams, + RequestContext requestContext) + { + var response = new DefaultDatabaseInfoResponse(); + ConnectionInfo connInfo; + AdminService.ConnectionServiceInstance.TryFindConnection( + databaseParams.OwnerUri, + out connInfo); + + if (taskHelper == null) + { + taskHelper = CreateDatabaseTaskHelper(connInfo); + } + + DatabasePrototype prototype = taskHelper.Prototype; + DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype); + + Database db = prototype.ApplyChanges(); + if (db != null) + { + taskHelper = null; + } + + await requestContext.SendResult(new CreateDatabaseResponse() + { + Result = true, + TaskId = 0 + }); + } + + private static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo) + { + XmlDocument xmlDoc = CreateDataContainerDocument(connInfo); + char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray(); + CDataContainer dataContainer; + + // check if the connection is using SQL Auth or Integrated Auth + if (string.Equals(connInfo.ConnectionDetails.AuthenticationType, "SqlLogin", StringComparison.OrdinalIgnoreCase)) + { + unsafe + { + fixed (char* passwordPtr = passwordArray) + { + dataContainer = new CDataContainer( + CDataContainer.ServerType.SQL, + connInfo.ConnectionDetails.ServerName, + false, + connInfo.ConnectionDetails.UserName, + new System.Security.SecureString(passwordPtr, passwordArray.Length), + xmlDoc.InnerXml); + } + } + } + else + { + dataContainer = new CDataContainer( + CDataContainer.ServerType.SQL, + connInfo.ConnectionDetails.ServerName, + true, + null, + null, + xmlDoc.InnerXml); + } + + var taskHelper = new DatabaseTaskHelper(dataContainer); + return taskHelper; + } + private static XmlDocument CreateDataContainerDocument(ConnectionInfo connInfo) { string xml = @@ -131,32 +188,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin return xmlDoc; } - /// - /// Handles a create database request - /// - internal static async Task HandleCreateDatabaseRequest( - CreateDatabaseParams databaseParams, - RequestContext requestContext) - { - var response = new DefaultDatabaseInfoResponse(); - ConnectionInfo connInfo; - AdminService.ConnectionServiceInstance.TryFindConnection( - databaseParams.OwnerUri, - out connInfo); - - DatabaseTaskHelper taskHelper = CreateDatabaseTaskHelper(connInfo); - DatabasePrototype prototype = taskHelper.Prototype; - DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype); - - Database db = prototype.ApplyChanges(); - - await requestContext.SendResult(new CreateDatabaseResponse() - { - Result = true, - TaskId = 0 - }); - } - /// /// Handles a create login request /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Admin/Database/DatabaseTaskHelper.cs b/src/Microsoft.SqlTools.ServiceLayer/Admin/Database/DatabaseTaskHelper.cs index 0d417dd8..481fcf75 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Admin/Database/DatabaseTaskHelper.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Admin/Database/DatabaseTaskHelper.cs @@ -169,6 +169,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin { file.Name = prototype.Name + "_" + logicalNameCount; } + else + { + file.Name += prototype.Name + file.Name + "_" + logicalNameCount; + } + + ++logicalNameCount; } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/Workspace/Workspace.cs b/src/Microsoft.SqlTools.ServiceLayer/Workspace/Workspace.cs index 279c1b37..6853401d 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Workspace/Workspace.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Workspace/Workspace.cs @@ -11,6 +11,7 @@ using System.Text.RegularExpressions; using System.Linq; using Microsoft.SqlTools.Utility; using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts; +using System.Runtime.InteropServices; namespace Microsoft.SqlTools.ServiceLayer.Workspace { @@ -114,7 +115,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace // Client sent the path in URI format, extract the local path and trim // any extraneous slashes Uri fileUri = new Uri(filePath); - filePath = fileUri.LocalPath.TrimStart('/'); + filePath = fileUri.LocalPath; + if (filePath.StartsWith("//") || filePath.StartsWith("\\\\")) + { + filePath = filePath.Substring(1); + } } // Clients could specify paths with escaped space, [ and ] characters which .NET APIs @@ -122,6 +127,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace // into the SqlTools engine. filePath = UnescapePath(filePath); + // switch to unix path separators on non-Windows platforms + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + filePath = filePath.Replace('\\', '/'); + } + // Get the absolute file path filePath = Path.GetFullPath(filePath); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/project.json b/src/Microsoft.SqlTools.ServiceLayer/project.json index e9a57e12..f134d50d 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/project.json +++ b/src/Microsoft.SqlTools.ServiceLayer/project.json @@ -21,7 +21,7 @@ "Newtonsoft.Json": "9.0.1", "System.Data.Common": "4.1.0", "System.Data.SqlClient": "4.4.0-sqltools-24613-04", - "Microsoft.SqlServer.Smo": "140.17051.0", + "Microsoft.SqlServer.Smo": "140.17053.0", "Microsoft.SqlServer.Management.SqlScriptPublishModel": "140.17049.0", "System.Security.SecureString": "4.0.0", "System.Collections.Specialized": "4.0.1", diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/PeekDefinitionTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/PeekDefinitionTests.cs index b550377b..d17080d2 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/PeekDefinitionTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/PeekDefinitionTests.cs @@ -297,9 +297,9 @@ GO"; ServerConnection serverConnection = LiveConnectionHelper.InitLiveServerConnectionForDefinition(connInfo); Scripter scripter = new Scripter(serverConnection, connInfo); - string objectName = "sp_MSrepl_startup"; + string objectName = "sp_columns"; - string schemaName = "dbo"; + string schemaName = "sys"; string objectType = "PROCEDURE"; Location[] locations = scripter.GetSqlObjectDefinition(scripter.GetStoredProcedureScripts, objectName, schemaName, objectType); diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/project.json b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/project.json index 04ca3283..266d36ad 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/project.json +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/project.json @@ -17,7 +17,7 @@ "System.Runtime.Serialization.Primitives": "4.1.1", "System.Data.Common": "4.1.0", "System.Data.SqlClient": "4.4.0-sqltools-24613-04", - "Microsoft.SqlServer.Smo": "140.17051.0", + "Microsoft.SqlServer.Smo": "140.17053.0", "System.Security.SecureString": "4.0.0", "System.Collections.Specialized": "4.0.1", "System.ComponentModel.TypeConverter": "4.1.0", diff --git a/test/Microsoft.SqlTools.ServiceLayer.Test.Common/project.json b/test/Microsoft.SqlTools.ServiceLayer.Test.Common/project.json index 75af47fd..76d9d20c 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.Test.Common/project.json +++ b/test/Microsoft.SqlTools.ServiceLayer.Test.Common/project.json @@ -18,7 +18,7 @@ "System.Runtime.Serialization.Primitives": "4.1.1", "System.Data.Common": "4.1.0", "System.Data.SqlClient": "4.4.0-sqltools-24613-04", - "Microsoft.SqlServer.Smo": "140.17051.0", + "Microsoft.SqlServer.Smo": "140.17053.0", "System.Security.SecureString": "4.0.0", "System.Collections.Specialized": "4.0.1", "System.ComponentModel.TypeConverter": "4.1.0", diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/project.json b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/project.json index 10e541a4..854b49aa 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/project.json +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/project.json @@ -19,7 +19,7 @@ "System.Runtime.Serialization.Primitives": "4.1.1", "System.Data.Common": "4.1.0", "System.Data.SqlClient": "4.4.0-sqltools-24613-04", - "Microsoft.SqlServer.Smo": "140.17051.0", + "Microsoft.SqlServer.Smo": "140.17053.0", "System.Security.SecureString": "4.0.0", "System.Collections.Specialized": "4.0.1", "System.ComponentModel.TypeConverter": "4.1.0",