Adding support for database literal references for Dacpac and SqlProj references (#1858)

* fixing up some nullable spots

* Adding database literal support

* Adding tests and support for same database refs

* Fixing test

* merge laggard

* Split database reference tests up

* PR feedback

* Normalizing strings for cross-plat test passing

* Updating Projects nuget package

* Fixing up test
This commit is contained in:
Benjin Dubishar
2023-02-10 11:36:31 -08:00
committed by GitHub
parent 15250a9178
commit d0d67373d1
21 changed files with 293 additions and 99 deletions

View File

@@ -81,20 +81,20 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
internal async Task HandleOpenSqlProjectRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!), requestContext);
}
internal async Task HandleCloseSqlProjectRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => Projects.TryRemove(requestParams.ProjectUri, out _), requestContext);
await RunWithErrorHandling(() => Projects.TryRemove(requestParams.ProjectUri!, out _), requestContext);
}
internal async Task HandleNewSqlProjectRequest(NewSqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(async () =>
{
await SqlProject.CreateProjectAsync(requestParams.ProjectUri, new CreateSqlProjectParams() { ProjectType = requestParams.SqlProjectType, DspVersion = requestParams.DatabaseSchemaProvider });
GetProject(requestParams.ProjectUri); // load into the cache
await SqlProject.CreateProjectAsync(requestParams.ProjectUri!, new CreateSqlProjectParams() { ProjectType = requestParams.SqlProjectType, DspVersion = requestParams.DatabaseSchemaProvider });
GetProject(requestParams.ProjectUri!); // load into the cache
}, requestContext);
}
@@ -106,14 +106,14 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
{
Success = true,
ErrorMessage = null,
IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri).CrossPlatformCompatible
IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri!).CrossPlatformCompatible
};
}, requestContext);
}
internal async Task HandleUpdateProjectForCrossPlatformRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).UpdateForCrossPlatform(), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).UpdateForCrossPlatform(), requestContext);
}
#endregion
@@ -124,17 +124,17 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
internal async Task HandleAddSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Add(new SqlObjectScript(requestParams.Path)), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Add(new SqlObjectScript(requestParams.Path!)), requestContext);
}
internal async Task HandleDeleteSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Delete(requestParams.Path), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Delete(requestParams.Path!), requestContext);
}
internal async Task HandleExcludeSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Exclude(requestParams.Path), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Exclude(requestParams.Path!), requestContext);
}
#endregion
@@ -193,11 +193,11 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
internal async Task HandleAddSystemDatabaseReferenceRequest(AddSystemDatabaseReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).DatabaseReferences.Add(
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).DatabaseReferences.Add(
new SystemDatabaseReference(
requestParams.SystemDatabase,
requestParams.SuppressMissingDependencies,
requestParams.DatabaseVariable)),
requestParams.DatabaseLiteral)),
requestContext);
}
@@ -205,14 +205,32 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
{
await RunWithErrorHandling(() =>
{
SqlProject project = GetProject(requestParams.ProjectUri);
requestParams.Validate();
project.DatabaseReferences.Add(
new DacpacReference(
SqlProject project = GetProject(requestParams.ProjectUri!);
DacpacReference reference;
if (requestParams.DatabaseLiteral != null) // same server, different database via database name literal
{
reference = new DacpacReference(
requestParams.DacpacPath,
requestParams.SuppressMissingDependencies,
project.SqlCmdVariables.Get(requestParams.DatabaseVariable),
project.SqlCmdVariables.Get(requestParams.ServerVariable)));
requestParams.DatabaseLiteral);
}
else if (requestParams.DatabaseVariable != null) // different database, possibly different server via sqlcmdvar
{
reference = new DacpacReference(
requestParams.DacpacPath,
requestParams.SuppressMissingDependencies,
project.SqlCmdVariables.Get(requestParams.DatabaseVariable!),
requestParams.ServerVariable != null ? project.SqlCmdVariables.Get(requestParams.ServerVariable) : null);
}
else // same database
{
reference = new DacpacReference(requestParams.DacpacPath, requestParams.SuppressMissingDependencies);
}
project.DatabaseReferences.Add(reference);
}, requestContext);
}
@@ -220,42 +238,64 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
{
await RunWithErrorHandling(() =>
{
SqlProject project = GetProject(requestParams.ProjectUri);
requestParams.Validate();
project.DatabaseReferences.Add(
new SqlProjectReference(
SqlProject project = GetProject(requestParams.ProjectUri!);
SqlProjectReference reference;
if (requestParams.DatabaseLiteral != null) // same server, different database via database name literal
{
reference = new SqlProjectReference(
requestParams.ProjectPath,
requestParams.ProjectGuid,
requestParams.SuppressMissingDependencies,
project.SqlCmdVariables.Get(requestParams.DatabaseVariable),
project.SqlCmdVariables.Get(requestParams.ServerVariable)));
requestParams.DatabaseLiteral);
}
else if (requestParams.DatabaseVariable != null) // different database, possibly different server via sqlcmdvar
{
reference = new SqlProjectReference(
requestParams.ProjectPath,
requestParams.ProjectGuid, requestParams.SuppressMissingDependencies,
project.SqlCmdVariables.Get(requestParams.DatabaseVariable!),
requestParams.ServerVariable != null ? project.SqlCmdVariables.Get(requestParams.ServerVariable) : null);
}
else // same database
{
reference = new SqlProjectReference(
requestParams.ProjectPath,
requestParams.ProjectGuid,
requestParams.SuppressMissingDependencies);
}
project.DatabaseReferences.Add(reference);
}, 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);
}
#endregion
#region SQLCMD variable functions
internal async Task HandleAddSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue, requestParams.Value)), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue, requestParams.Value)), requestContext);
}
internal async Task HandleDeleteSqlCmdVariableRequest(DeleteSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlCmdVariables.Delete(requestParams.Name), requestContext);
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlCmdVariables.Delete(requestParams.Name), requestContext);
}
internal async Task HandleUpdateSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
{
await RunWithErrorHandling(() =>
{
SqlProject project = GetProject(requestParams.ProjectUri);
SqlProject project = GetProject(requestParams.ProjectUri!);
project.SqlCmdVariables.Delete(requestParams.Name); // idempotent (won't throw if doesn't exist)
project.SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue, requestParams.Value));
}, requestContext);