mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-13 17:23:02 -05:00
Fix schema level search and refactor search code for user management (#2084)
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user