mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-13 17:23:02 -05:00
Adding ability to only load properties and metadata for a SqlProject (#2040)
* Adding property quick-loading * Remove whitespace
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.34-preview" />
|
<PackageReference Update="Microsoft.SqlServer.DacFx" Version="162.0.34-preview" />
|
||||||
<PackageReference Update="Microsoft.SqlServer.DacFx.Projects" Version="162.0.32-alpha" />
|
<PackageReference Update="Microsoft.SqlServer.DacFx.Projects" Version="162.1.3-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.
BIN
bin/nuget/Microsoft.SqlServer.DacFx.Projects.162.1.3-alpha.nupkg
Normal file
BIN
bin/nuget/Microsoft.SqlServer.DacFx.Projects.162.1.3-alpha.nupkg
Normal file
Binary file not shown.
@@ -105,20 +105,20 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
|
|
||||||
internal async Task HandleOpenSqlProjectRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
|
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)
|
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 HandleCreateSqlProjectRequest(Contracts.CreateSqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleCreateSqlProjectRequest(Contracts.CreateSqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(async () =>
|
await RunWithErrorHandling(async () =>
|
||||||
{
|
{
|
||||||
await SqlProject.CreateProjectAsync(requestParams.ProjectUri!, new SqlServer.Dac.Projects.CreateSqlProjectParams() { ProjectType = requestParams.SqlProjectType, DspVersion = requestParams.DatabaseSchemaProvider });
|
await SqlProject.CreateProjectAsync(requestParams.ProjectUri, new SqlServer.Dac.Projects.CreateSqlProjectParams() { ProjectType = requestParams.SqlProjectType, DspVersion = requestParams.DatabaseSchemaProvider });
|
||||||
this.GetProject(requestParams.ProjectUri!); // load into the cache
|
this.GetProject(requestParams.ProjectUri); // load into the cache
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,21 +130,21 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
ErrorMessage = null,
|
ErrorMessage = null,
|
||||||
IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri).CrossPlatformCompatible
|
IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri, onlyLoadProperties: true).CrossPlatformCompatible
|
||||||
};
|
};
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleUpdateProjectForCrossPlatformRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleUpdateProjectForCrossPlatformRequest(SqlProjectParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).UpdateForCrossPlatform(), requestContext);
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri, onlyLoadProperties: true).UpdateForCrossPlatform(), requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleGetProjectPropertiesRequest(SqlProjectParams requestParams, RequestContext<GetProjectPropertiesResult> requestContext)
|
internal async Task HandleGetProjectPropertiesRequest(SqlProjectParams requestParams, RequestContext<GetProjectPropertiesResult> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() =>
|
await RunWithErrorHandling(() =>
|
||||||
{
|
{
|
||||||
SqlProject project = GetProject(requestParams.ProjectUri);
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
|
|
||||||
return new GetProjectPropertiesResult()
|
return new GetProjectPropertiesResult()
|
||||||
{
|
{
|
||||||
@@ -157,19 +157,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
DefaultCollation = project.Properties.DefaultCollation,
|
DefaultCollation = project.Properties.DefaultCollation,
|
||||||
DatabaseSource = project.Properties.DatabaseSource,
|
DatabaseSource = project.Properties.DatabaseSource,
|
||||||
ProjectStyle = project.SqlProjStyle,
|
ProjectStyle = project.SqlProjStyle,
|
||||||
DatabaseSchemaProvider = project.DatabaseSchemaProvider
|
DatabaseSchemaProvider = project.Properties.DatabaseSchemaProvider
|
||||||
};
|
};
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleSetDatabaseSourceRequest(SetDatabaseSourceParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleSetDatabaseSourceRequest(SetDatabaseSourceParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).Properties.DatabaseSource = requestParams.DatabaseSource, requestContext);
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri, onlyLoadProperties: true).Properties.DatabaseSource = requestParams.DatabaseSource, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleSetDatabaseSchemaProviderRequest(SetDatabaseSchemaProviderParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleSetDatabaseSchemaProviderRequest(SetDatabaseSchemaProviderParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).DatabaseSchemaProvider = requestParams.DatabaseSchemaProvider, requestContext);
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri, onlyLoadProperties: true).Properties.DatabaseSchemaProvider = requestParams.DatabaseSchemaProvider, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -365,21 +365,23 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
await RunWithErrorHandling(() =>
|
await RunWithErrorHandling(() =>
|
||||||
{
|
{
|
||||||
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
|
|
||||||
return new GetDatabaseReferencesResult()
|
return new GetDatabaseReferencesResult()
|
||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
ErrorMessage = null,
|
ErrorMessage = null,
|
||||||
SystemDatabaseReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SystemDatabaseReference>().ToArray(),
|
SystemDatabaseReferences = project.DatabaseReferences.OfType<SystemDatabaseReference>().ToArray(),
|
||||||
DacpacReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<DacpacReference>().ToArray(),
|
DacpacReferences = project.DatabaseReferences.OfType<DacpacReference>().ToArray(),
|
||||||
SqlProjectReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<SqlProjectReference>().ToArray(),
|
SqlProjectReferences = project.DatabaseReferences.OfType<SqlProjectReference>().ToArray(),
|
||||||
NugetPackageReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType<NugetPackageReference>().ToArray()
|
NugetPackageReferences = project.DatabaseReferences.OfType<NugetPackageReference>().ToArray()
|
||||||
};
|
};
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleAddSystemDatabaseReferenceRequest(AddSystemDatabaseReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleAddSystemDatabaseReferenceRequest(AddSystemDatabaseReferenceParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).DatabaseReferences.Add(
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri, onlyLoadProperties: true).DatabaseReferences.Add(
|
||||||
new SystemDatabaseReference(
|
new SystemDatabaseReference(
|
||||||
requestParams.SystemDatabase,
|
requestParams.SystemDatabase,
|
||||||
requestParams.SuppressMissingDependencies,
|
requestParams.SuppressMissingDependencies,
|
||||||
@@ -393,7 +395,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
requestParams.Validate();
|
requestParams.Validate();
|
||||||
|
|
||||||
SqlProject project = GetProject(requestParams.ProjectUri!);
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
DacpacReference reference;
|
DacpacReference reference;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
||||||
@@ -426,7 +428,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
requestParams.Validate();
|
requestParams.Validate();
|
||||||
|
|
||||||
SqlProject project = GetProject(requestParams.ProjectUri!);
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
SqlProjectReference reference;
|
SqlProjectReference reference;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
||||||
@@ -463,7 +465,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
requestParams.Validate();
|
requestParams.Validate();
|
||||||
|
|
||||||
SqlProject project = GetProject(requestParams.ProjectUri!);
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
NugetPackageReference reference;
|
NugetPackageReference reference;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
if (!string.IsNullOrWhiteSpace(requestParams.DatabaseLiteral)) // same server, different database via database name literal
|
||||||
@@ -495,7 +497,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
|
|
||||||
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, onlyLoadProperties: true).DatabaseReferences.Delete(requestParams.Name!), requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -510,26 +512,26 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
ErrorMessage = null,
|
ErrorMessage = null,
|
||||||
SqlCmdVariables = GetProject(requestParams.ProjectUri).SqlCmdVariables.ToArray()
|
SqlCmdVariables = GetProject(requestParams.ProjectUri, onlyLoadProperties: true).SqlCmdVariables.ToArray()
|
||||||
};
|
};
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleAddSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleAddSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue)), requestContext);
|
await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri, onlyLoadProperties: true).SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue)), requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleDeleteSqlCmdVariableRequest(DeleteSqlCmdVariableParams requestParams, RequestContext<ResultStatus> 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, onlyLoadProperties: true).SqlCmdVariables.Delete(requestParams.Name), requestContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task HandleUpdateSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
|
internal async Task HandleUpdateSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext<ResultStatus> requestContext)
|
||||||
{
|
{
|
||||||
await RunWithErrorHandling(() =>
|
await RunWithErrorHandling(() =>
|
||||||
{
|
{
|
||||||
SqlProject project = GetProject(requestParams.ProjectUri!);
|
SqlProject project = GetProject(requestParams.ProjectUri, onlyLoadProperties: true);
|
||||||
project.SqlCmdVariables.Delete(requestParams.Name); // idempotent (won't throw if doesn't exist)
|
project.SqlCmdVariables.Delete(requestParams.Name); // idempotent (won't throw if doesn't exist)
|
||||||
project.SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue));
|
project.SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue));
|
||||||
}, requestContext);
|
}, requestContext);
|
||||||
@@ -541,11 +543,12 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
|
|||||||
|
|
||||||
#region Helper methods
|
#region Helper methods
|
||||||
|
|
||||||
private SqlProject GetProject(string projectUri)
|
private SqlProject GetProject(string projectUri, bool onlyLoadProperties = false)
|
||||||
{
|
{
|
||||||
if (!Projects.ContainsKey(projectUri))
|
if (!Projects.ContainsKey(projectUri) // if not already loaded, load according to onlyLoadProperties flag
|
||||||
|
|| (Projects[projectUri].OnlyPropertiesLoaded && !onlyLoadProperties)) // if already loaded, check flag to see if it needs to be reopened as fully-loaded
|
||||||
{
|
{
|
||||||
Projects[projectUri] = SqlProject.OpenProject(projectUri);
|
Projects[projectUri] = SqlProject.OpenProject(projectUri, onlyLoadProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Projects[projectUri];
|
return Projects[projectUri];
|
||||||
|
|||||||
@@ -1031,7 +1031,40 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects
|
|||||||
}, setMock.Object);
|
}, setMock.Object);
|
||||||
|
|
||||||
setMock.AssertSuccess(nameof(service.HandleSetDatabaseSchemaProviderRequest));
|
setMock.AssertSuccess(nameof(service.HandleSetDatabaseSchemaProviderRequest));
|
||||||
Assert.AreEqual("Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider", service.Projects[projectUri].DatabaseSchemaProvider);
|
Assert.AreEqual("Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider", service.Projects[projectUri].Properties.DatabaseSchemaProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestLoadOnlyProperties()
|
||||||
|
{
|
||||||
|
// Verify new project results in full-load
|
||||||
|
SqlProjectsService service = new();
|
||||||
|
string projectUri = await service.CreateSqlProject();
|
||||||
|
Assert.IsFalse(service.Projects[projectUri].OnlyPropertiesLoaded, "Project should be fully-loaded when initially created.");
|
||||||
|
|
||||||
|
// Verify metadata calls only load properties
|
||||||
|
service.Projects.Clear();
|
||||||
|
SqlProjectParams projParams = new SqlProjectParams() { ProjectUri = projectUri };
|
||||||
|
await service.HandleGetProjectPropertiesRequest(projParams, new MockRequest<GetProjectPropertiesResult>().Object);
|
||||||
|
await service.HandleGetSqlCmdVariablesRequest(projParams, new MockRequest<GetSqlCmdVariablesResult>().Object);
|
||||||
|
await service.HandleGetDatabaseReferencesRequest(projParams, new MockRequest<GetDatabaseReferencesResult>().Object);
|
||||||
|
|
||||||
|
Assert.IsTrue(service.Projects[projectUri].OnlyPropertiesLoaded, "Project should be partially-loaded after only property/metadata actions");
|
||||||
|
|
||||||
|
// Verify file call on already-opened project results in full-load
|
||||||
|
MockRequest<GetScriptsResult> scriptsMock = new();
|
||||||
|
await service.HandleGetSqlObjectScriptsRequest(projParams, scriptsMock.Object);
|
||||||
|
|
||||||
|
scriptsMock.AssertSuccess(nameof(service.HandleGetSqlObjectScriptsRequest));
|
||||||
|
Assert.IsFalse(service.Projects[projectUri].OnlyPropertiesLoaded, "Project should be fully-loaded after getting a list of files");
|
||||||
|
|
||||||
|
// Verify file call on unopened project results in full-load
|
||||||
|
service.Projects.Clear();
|
||||||
|
scriptsMock = new();
|
||||||
|
await service.HandleGetPreDeploymentScriptsRequest(projParams, scriptsMock.Object);
|
||||||
|
|
||||||
|
scriptsMock.AssertSuccess(nameof(service.HandleGetSqlObjectScriptsRequest));
|
||||||
|
Assert.IsFalse(service.Projects[projectUri].OnlyPropertiesLoaded, "Project should be fully-loaded when initially opened for a list of files");
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Helpers
|
#region Helpers
|
||||||
|
|||||||
Reference in New Issue
Block a user