Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs
kjac e30a87d1fd Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	Directory.Build.props
#	build/azure-pipelines.yml
#	src/Umbraco.Cms.Api.Common/DependencyInjection/UmbracoBuilderAuthExtensions.cs
#	src/Umbraco.Cms.Api.Common/OpenApi/SwaggerRouteTemplatePipelineFilter.cs
#	src/Umbraco.Cms.Api.Common/Security/Paths.cs
#	src/Umbraco.Cms.Api.Delivery/Controllers/Security/MemberController.cs
#	src/Umbraco.Cms.Api.Delivery/DependencyInjection/UmbracoBuilderExtensions.cs
#	src/Umbraco.Cms.Api.Delivery/Handlers/InitializeMemberApplicationNotificationHandler.cs
#	src/Umbraco.Cms.Api.Delivery/Handlers/RevokeMemberAuthenticationTokensNotificationHandler.cs
#	src/Umbraco.Cms.Api.Delivery/Security/MemberApplicationManager.cs
#	src/Umbraco.Cms.Api.Delivery/Services/RequestMemberAccessService.cs
#	src/Umbraco.Core/Constants-OAuthClaims.cs
#	src/Umbraco.Core/Constants-OAuthClientIds.cs
#	src/Umbraco.Core/DeliveryApi/IApiContentQueryProvider.cs
#	src/Umbraco.Core/DeliveryApi/IApiContentQueryService.cs
#	src/Umbraco.Core/DeliveryApi/IRequestMemberAccessService.cs
#	src/Umbraco.Core/DeliveryApi/NoopRequestMemberAccessService.cs
#	src/Umbraco.Core/Models/DeliveryApi/ProtectedAccess.cs
#	src/Umbraco.Core/Services/ITagService.cs
#	src/Umbraco.Core/Services/UserService.cs
#	src/Umbraco.Infrastructure/Security/IMemberApplicationManager.cs
#	src/Umbraco.Infrastructure/Security/OpenIdDictApplicationManagerBase.cs
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/HelpPanel/systemInformation.spec.ts
#	version.json
2023-10-23 19:03:13 +02:00

85 lines
2.7 KiB
C#

using NPoco;
using Umbraco.Cms.Core.Persistence;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax;
using Umbraco.Cms.Infrastructure.Runtime;
using Umbraco.Extensions;
namespace Umbraco.Cms.Infrastructure.Persistence;
internal static class UmbracoDatabaseExtensions
{
public static UmbracoDatabase AsUmbracoDatabase(this IUmbracoDatabase database)
{
if (database is not UmbracoDatabase asDatabase)
{
throw new Exception("oops: database.");
}
return asDatabase;
}
/// <summary>
/// Gets a dictionary of key/values directly from the database, no scope, nothing.
/// </summary>
/// <remarks>Used by <see cref="RuntimeState" /> to determine the runtime state.</remarks>
public static IReadOnlyDictionary<string, string?>? GetFromKeyValueTable(
this IUmbracoDatabase? database,
string keyPrefix)
{
if (database is null)
{
return null;
}
// create the wildcard where clause
ISqlSyntaxProvider sqlSyntax = database.SqlContext.SqlSyntax;
var whereParam = sqlSyntax.GetStringColumnWildcardComparison(
sqlSyntax.GetQuotedColumnName("key"),
0,
TextColumnType.NVarchar);
Sql<ISqlContext>? sql = database.SqlContext.Sql()
.Select<KeyValueDto>()
.From<KeyValueDto>()
.Where(whereParam, keyPrefix + sqlSyntax.GetWildcardPlaceholder());
return database.Fetch<KeyValueDto>(sql)
.ToDictionary(x => x.Key, x => x.Value);
}
/// <summary>
/// Returns true if the database contains the specified table
/// </summary>
/// <param name="database"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public static bool HasTable(this IUmbracoDatabase database, string tableName)
{
try
{
return database.SqlContext.SqlSyntax.GetTablesInSchema(database)
.Any(table => table.InvariantEquals(tableName));
}
catch (Exception)
{
return false; // will occur if the database cannot connect
}
}
/// <summary>
/// Returns true if the database contains no tables
/// </summary>
/// <param name="database"></param>
/// <returns></returns>
public static bool IsDatabaseEmpty(this IUmbracoDatabase database)
=> database.SqlContext.SqlSyntax.GetTablesInSchema(database).Any() == false;
public static long Count(this IUmbracoDatabase database, Sql sql)
{
var query = new Sql().Select("COUNT(*)").From().Append("(").Append(sql).Append(")");
return database.ExecuteScalar<long>(query);
}
}