diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerSyntaxProvider.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerSyntaxProvider.cs index 7b4feb0a98..9efb97fd6e 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerSyntaxProvider.cs @@ -1,4 +1,5 @@ using System.Data; +using System.Diagnostics.CodeAnalysis; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; diff --git a/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs b/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs index 0642a6171c..f99670d888 100644 --- a/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs +++ b/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs @@ -30,5 +30,5 @@ public class ConnectionStrings set => _connectionString = value.ReplaceDataDirectoryPlaceholder(); } - public string ProviderName { get; set; } = DefaultProviderName; + public string? ProviderName { get; set; } = DefaultProviderName; } diff --git a/src/Umbraco.Core/DistributedLocking/IDistributedLockingMechanismFactory.cs b/src/Umbraco.Core/DistributedLocking/IDistributedLockingMechanismFactory.cs index 1bd1cfe206..f2eb80ade0 100644 --- a/src/Umbraco.Core/DistributedLocking/IDistributedLockingMechanismFactory.cs +++ b/src/Umbraco.Core/DistributedLocking/IDistributedLockingMechanismFactory.cs @@ -5,5 +5,5 @@ namespace Umbraco.Cms.Core.DistributedLocking; /// public interface IDistributedLockingMechanismFactory { - IDistributedLockingMechanism DistributedLockingMechanism { get; } + IDistributedLockingMechanism? DistributedLockingMechanism { get; } } diff --git a/src/Umbraco.Core/Install/Models/DatabaseModel.cs b/src/Umbraco.Core/Install/Models/DatabaseModel.cs index 37cdcb9610..da2f61fce5 100644 --- a/src/Umbraco.Core/Install/Models/DatabaseModel.cs +++ b/src/Umbraco.Core/Install/Models/DatabaseModel.cs @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Core.Install.Models public Guid DatabaseProviderMetadataId { get; set; } [DataMember(Name = "providerName")] - public string ProviderName { get; set; } + public string? ProviderName { get; set; } [DataMember(Name = "server")] public string Server { get; set; } = null!; diff --git a/src/Umbraco.Infrastructure/DistributedLocking/DefaultDistributedLockingMechanismFactory.cs b/src/Umbraco.Infrastructure/DistributedLocking/DefaultDistributedLockingMechanismFactory.cs index 401e399441..2f48a438c0 100644 --- a/src/Umbraco.Infrastructure/DistributedLocking/DefaultDistributedLockingMechanismFactory.cs +++ b/src/Umbraco.Infrastructure/DistributedLocking/DefaultDistributedLockingMechanismFactory.cs @@ -12,7 +12,7 @@ public class DefaultDistributedLockingMechanismFactory : IDistributedLockingMech { private object _lock = new(); private bool _initialized; - private IDistributedLockingMechanism _distributedLockingMechanism; + private IDistributedLockingMechanism? _distributedLockingMechanism; private readonly IOptionsMonitor _globalSettings; private readonly IEnumerable _distributedLockingMechanisms; @@ -25,7 +25,7 @@ public class DefaultDistributedLockingMechanismFactory : IDistributedLockingMech _distributedLockingMechanisms = distributedLockingMechanisms; } - public IDistributedLockingMechanism DistributedLockingMechanism + public IDistributedLockingMechanism? DistributedLockingMechanism { get { @@ -44,7 +44,7 @@ public class DefaultDistributedLockingMechanismFactory : IDistributedLockingMech if (!string.IsNullOrEmpty(configured)) { - IDistributedLockingMechanism value = _distributedLockingMechanisms + IDistributedLockingMechanism? value = _distributedLockingMechanisms .FirstOrDefault(x => x.GetType().FullName?.EndsWith(configured) ?? false); if (value == null) @@ -53,7 +53,7 @@ public class DefaultDistributedLockingMechanismFactory : IDistributedLockingMech } } - IDistributedLockingMechanism defaultMechanism = _distributedLockingMechanisms.FirstOrDefault(x => x.Enabled); + IDistributedLockingMechanism? defaultMechanism = _distributedLockingMechanisms.FirstOrDefault(x => x.Enabled); if (defaultMechanism != null) { return defaultMechanism; diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs b/src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs index 70c05dc2a4..a1c549add8 100644 --- a/src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs +++ b/src/Umbraco.Infrastructure/Logging/Viewer/ExpressionFilter.cs @@ -36,11 +36,11 @@ namespace Umbraco.Cms.Core.Logging.Viewer else // check if it's a valid expression { // If the expression evaluates then make it into a filter - if (SerilogExpression.TryCompile(filterExpression, null, customSerilogFunctions, out CompiledExpression compiled, out var error)) + if (SerilogExpression.TryCompile(filterExpression, null, customSerilogFunctions, out CompiledExpression? compiled, out var error)) { filter = evt => { - LogEventPropertyValue result = compiled(evt); + LogEventPropertyValue? result = compiled(evt); return ExpressionResult.IsTrue(result); }; } @@ -63,12 +63,12 @@ namespace Umbraco.Cms.Core.Logging.Viewer private Func? PerformMessageLikeFilter(string filterExpression) { var filterSearch = $"@Message like '%{SerilogExpression.EscapeLikeExpressionContent(filterExpression)}%'"; - if (SerilogExpression.TryCompile(filterSearch, out CompiledExpression compiled, out var error)) + if (SerilogExpression.TryCompile(filterSearch, out CompiledExpression? compiled, out var error)) { // `compiled` is a function that can be executed against `LogEvent`s: return evt => { - LogEventPropertyValue result = compiled(evt); + LogEventPropertyValue? result = compiled(evt); return ExpressionResult.IsTrue(result); }; } diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/SerilogLegacyNameResolver.cs b/src/Umbraco.Infrastructure/Logging/Viewer/SerilogLegacyNameResolver.cs index 0472a8ea16..8e24f40b6c 100644 --- a/src/Umbraco.Infrastructure/Logging/Viewer/SerilogLegacyNameResolver.cs +++ b/src/Umbraco.Infrastructure/Logging/Viewer/SerilogLegacyNameResolver.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Serilog.Expressions; namespace Umbraco.Cms.Infrastructure.Logging.Viewer @@ -19,7 +20,7 @@ namespace Umbraco.Cms.Infrastructure.Logging.Viewer /// So we can still support the more verbose built in property names such as /// Exception, Level, MessageTemplate etc /// - public override bool TryResolveBuiltInPropertyName(string alias, out string target) + public override bool TryResolveBuiltInPropertyName(string alias, [MaybeNullWhen(false)] out string target) { target = alias switch { diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs index cf06d38672..ac646d1c67 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs @@ -71,6 +71,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install _connectionStrings = connectionStrings; _migrationPlanExecutor = migrationPlanExecutor; _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; + _databaseProviderMetadata = databaseProviderMetadata; } #region Status @@ -92,7 +93,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install /// public bool CanConnect(string? connectionString, string providerName) { - DbProviderFactory factory = _dbProviderFactoryCreator.CreateFactory(providerName); + DbProviderFactory? factory = _dbProviderFactoryCreator.CreateFactory(providerName); return DbConnectionExtensions.IsConnectionAvailable(connectionString, factory); } @@ -133,7 +134,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install public bool ConfigureDatabaseConnection(DatabaseModel databaseSettings, bool isTrialRun) { - IDatabaseProviderMetadata providerMeta; + IDatabaseProviderMetadata? providerMeta; // if the database model is null then we will attempt quick install. if (databaseSettings == null) @@ -145,7 +146,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install databaseSettings = new DatabaseModel { - DatabaseName = providerMeta?.DefaultDatabaseName, + DatabaseName = providerMeta?.DefaultDatabaseName!, }; } else @@ -162,15 +163,15 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Install var connectionString = providerMeta.GenerateConnectionString(databaseSettings); var providerName = databaseSettings.ProviderName ?? providerMeta.ProviderName; - if (providerMeta.RequiresConnectionTest && !CanConnect(connectionString, providerName)) + if (providerMeta.RequiresConnectionTest && !CanConnect(connectionString, providerName!)) { return false; } if (!isTrialRun) { - _configManipulator.SaveConnectionString(connectionString, providerName); - Configure(connectionString, providerName, _globalSettings.CurrentValue.InstallMissingDatabase || providerMeta.ForceCreateDatabase); + _configManipulator.SaveConnectionString(connectionString!, providerName); + Configure(connectionString!, providerName, _globalSettings.CurrentValue.InstallMissingDatabase || providerMeta.ForceCreateDatabase); } return true; diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/Models/PropertyDataDto80.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/Models/PropertyDataDto80.cs index 1755e6c075..69aabd4e21 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/Models/PropertyDataDto80.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_0_0/Models/PropertyDataDto80.cs @@ -126,7 +126,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_8_0_0.Models return Id == other.Id; } - public override bool Equals(object other) + public override bool Equals(object? other) { return !ReferenceEquals(null, other) // other is not null diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs index 3f5a966544..e0f2fb3831 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_8_1_0/ConvertTinyMceAndGridMediaUrlsToLocalLink.cs @@ -51,15 +51,18 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_8_1_0 try { var obj = JsonConvert.DeserializeObject(value); - var allControls = obj.SelectTokens("$.sections..rows..areas..controls"); + var allControls = obj?.SelectTokens("$.sections..rows..areas..controls"); - foreach (var control in allControls.SelectMany(c => c).OfType()) + if (allControls is not null) { - var controlValue = control["value"]; - if (controlValue?.Type == JTokenType.String) + foreach (var control in allControls.SelectMany(c => c).OfType()) { - control["value"] = UpdateMediaUrls(mediaLinkPattern, controlValue.Value(), out var controlChanged); - propertyChanged |= controlChanged; + var controlValue = control["value"]; + if (controlValue?.Type == JTokenType.String) + { + control["value"] = UpdateMediaUrls(mediaLinkPattern, controlValue.Value()!, out var controlChanged); + propertyChanged |= controlChanged; + } } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/ExternalLoginTokenTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/ExternalLoginTokenTable.cs index 851d986c7c..ee089ad89c 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/ExternalLoginTokenTable.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/ExternalLoginTokenTable.cs @@ -53,7 +53,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_0_0 [NullSetting(NullSetting = NullSettings.NotNull)] [Index(IndexTypes.UniqueNonClustered, ForColumns = "loginProvider,userOrMemberKey", Name = "IX_" + TableName + "_LoginProvider")] - public string LoginProvider { get; set; } + public string LoginProvider { get; set; } = null!; /// /// Stores the key the provider uses to lookup the login @@ -63,7 +63,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_0_0 [NullSetting(NullSetting = NullSettings.NotNull)] [Index(IndexTypes.NonClustered, ForColumns = "loginProvider,providerKey", Name = "IX_" + TableName + "_ProviderKey")] - public string ProviderKey { get; set; } + public string ProviderKey { get; set; } = null!; [Column("createDate")] [Constraint(Default = SystemMethods.CurrentDateTime)] @@ -75,7 +75,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_0_0 [Column("userData")] [NullSetting(NullSetting = NullSettings.Null)] [SpecialDbType(SpecialDbTypes.NTEXT)] - public string UserData { get; set; } + public string? UserData { get; set; } } } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/MigrateLogViewerQueriesFromFileToDb.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/MigrateLogViewerQueriesFromFileToDb.cs index 2eeca8804d..365c50b3f8 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/MigrateLogViewerQueriesFromFileToDb.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_0_0/MigrateLogViewerQueriesFromFileToDb.cs @@ -97,7 +97,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_0_0 return; } - Database.InsertBulk(logQueriesInFile); + Database.InsertBulk(logQueriesInFile!); Context.AddPostMigration(); } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_2_0/AddUserGroup2NodeTable.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_2_0/AddUserGroup2NodeTable.cs index 41692825d3..1bb7b71c89 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_2_0/AddUserGroup2NodeTable.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_2_0/AddUserGroup2NodeTable.cs @@ -22,7 +22,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_2_0 var allData = Database.Fetch(); var toInsert = allData.Select(x => new UserGroup2NodeDto() { NodeId = x.NodeId, UserGroupId = x.UserGroupId }).Distinct( new DelegateEqualityComparer( - (x, y) => x.NodeId == y.NodeId && x.UserGroupId == y.UserGroupId, + (x, y) => x?.NodeId == y?.NodeId && x?.UserGroupId == y?.UserGroupId, x => x.NodeId.GetHashCode() + x.UserGroupId.GetHashCode())).ToArray(); Database.InsertBulk(toInsert); } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_3_0/MovePackageXMLToDb.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_3_0/MovePackageXMLToDb.cs index 3d003eb31d..3173e739a9 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_3_0/MovePackageXMLToDb.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_9_3_0/MovePackageXMLToDb.cs @@ -39,7 +39,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_3_0 private void MigrateCreatedPackageFilesToDb() { // Load data from file - IEnumerable packages = _packagesRepository.GetAll(); + IEnumerable packages = _packagesRepository.GetAll().WhereNotNull(); var createdPackageDtos = new List(); foreach (PackageDefinition package in packages) { diff --git a/src/Umbraco.Infrastructure/Persistence/CustomConnectionStringDatabaseProviderMetadata.cs b/src/Umbraco.Infrastructure/Persistence/CustomConnectionStringDatabaseProviderMetadata.cs index c9984d69ea..3797d4a433 100644 --- a/src/Umbraco.Infrastructure/Persistence/CustomConnectionStringDatabaseProviderMetadata.cs +++ b/src/Umbraco.Infrastructure/Persistence/CustomConnectionStringDatabaseProviderMetadata.cs @@ -23,7 +23,7 @@ public class CustomConnectionStringDatabaseProviderMetadata : IDatabaseProviderM public string DefaultDatabaseName => string.Empty; /// - public string ProviderName => null; + public string? ProviderName => null; /// public bool SupportsQuickInstall => false; @@ -35,7 +35,7 @@ public class CustomConnectionStringDatabaseProviderMetadata : IDatabaseProviderM public bool RequiresServer => false; /// - public string ServerPlaceholder => null; + public string? ServerPlaceholder => null; /// public bool RequiresCredentials => false; @@ -50,6 +50,6 @@ public class CustomConnectionStringDatabaseProviderMetadata : IDatabaseProviderM public bool ForceCreateDatabase => false; /// - public string GenerateConnectionString(DatabaseModel databaseModel) + public string? GenerateConnectionString(DatabaseModel databaseModel) => databaseModel.ConnectionString; } diff --git a/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs b/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs index 41baa9c4f8..c766c50d69 100644 --- a/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs +++ b/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs @@ -34,7 +34,7 @@ public interface IDatabaseProviderMetadata /// Gets the database factory provider name. /// [DataMember(Name = "providerName")] - string ProviderName { get; } + string? ProviderName { get; } /// /// Gets a value indicating whether can be used for one click install. @@ -58,7 +58,7 @@ public interface IDatabaseProviderMetadata /// Gets a value used as input placeholder for server/hostnmae field. /// [DataMember(Name = "serverPlaceholder")] - string ServerPlaceholder { get; } + string? ServerPlaceholder { get; } /// /// Gets a value indicating whether a username and password are required (in general) to connect to the database @@ -86,5 +86,5 @@ public interface IDatabaseProviderMetadata /// /// Creates a connection string for this provider. /// - string GenerateConnectionString(DatabaseModel databaseModel); + string? GenerateConnectionString(DatabaseModel databaseModel); } diff --git a/src/Umbraco.Infrastructure/Persistence/NPocoSqlExtensions.cs b/src/Umbraco.Infrastructure/Persistence/NPocoSqlExtensions.cs index 2d2df7fe4d..f7de532a83 100644 --- a/src/Umbraco.Infrastructure/Persistence/NPocoSqlExtensions.cs +++ b/src/Umbraco.Infrastructure/Persistence/NPocoSqlExtensions.cs @@ -75,20 +75,20 @@ namespace Umbraco.Extensions return WhereIn(sql, field, values, false, null); } - public static Sql WhereIn(this Sql sql, Expression> field, Sql values, string tableAlias) + public static Sql WhereIn(this Sql sql, Expression> field, Sql? values, string tableAlias) { return sql.WhereIn(field, values, false, tableAlias); } - public static Sql WhereLike(this Sql sql, Expression> fieldSelector, Sql valuesSql) + public static Sql WhereLike(this Sql sql, Expression> fieldSelector, Sql? valuesSql) { var fieldName = sql.SqlContext.SqlSyntax.GetFieldName(fieldSelector); - sql.Where(fieldName + " LIKE (" + valuesSql.SQL + ")", valuesSql.Arguments); + sql.Where(fieldName + " LIKE (" + valuesSql?.SQL + ")", valuesSql?.Arguments); return sql; } - public static Sql WhereLike(this Sql sql, Expression> fieldSelector, string likeValue) + public static Sql WhereLike(this Sql sql, Expression> fieldSelector, string likeValue) { var fieldName = sql.SqlContext.SqlSyntax.GetFieldName(fieldSelector); sql.Where(fieldName + " LIKE ('" + likeValue + "')"); @@ -153,7 +153,7 @@ namespace Umbraco.Extensions return WhereIn(sql, fieldSelector, valuesSql, not, null); } - private static Sql WhereIn(this Sql sql, Expression> fieldSelector, Sql? valuesSql, bool not, string tableAlias) + private static Sql WhereIn(this Sql sql, Expression> fieldSelector, Sql? valuesSql, bool not, string? tableAlias) { var fieldName = sql.SqlContext.SqlSyntax.GetFieldName(fieldSelector, tableAlias); sql.Where(fieldName + (not ? " NOT" : "") +" IN (" + valuesSql?.SQL + ")", valuesSql?.Arguments); @@ -916,7 +916,7 @@ namespace Umbraco.Extensions /// /// Gets fields for a Dto. /// - public static string ColumnsForInsert(this Sql sql, params Expression>[] fields) + public static string ColumnsForInsert(this Sql sql, params Expression>[]? fields) { if (sql == null) throw new ArgumentNullException(nameof(sql)); return string.Join(", ", sql.GetColumns(columnExpressions: fields, withAlias: false, forInsert: true)); @@ -1113,7 +1113,7 @@ namespace Umbraco.Extensions } return queryColumns - .Select(x => sql.SqlContext.SqlSyntax.GetColumn(sql.SqlContext.DatabaseType, tableName, x.Value.ColumnName, GetAlias(x.Value), referenceName, forInsert: forInsert)) + .Select(x => sql.SqlContext.SqlSyntax.GetColumn(sql.SqlContext.DatabaseType, tableName, x.Value.ColumnName, GetAlias(x.Value)!, referenceName, forInsert: forInsert)) .ToArray(); } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs index dde11ead71..6aeb967361 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs @@ -469,27 +469,27 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement public Guid ChildNodeKey { get; set; } [Column(Name = "nodeName")] - public string ChildNodeName { get; set; } + public string? ChildNodeName { get; set; } [Column(Name = "nodeObjectType")] public Guid ChildNodeObjectType { get; set; } [Column(Name = "contentTypeIcon")] - public string ChildContentTypeIcon { get; set; } + public string? ChildContentTypeIcon { get; set; } [Column(Name = "contentTypeAlias")] - public string ChildContentTypeAlias { get; set; } + public string? ChildContentTypeAlias { get; set; } [Column(Name = "contentTypeName")] - public string ChildContentTypeName { get; set; } + public string? ChildContentTypeName { get; set; } [Column(Name = "relationTypeName")] - public string RelationTypeName { get; set; } + public string? RelationTypeName { get; set; } [Column(Name = "relationTypeAlias")] - public string RelationTypeAlias { get; set; } + public string? RelationTypeAlias { get; set; } [Column(Name = "relationTypeIsDependency")] public bool RelationTypeIsDependency { get; set; } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TrackedReferencesRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TrackedReferencesRepository.cs index d92f0903f1..ae1939973f 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TrackedReferencesRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TrackedReferencesRepository.cs @@ -24,7 +24,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement public IEnumerable GetPagedItemsWithRelations(int[] ids, long pageIndex, int pageSize, bool filterMustBeIsDependency, out long totalRecords) { - var sql = _scopeAccessor.AmbientScope.Database.SqlContext.Sql().Select( + var sql = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql().Select( "[pn].[id] as nodeId", "[pn].[uniqueId] as nodeKey", "[pn].[text] as nodeName", @@ -46,43 +46,43 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement if (ids.Any()) { - sql = sql.Where(x => ids.Contains(x.NodeId), "pn"); + sql = sql?.Where(x => ids.Contains(x.NodeId), "pn"); } if (filterMustBeIsDependency) { - sql = sql.Where(rt => rt.IsDependency, "umbracoRelationType"); + sql = sql?.Where(rt => rt.IsDependency, "umbracoRelationType"); } // Ordering is required for paging - sql = sql.OrderBy(x => x.Alias); + sql = sql?.OrderBy(x => x.Alias); - var pagedResult = _scopeAccessor.AmbientScope.Database.Page(pageIndex + 1, pageSize, sql); - totalRecords = Convert.ToInt32(pagedResult.TotalItems); + var pagedResult = _scopeAccessor.AmbientScope?.Database.Page(pageIndex + 1, pageSize, sql); + totalRecords = Convert.ToInt32(pagedResult?.TotalItems); - return pagedResult.Items.Select(MapDtoToEntity); + return pagedResult?.Items.Select(MapDtoToEntity) ?? Enumerable.Empty(); } public IEnumerable GetPagedDescendantsInReferences(int parentId, long pageIndex, int pageSize, bool filterMustBeIsDependency, out long totalRecords) { - var syntax = _scopeAccessor.AmbientScope.Database.SqlContext.SqlSyntax; + var syntax = _scopeAccessor.AmbientScope?.Database.SqlContext.SqlSyntax; // Gets the path of the parent with ",%" added - var subsubQuery = _scopeAccessor.AmbientScope.Database.SqlContext.Sql() - .Select(syntax.GetConcat("[node].[path]", "',%'")) + var subsubQuery = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql() + .Select(syntax?.GetConcat("[node].[path]", "',%'")) .From("node") .Where(x => x.NodeId == parentId, "node"); // Gets the descendants of the parent node - Sql subQuery = _scopeAccessor.AmbientScope.Database.SqlContext.Sql() + Sql? subQuery = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql() .Select(x => x.NodeId) .From() .WhereLike(x => x.Path, subsubQuery); // Get all relations where parent is in the sub query - var sql = _scopeAccessor.AmbientScope.Database.SqlContext.Sql().Select( + var sql = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql().Select( "[pn].[id] as nodeId", "[pn].[uniqueId] as nodeKey", "[pn].[text] as nodeName", @@ -101,23 +101,23 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement .LeftJoin("c").On((left, right) => left.NodeId == right.NodeId, aliasLeft:"pn", aliasRight:"c") .LeftJoin("ct").On((left, right) => left.ContentTypeId == right.NodeId, aliasLeft:"c", aliasRight:"ct") .LeftJoin("ctn").On((left, right) => left.NodeId == right.NodeId, aliasLeft:"ct", aliasRight:"ctn") - .WhereIn((System.Linq.Expressions.Expression>)(x => x.NodeId), subQuery, "pn"); + .WhereIn((System.Linq.Expressions.Expression>)(x => x.NodeId), subQuery, "pn"); if (filterMustBeIsDependency) { - sql = sql.Where(rt => rt.IsDependency, "umbracoRelationType"); + sql = sql?.Where(rt => rt.IsDependency, "umbracoRelationType"); } // Ordering is required for paging - sql = sql.OrderBy(x => x.Alias); + sql = sql?.OrderBy(x => x.Alias); - var pagedResult = _scopeAccessor.AmbientScope.Database.Page(pageIndex + 1, pageSize, sql); - totalRecords = Convert.ToInt32(pagedResult.TotalItems); + var pagedResult = _scopeAccessor.AmbientScope?.Database.Page(pageIndex + 1, pageSize, sql); + totalRecords = Convert.ToInt32(pagedResult?.TotalItems); - return pagedResult.Items.Select(MapDtoToEntity); + return pagedResult?.Items.Select(MapDtoToEntity) ?? Enumerable.Empty(); } public IEnumerable GetPagedRelationsForItems(int[] ids, long pageIndex, int pageSize, bool filterMustBeIsDependency, out long totalRecords) { - var sql = _scopeAccessor.AmbientScope.Database.SqlContext.Sql().Select( + var sql = _scopeAccessor.AmbientScope?.Database.SqlContext.Sql().Select( "[cn].[id] as nodeId", "[cn].[uniqueId] as nodeKey", "[cn].[text] as nodeName", @@ -139,21 +139,21 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement if (ids.Any()) { - sql = sql.Where(x => ids.Contains(x.NodeId), "pn"); + sql = sql?.Where(x => ids.Contains(x.NodeId), "pn"); } if (filterMustBeIsDependency) { - sql = sql.Where(rt => rt.IsDependency, "umbracoRelationType"); + sql = sql?.Where(rt => rt.IsDependency, "umbracoRelationType"); } // Ordering is required for paging - sql = sql.OrderBy(x => x.Alias); + sql = sql?.OrderBy(x => x.Alias); - var pagedResult = _scopeAccessor.AmbientScope.Database.Page(pageIndex + 1, pageSize, sql); - totalRecords = Convert.ToInt32(pagedResult.TotalItems); + var pagedResult = _scopeAccessor.AmbientScope?.Database.Page(pageIndex + 1, pageSize, sql); + totalRecords = Convert.ToInt32(pagedResult?.TotalItems); - return pagedResult.Items.Select(MapDtoToEntity); + return pagedResult?.Items.Select(MapDtoToEntity) ?? Enumerable.Empty(); } private RelationItem MapDtoToEntity(RelationItemDto dto) diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 316758a6f8..aeb0f51c4c 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -16,7 +16,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax /// public interface ISqlSyntaxProvider { - DatabaseType GetUpdatedDatabaseType(DatabaseType current, string connectionString); + DatabaseType GetUpdatedDatabaseType(DatabaseType current, string? connectionString); string ProviderName { get; } @@ -27,7 +27,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax string GetStringColumnWildcardComparison(string column, int paramIndex, TextColumnType columnType); string GetConcat(params string[] args); - string GetColumn(DatabaseType dbType, string tableName, string columnName, string columnAlias, string referenceName = null, bool forInsert = false); + string GetColumn(DatabaseType dbType, string tableName, string columnName, string columnAlias, string? referenceName = null, bool forInsert = false); string GetQuotedTableName(string? tableName); string GetQuotedColumnName(string? columnName); @@ -140,7 +140,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax bool TryGetDefaultConstraint(IDatabase db, string? tableName, string columnName, [MaybeNullWhen(false)] out string constraintName); - string GetFieldNameForUpdate(Expression> fieldSelector, string tableAlias = null); + string GetFieldNameForUpdate(Expression> fieldSelector, string? tableAlias = null); /// /// Appends the relevant ForUpdate hint. @@ -158,8 +158,8 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax Sql.SqlJoinClause LeftJoinWithNestedJoin( Sql sql, Func, Sql> nestedJoin, - string alias = null); + string? alias = null); - IDictionary ScalarMappers { get; } + IDictionary? ScalarMappers { get; } } } diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index da97287493..b2bbd4ac5b 100644 --- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -139,7 +139,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax return dbTypeMap.Create(); } - public virtual DatabaseType GetUpdatedDatabaseType(DatabaseType current, string connectionString) => current; + public virtual DatabaseType GetUpdatedDatabaseType(DatabaseType current, string? connectionString) => current; public abstract string ProviderName { get; } @@ -222,7 +222,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax public virtual string GetSpecialDbType(SpecialDbType dbType, int customSize) => $"{GetSpecialDbType(dbType)}({customSize})"; - public virtual string GetColumn(DatabaseType dbType, string tableName, string columnName, string columnAlias, string referenceName = null, bool forInsert = false) + public virtual string GetColumn(DatabaseType dbType, string tableName, string columnName, string columnAlias, string? referenceName = null, bool forInsert = false) { tableName = GetQuotedTableName(tableName); columnName = GetQuotedColumnName(columnName); @@ -263,16 +263,16 @@ namespace Umbraco.Cms.Infrastructure.Persistence.SqlSyntax public abstract bool TryGetDefaultConstraint(IDatabase db, string? tableName, string columnName, [MaybeNullWhen(false)] out string constraintName); - public virtual string GetFieldNameForUpdate(Expression> fieldSelector, string tableAlias = null) => this.GetFieldName(fieldSelector, tableAlias); + public virtual string GetFieldNameForUpdate(Expression> fieldSelector, string? tableAlias = null) => this.GetFieldName(fieldSelector, tableAlias); public virtual Sql InsertForUpdateHint(Sql sql) => sql; public virtual Sql AppendForUpdateHint(Sql sql) => sql; - public abstract Sql.SqlJoinClause LeftJoinWithNestedJoin(Sql sql, Func, Sql> nestedJoin, string alias = null); + public abstract Sql.SqlJoinClause LeftJoinWithNestedJoin(Sql sql, Func, Sql> nestedJoin, string? alias = null); - public virtual IDictionary ScalarMappers => null; + public virtual IDictionary? ScalarMappers => null; public virtual bool DoesTableExist(IDatabase db, string tableName) => GetTablesInSchema(db).Contains(tableName); diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 4dd0c20aed..83ab603a35 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -342,7 +342,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence return base.ExecuteScalar(sql, commandType, args); } - if (!SqlContext.SqlSyntax.ScalarMappers.TryGetValue(typeof(T), out IScalarMapper mapper)) + if (!SqlContext.SqlSyntax.ScalarMappers.TryGetValue(typeof(T), out IScalarMapper? mapper)) { return base.ExecuteScalar(sql, commandType, args); } diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs index 137f4ddb62..72daab4646 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs @@ -51,7 +51,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence private bool _upgrading; private bool _initialized; - private ConnectionStrings _umbracoConnectionString; + private ConnectionStrings? _umbracoConnectionString; private DbProviderFactory? _dbProviderFactory = null; @@ -239,7 +239,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence cfg.UsingDatabase(CreateDatabaseInstance) // creating UmbracoDatabase instances .WithFluentConfig(config); // with proper configuration - foreach (IProviderSpecificInterceptor interceptor in _dbProviderFactoryCreator.GetProviderSpecificInterceptors(ProviderName)) + foreach (IProviderSpecificInterceptor interceptor in _dbProviderFactoryCreator.GetProviderSpecificInterceptors(ProviderName!)) { cfg.WithInterceptor(interceptor); } @@ -274,6 +274,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence { return null; } + return new UmbracoDatabase( ConnectionString, SqlContext, @@ -282,6 +283,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence _bulkSqlInsertProvider, _databaseSchemaCreatorFactory, _pocoMappers); + } protected override void DisposeResources() { diff --git a/src/Umbraco.Infrastructure/Runtime/FileSystemMainDomLock.cs b/src/Umbraco.Infrastructure/Runtime/FileSystemMainDomLock.cs index c4cbcef588..37e962a222 100644 --- a/src/Umbraco.Infrastructure/Runtime/FileSystemMainDomLock.cs +++ b/src/Umbraco.Infrastructure/Runtime/FileSystemMainDomLock.cs @@ -19,8 +19,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime private readonly string _lockFilePath; private readonly string _releaseSignalFilePath; - private FileStream _lockFileStream; - private Task _listenForReleaseSignalFileTask; + private FileStream? _lockFileStream; + private Task? _listenForReleaseSignalFileTask; public FileSystemMainDomLock( ILogger logger, diff --git a/src/Umbraco.Infrastructure/Scoping/Scope.cs b/src/Umbraco.Infrastructure/Scoping/Scope.cs index d7a67f1db8..008556225b 100644 --- a/src/Umbraco.Infrastructure/Scoping/Scope.cs +++ b/src/Umbraco.Infrastructure/Scoping/Scope.cs @@ -1083,7 +1083,7 @@ namespace Umbraco.Cms.Core.Scoping Guid instanceId, ref Dictionary>? locks, ref HashSet? locksSet, - Action obtainLock, + Action obtainLock, TimeSpan? timeout, int lockId) {