mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
Add support for nupkg database references in sql projects (#2006)
* add support for nupkg database references in sql projects * update DacFx.Projects
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
<PackageReference Update="Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider" Version="1.1.1" />
|
<PackageReference Update="Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider" Version="1.1.1" />
|
||||||
<PackageReference Update="Microsoft.SqlServer.Management.SmoMetadataProvider" Version="170.12.0" />
|
<PackageReference Update="Microsoft.SqlServer.Management.SmoMetadataProvider" Version="170.12.0" />
|
||||||
<PackageReference Update="Microsoft.SqlServer.DacFx" Version="162.0.15-preview" />
|
<PackageReference Update="Microsoft.SqlServer.DacFx" Version="162.0.15-preview" />
|
||||||
<PackageReference Update="Microsoft.SqlServer.DacFx.Projects" Version="161.8442.0-alpha" />
|
<PackageReference Update="Microsoft.SqlServer.DacFx.Projects" Version="162.0.25-alpha" />
|
||||||
<PackageReference Update="Microsoft.Azure.Kusto.Data" Version="9.0.4" />
|
<PackageReference Update="Microsoft.Azure.Kusto.Data" Version="9.0.4" />
|
||||||
<PackageReference Update="Microsoft.Azure.Kusto.Language" Version="9.0.4" />
|
<PackageReference Update="Microsoft.Azure.Kusto.Language" Version="9.0.4" />
|
||||||
<PackageReference Update="Microsoft.SqlServer.Assessment" Version="[1.1.17]" />
|
<PackageReference Update="Microsoft.SqlServer.Assessment" Version="[1.1.17]" />
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,36 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) Microsoft. All rights reserved.
|
||||||
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||||
|
//
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
using Microsoft.SqlTools.Hosting.Protocol.Contracts;
|
||||||
|
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||||
|
|
||||||
|
namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Parameters for adding a NuGet package reference to a SQL project
|
||||||
|
/// </summary>
|
||||||
|
public class AddNugetPackageReferenceParams : AddUserDatabaseReferenceParams
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// NuGet package name
|
||||||
|
/// </summary>
|
||||||
|
public string PackageName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// NuGet package version
|
||||||
|
/// </summary>
|
||||||
|
public string PackageVersion { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a NuGet package reference to a project
|
||||||
|
/// </summary>
|
||||||
|
public class AddNugetPackageReferenceRequest
|
||||||
|
{
|
||||||
|
public static readonly RequestType<AddNugetPackageReferenceParams, ResultStatus> Type = RequestType<AddNugetPackageReferenceParams, ResultStatus>.Create("sqlprojects/addNugetPackageReference");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -38,5 +38,10 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts
|
|||||||
/// Array of SQL project references contained in the project
|
/// Array of SQL project references contained in the project
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SqlProjectReference[] SqlProjectReferences { get; set; }
|
public SqlProjectReference[] SqlProjectReferences { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Array of NuGet package references contained in the project
|
||||||
|
/// </summary>
|
||||||
|
public NugetPackageReference[] NugetPackageReferences { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
serviceHost.SetRequestHandler(AddSystemDatabaseReferenceRequest.Type, HandleAddSystemDatabaseReferenceRequest, isParallelProcessingSupported: false);
|
serviceHost.SetRequestHandler(AddSystemDatabaseReferenceRequest.Type, HandleAddSystemDatabaseReferenceRequest, isParallelProcessingSupported: false);
|
||||||
serviceHost.SetRequestHandler(AddDacpacReferenceRequest.Type, HandleAddDacpacReferenceRequest, isParallelProcessingSupported: false);
|
serviceHost.SetRequestHandler(AddDacpacReferenceRequest.Type, HandleAddDacpacReferenceRequest, isParallelProcessingSupported: false);
|
||||||
serviceHost.SetRequestHandler(AddSqlProjectReferenceRequest.Type, HandleAddSqlProjectReferenceRequest, isParallelProcessingSupported: false);
|
serviceHost.SetRequestHandler(AddSqlProjectReferenceRequest.Type, HandleAddSqlProjectReferenceRequest, isParallelProcessingSupported: false);
|
||||||
|
serviceHost.SetRequestHandler(AddNugetPackageReferenceRequest.Type, HandleAddNugetPackageReferenceRequest, isParallelProcessingSupported: false);
|
||||||
serviceHost.SetRequestHandler(DeleteDatabaseReferenceRequest.Type, HandleDeleteDatabaseReferenceRequest, isParallelProcessingSupported: false);
|
serviceHost.SetRequestHandler(DeleteDatabaseReferenceRequest.Type, HandleDeleteDatabaseReferenceRequest, isParallelProcessingSupported: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +359,8 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
ErrorMessage = null,
|
ErrorMessage = null,
|
||||||
SystemDatabaseReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SystemDatabaseReference>().ToArray(),
|
SystemDatabaseReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SystemDatabaseReference>().ToArray(),
|
||||||
DacpacReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<DacpacReference>().ToArray(),
|
DacpacReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<DacpacReference>().ToArray(),
|
||||||
SqlProjectReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SqlProjectReference>().ToArray()
|
SqlProjectReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SqlProjectReference>().ToArray(),
|
||||||
|
NugetPackageReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<NugetPackageReference>().ToArray()
|
||||||
};
|
};
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
@@ -443,6 +445,42 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal async Task HandleAddNugetPackageReferenceRequest(AddNugetPackageReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
|
{
|
||||||
|
await RunWithErrorHandling(() =>
|
||||||
|
{
|
||||||
|
requestParams.Validate();
|
||||||
|
|
||||||
|
SqlProject project = GetProject(requestParams.ProjectUri!);
|
||||||
|
NugetPackageReference reference;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
||||||
|
{
|
||||||
|
reference = new NugetPackageReference(
|
||||||
|
requestParams.PackageName,
|
||||||
|
requestParams.PackageVersion,
|
||||||
|
requestParams.SuppressMissingDependencies,
|
||||||
|
requestParams.DatabaseLiteral);
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrWhiteSpace(requestParams.DatabaseVariable)) // different database, possibly different server via sqlcmdvar
|
||||||
|
{
|
||||||
|
reference = new NugetPackageReference(
|
||||||
|
requestParams.PackageName,
|
||||||
|
requestParams.PackageVersion,
|
||||||
|
requestParams.SuppressMissingDependencies,
|
||||||
|
project.SqlCmdVariables.Get(requestParams.DatabaseVariable!),
|
||||||
|
requestParams.ServerVariable != null ? project.SqlCmdVariables.Get(requestParams.ServerVariable) : null);
|
||||||
|
}
|
||||||
|
else // same database
|
||||||
|
{
|
||||||
|
reference = new NugetPackageReference(requestParams.PackageName, requestParams.PackageVersion, requestParams.SuppressMissingDependencies);
|
||||||
|
}
|
||||||
|
|
||||||
|
project.DatabaseReferences.Add(reference);
|
||||||
|
}, requestContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
internal async Task HandleDeleteDatabaseReferenceRequest(DeleteDatabaseReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleDeleteDatabaseReferenceRequest(DeleteDatabaseReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).DatabaseReferences.Delete(requestParams.Name!), requestContext);
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).DatabaseReferences.Delete(requestParams.Name!), requestContext);
|
||||||
|
|||||||
@@ -472,10 +472,12 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects
|
|||||||
SystemDatabaseReference systemDatabaseReference = new SystemDatabaseReference(SystemDatabase.MSDB, suppressMissingDependencies: true);
|
SystemDatabaseReference systemDatabaseReference = new SystemDatabaseReference(SystemDatabase.MSDB, suppressMissingDependencies: true);
|
||||||
DacpacReference dacpacReference = new DacpacReference("OtherDatabaseDacpac.dacpac", suppressMissingDependencies: true);
|
DacpacReference dacpacReference = new DacpacReference("OtherDatabaseDacpac.dacpac", suppressMissingDependencies: true);
|
||||||
SqlProjectReference sqlProjectReference = new SqlProjectReference("OtherDatabaseProject.sqlproj", projectGuid: TEST_GUID, suppressMissingDependencies: true);
|
SqlProjectReference sqlProjectReference = new SqlProjectReference("OtherDatabaseProject.sqlproj", projectGuid: TEST_GUID, suppressMissingDependencies: true);
|
||||||
|
NugetPackageReference nugetPackageReference = new NugetPackageReference("Project1", "2.0.0", suppressMissingDependencies: true);
|
||||||
|
|
||||||
service.Projects[projectUri].DatabaseReferences.Add(systemDatabaseReference);
|
service.Projects[projectUri].DatabaseReferences.Add(systemDatabaseReference);
|
||||||
service.Projects[projectUri].DatabaseReferences.Add(dacpacReference);
|
service.Projects[projectUri].DatabaseReferences.Add(dacpacReference);
|
||||||
service.Projects[projectUri].DatabaseReferences.Add(sqlProjectReference);
|
service.Projects[projectUri].DatabaseReferences.Add(sqlProjectReference);
|
||||||
|
service.Projects[projectUri].DatabaseReferences.Add(nugetPackageReference);
|
||||||
|
|
||||||
// Validate getting a list of the post-deployment scripts
|
// Validate getting a list of the post-deployment scripts
|
||||||
MockRequest<GetDatabaseReferencesResult> getMock = new();
|
MockRequest<GetDatabaseReferencesResult> getMock = new();
|
||||||
@@ -494,6 +496,9 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects
|
|||||||
|
|
||||||
Assert.AreEqual(1, getMock.Result.SqlProjectReferences.Length);
|
Assert.AreEqual(1, getMock.Result.SqlProjectReferences.Length);
|
||||||
Assert.AreEqual(sqlProjectReference, getMock.Result.SqlProjectReferences[0]);
|
Assert.AreEqual(sqlProjectReference, getMock.Result.SqlProjectReferences[0]);
|
||||||
|
|
||||||
|
Assert.AreEqual(1, getMock.Result.NugetPackageReferences.Length);
|
||||||
|
Assert.AreEqual(nugetPackageReference, getMock.Result.NugetPackageReferences[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -694,6 +699,100 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects
|
|||||||
Assert.IsFalse(projectRef.SuppressMissingDependencies, nameof(projectRef.SuppressMissingDependencies));
|
Assert.IsFalse(projectRef.SuppressMissingDependencies, nameof(projectRef.SuppressMissingDependencies));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestNugetPackageReferenceAdd()
|
||||||
|
{
|
||||||
|
var (service, projectUri, databaseVar, serverVar) = await SetUpDatabaseReferenceTest();
|
||||||
|
|
||||||
|
// Validate adding a nupkg reference on the same server
|
||||||
|
string mockPackageName = "OtherDatabaseSameServer";
|
||||||
|
string mockPackageVersion = "2.0.0";
|
||||||
|
|
||||||
|
MockRequest<ResultStatus> requestMock = new();
|
||||||
|
await service.HandleAddNugetPackageReferenceRequest(new AddNugetPackageReferenceParams()
|
||||||
|
{
|
||||||
|
ProjectUri = projectUri,
|
||||||
|
PackageName = mockPackageName,
|
||||||
|
PackageVersion = mockPackageVersion,
|
||||||
|
SuppressMissingDependencies = false
|
||||||
|
}, requestMock.Object);
|
||||||
|
|
||||||
|
requestMock.AssertSuccess(nameof(service.HandleAddNugetPackageReferenceRequest), "same server");
|
||||||
|
Assert.AreEqual(1, service.Projects[projectUri].DatabaseReferences.Count, "Database references after adding nupkg reference (same server)");
|
||||||
|
NugetPackageReference nupkgRef = (NugetPackageReference)service.Projects[projectUri].DatabaseReferences.Get(mockPackageName);
|
||||||
|
Assert.AreEqual(mockPackageName, nupkgRef.PackageName, "Referenced nupkg");
|
||||||
|
Assert.AreEqual(mockPackageVersion, nupkgRef.Version, "Referenced nupkg version");
|
||||||
|
Assert.IsFalse(nupkgRef.SuppressMissingDependencies, nameof(nupkgRef.SuppressMissingDependencies));
|
||||||
|
Assert.IsNull(nupkgRef.DatabaseVariableLiteralName, nameof(nupkgRef.DatabaseVariableLiteralName));
|
||||||
|
Assert.IsNull(nupkgRef.DatabaseVariable, nameof(nupkgRef.DatabaseVariable));
|
||||||
|
|
||||||
|
// Validate adding a nupkg reference via SQLCMD variable
|
||||||
|
mockPackageName = "OtherDatabaseSqlCmd";
|
||||||
|
|
||||||
|
requestMock = new();
|
||||||
|
await service.HandleAddNugetPackageReferenceRequest(new AddNugetPackageReferenceParams()
|
||||||
|
{
|
||||||
|
ProjectUri = projectUri,
|
||||||
|
PackageName = mockPackageName,
|
||||||
|
PackageVersion = mockPackageVersion,
|
||||||
|
SuppressMissingDependencies = false,
|
||||||
|
DatabaseVariable = databaseVar.Name,
|
||||||
|
ServerVariable = serverVar.Name
|
||||||
|
}, requestMock.Object);
|
||||||
|
|
||||||
|
requestMock.AssertSuccess(nameof(service.HandleAddNugetPackageReferenceRequest), "sqlcmdvar");
|
||||||
|
Assert.AreEqual(2, service.Projects[projectUri].DatabaseReferences.Count, "Database references after adding nupkg reference (sqlcmdvar)");
|
||||||
|
nupkgRef = (NugetPackageReference)service.Projects[projectUri].DatabaseReferences.Get(mockPackageName);
|
||||||
|
Assert.AreEqual(mockPackageName, nupkgRef.PackageName, "Referenced nupkg");
|
||||||
|
Assert.AreEqual(mockPackageVersion, nupkgRef.Version, "Referenced nupkg version");
|
||||||
|
Assert.AreEqual(databaseVar.Name, nupkgRef.DatabaseVariable!.VarName);
|
||||||
|
Assert.AreEqual(serverVar.Name, nupkgRef.ServerVariable!.VarName);
|
||||||
|
Assert.IsFalse(nupkgRef.SuppressMissingDependencies, nameof(nupkgRef.SuppressMissingDependencies));
|
||||||
|
|
||||||
|
// Validate adding a nupkg reference via database literal
|
||||||
|
mockPackageName = "OtherDatabaseLiteral";
|
||||||
|
|
||||||
|
requestMock = new();
|
||||||
|
await service.HandleAddNugetPackageReferenceRequest(new AddNugetPackageReferenceParams()
|
||||||
|
{
|
||||||
|
ProjectUri = projectUri,
|
||||||
|
PackageName = mockPackageName,
|
||||||
|
PackageVersion = mockPackageVersion,
|
||||||
|
SuppressMissingDependencies = false,
|
||||||
|
DatabaseLiteral = "NupkgLiteral"
|
||||||
|
}, requestMock.Object);
|
||||||
|
|
||||||
|
requestMock.AssertSuccess(nameof(service.HandleAddNugetPackageReferenceRequest), "db literal");
|
||||||
|
Assert.AreEqual(3, service.Projects[projectUri].DatabaseReferences.Count, "Database references after adding nupkg reference (db literal)");
|
||||||
|
nupkgRef = (NugetPackageReference)service.Projects[projectUri].DatabaseReferences.Get(mockPackageName);
|
||||||
|
Assert.AreEqual(mockPackageName, nupkgRef.PackageName, "Referenced nupkg");
|
||||||
|
Assert.AreEqual(mockPackageVersion, nupkgRef.Version, "Referenced nupkg version");
|
||||||
|
Assert.AreEqual("NupkgLiteral", nupkgRef.DatabaseVariableLiteralName, nameof(nupkgRef.DatabaseVariableLiteralName));
|
||||||
|
Assert.IsFalse(nupkgRef.SuppressMissingDependencies, nameof(nupkgRef.SuppressMissingDependencies));
|
||||||
|
|
||||||
|
// Validate adding a nupkg reference via database literal when an empty string is passed in for DatabaseVariable
|
||||||
|
mockPackageName = "AnotherDatabaseLiteral";
|
||||||
|
|
||||||
|
requestMock = new();
|
||||||
|
await service.HandleAddNugetPackageReferenceRequest(new AddNugetPackageReferenceParams()
|
||||||
|
{
|
||||||
|
ProjectUri = projectUri,
|
||||||
|
PackageName = mockPackageName,
|
||||||
|
PackageVersion = mockPackageVersion,
|
||||||
|
SuppressMissingDependencies = false,
|
||||||
|
DatabaseLiteral = "NupkgLiteral2",
|
||||||
|
DatabaseVariable = ""
|
||||||
|
}, requestMock.Object);
|
||||||
|
|
||||||
|
requestMock.AssertSuccess(nameof(service.HandleAddNugetPackageReferenceRequest), "db literal");
|
||||||
|
Assert.AreEqual(4, service.Projects[projectUri].DatabaseReferences.Count, "Database references after adding nupkg reference with an empty string passed in for database variable(db literal)");
|
||||||
|
nupkgRef = (NugetPackageReference)service.Projects[projectUri].DatabaseReferences.Get(mockPackageName);
|
||||||
|
Assert.AreEqual(mockPackageName, nupkgRef.PackageName, "Referenced nupkg");
|
||||||
|
Assert.AreEqual("NupkgLiteral2", nupkgRef.DatabaseVariableLiteralName, nameof(nupkgRef.DatabaseVariableLiteralName));
|
||||||
|
Assert.IsFalse(nupkgRef.SuppressMissingDependencies, nameof(nupkgRef.SuppressMissingDependencies));
|
||||||
|
Assert.AreEqual(null, nupkgRef.DatabaseVariable, nameof(nupkgRef.DatabaseVariable));
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
Reference in New Issue
Block a user