Fix schema level search and refactor search code for user management (#2084)

This commit is contained in:
Hai Cao
2023-06-02 10:59:32 -07:00
committed by GitHub
parent 4e108349cd
commit 37469dcbbd
2 changed files with 48 additions and 17 deletions

View File

@@ -12,6 +12,8 @@ using Microsoft.SqlTools.ServiceLayer.ObjectManagement.Contracts;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using Microsoft.SqlTools.ServiceLayer.Management; using Microsoft.SqlTools.ServiceLayer.Management;
using System.Linq;
using Microsoft.SqlTools.ServiceLayer.ObjectManagement.PermissionsData;
namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
{ {
@@ -131,6 +133,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true); CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true);
List<SearchResultItem> res = new List<SearchResultItem>(); List<SearchResultItem> res = new List<SearchResultItem>();
var schemaTypes = SecurableUtils.GetSchemaTypes(dataContainer.Server).Select(Securable.GetSearchableObjectType).ToHashSet();
foreach (string type in requestParams.ObjectTypes) foreach (string type in requestParams.ObjectTypes)
{ {
@@ -142,31 +145,44 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
continue; continue;
} }
SearchableObjectTypeDescription desc = SearchableObjectTypeDescription.GetDescription(searchableObjectType); // only schema-Scoped securableTypes support schema level search
if (!string.IsNullOrEmpty(requestParams.Schema) && !schemaTypes.Contains(searchableObjectType))
if (requestParams.SearchText != null)
{ {
if (desc.IsDatabaseObject) continue;
}
SearchableObjectTypeDescription desc = SearchableObjectTypeDescription.GetDescription(searchableObjectType);
if (desc.IsDatabaseObject)
{
if (!string.IsNullOrEmpty(requestParams.Schema))
{ {
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, context.Parameters.Database, requestParams.SearchText, false, true); SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, context.Parameters.Database, requestParams.SearchText ?? string.Empty, false, requestParams.Schema, true, true);
}
else
{
if (!string.IsNullOrEmpty(requestParams.SearchText))
{
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, context.Parameters.Database, requestParams.SearchText, false, true);
}
else
{
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, context.Parameters.Database, true);
}
}
}
else
{
// server object
if (string.IsNullOrEmpty(requestParams.SearchText))
{
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, true);
} }
else else
{ {
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, requestParams.SearchText, false, true); SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, requestParams.SearchText, false, true);
} }
} }
else
{
if (desc.IsDatabaseObject)
{
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, context.Parameters.Database, true);
}
else
{
SearchableObject.Search(result, searchableObjectType, dataContainer.ConnectionInfo, true);
}
}
foreach (SearchableObject obj in result) foreach (SearchableObject obj in result)
{ {

View File

@@ -582,5 +582,20 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
} }
} }
} }
/// <summary>
/// The list of Schema-Scoped SecurableTypes
/// </summary>
internal static IEnumerable<SecurableType> GetSchemaTypes(Server server)
{
return Enum.GetValues(typeof(SecurableType))
.Cast<SecurableType>()
.Where(
t =>
t.IsValidSchemaBoundSecurable(
new ServerVersion(server.ServerVersion.Major, server.ServerVersion.Minor, server.ServerVersion.BuildNumber),
server.DatabaseEngineEdition,
server.DatabaseEngineType));
}
} }
} }