Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove DbConfig and new constructors on DbContextBase and refactor Migrations #1345

Merged
merged 1 commit into from
May 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Oqtane.Client/Modules/Admin/Sites/Add.razor
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
@inject IInstallationService InstallationService
@inject IDatabaseService DatabaseService
@inject IStringLocalizer<Add> Localizer
@inject IEnumerable<IOqtaneDatabase> Databases

@if (_tenants == null)
{
Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Databases/Interfaces/IMultiDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace Oqtane.Repository.Databases.Interfaces
{
public interface IMultiDatabase
{
public IEnumerable<IOqtaneDatabase> Databases { get; }
public IOqtaneDatabase ActiveDatabase { get; }
}
}
11 changes: 0 additions & 11 deletions Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,5 @@ public static DbContextOptionsBuilder UseOqtaneDatabase([NotNull] this DbContext

return optionsBuilder;
}

public static DbContextOptionsBuilder UseOqtaneDatabase([NotNull] this DbContextOptionsBuilder optionsBuilder, string databaseType, string connectionString)
{
var type = Type.GetType(databaseType);
var database = Activator.CreateInstance(type) as IOqtaneDatabase;

database.UseDatabase(optionsBuilder, connectionString);

return optionsBuilder;
}

}
}
11 changes: 0 additions & 11 deletions Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,6 @@ private static IServiceCollection AddOqtaneServices(this IServiceCollection serv
}
}

// dynamically register database providers
var databaseTypes = assembly.GetInterfaces<IOqtaneDatabase>();
foreach (var databaseType in databaseTypes)
{
if (databaseType.AssemblyQualifiedName != null)
{
var serviceType = Type.GetType("Oqtane.Interfaces.IOqtaneDatabase, Oqtane.Shared");
services.AddScoped(serviceType ?? databaseType, databaseType);
}
}

// dynamically register hosted services
var serviceTypes = assembly.GetTypes(hostedServiceType);
foreach (var serviceType in serviceTypes)
Expand Down
65 changes: 31 additions & 34 deletions Oqtane.Server/Infrastructure/DatabaseManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public class DatabaseManager : IDatabaseManager
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IMemoryCache _cache;

private IOqtaneDatabase _database;

public DatabaseManager(IConfigurationRoot config, IServiceScopeFactory serviceScopeFactory, IMemoryCache cache)
{
_config = config;
Expand Down Expand Up @@ -185,18 +187,12 @@ private Installation CreateDatabase(InstallConfig install)
var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString();
if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory ?? String.Empty);

var connectionString = NormalizeConnectionString(install.ConnectionString);
var databaseType = install.DatabaseType;
using (var scope = _serviceScopeFactory.CreateScope())
var dbOptions = new DbContextOptionsBuilder().UseOqtaneDatabase(install.Database, NormalizeConnectionString(install.ConnectionString)).Options;
using (var dbc = new DbContext(dbOptions))
{
var databases = scope.ServiceProvider.GetServices<IOqtaneDatabase>();

using (var dbc = new DbContext(new DbContextOptionsBuilder().UseOqtaneDatabase(databases.Single(d => d.TypeName == databaseType), connectionString).Options))
{
// create empty database if it does not exist
dbc.Database.EnsureCreated();
result.Success = true;
}
// create empty database if it does not exist
dbc.Database.EnsureCreated();
result.Success = true;
}
}
catch (Exception ex)
Expand All @@ -220,16 +216,16 @@ private Installation MigrateMaster(InstallConfig install)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var databases = scope.ServiceProvider.GetServices<IOqtaneDatabase>();
var sql = scope.ServiceProvider.GetRequiredService<ISqlRepository>();

var installation = IsInstalled();
try
{
var dbConfig = new DbConfig(null, null, databases) {ConnectionString = install.ConnectionString, DatabaseType = install.DatabaseType};
UpdateConnectionString(install.ConnectionString);
UpdateDatabaseType(install.DatabaseType);

using (var masterDbContext = new MasterDBContext(new DbContextOptions<MasterDBContext>(), dbConfig))
using (var masterDbContext = new MasterDBContext(new DbContextOptions<MasterDBContext>(), null, _config))
{
var installation = IsInstalled();
if (installation.Success && (install.DatabaseType == "SqlServer" || install.DatabaseType == "LocalDB"))
{
UpgradeSqlServer(sql, install.ConnectionString, install.DatabaseType, true);
Expand All @@ -244,10 +240,10 @@ private Installation MigrateMaster(InstallConfig install)
result.Message = ex.Message;
}

if (result.Success)
if (!result.Success)
{
UpdateConnectionString(install.ConnectionString);
UpdateDatabaseType(install.DatabaseType);
UpdateConnectionString(String.Empty);
UpdateDatabaseType(String.Empty);
}
}
}
Expand All @@ -265,11 +261,7 @@ private Installation CreateTenant(InstallConfig install)

if (!string.IsNullOrEmpty(install.TenantName) && !string.IsNullOrEmpty(install.Aliases))
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var databases = scope.ServiceProvider.GetServices<IOqtaneDatabase>();

using (var db = GetInstallationContext(databases))
using (var db = GetInstallationContext())
{
Tenant tenant;
if (install.IsNewTenant)
Expand Down Expand Up @@ -315,7 +307,6 @@ private Installation CreateTenant(InstallConfig install)

_cache.Remove("aliases");
}
}
}

result.Success = true;
Expand All @@ -332,19 +323,19 @@ private Installation MigrateTenants(InstallConfig install)
using (var scope = _serviceScopeFactory.CreateScope())
{
var upgrades = scope.ServiceProvider.GetRequiredService<IUpgradeManager>();
var databases = scope.ServiceProvider.GetServices<IOqtaneDatabase>();
var sql = scope.ServiceProvider.GetRequiredService<ISqlRepository>();
var tenantManager = scope.ServiceProvider.GetRequiredService<ITenantManager>();

using (var db = GetInstallationContext(databases))
using (var db = GetInstallationContext())
{
foreach (var tenant in db.Tenant.ToList())
{
tenantManager.SetTenant(tenant.TenantId);
try
{
var dbConfig = new DbConfig(null, null, databases) {ConnectionString = tenant.DBConnectionString, DatabaseType = tenant.DBType};
using (var tenantDbContext = new TenantDBContext(dbConfig, null))
using (var tenantDbContext = new TenantDBContext(tenantManager, null))
{
if (dbConfig.DatabaseType == "SqlServer" || dbConfig.DatabaseType == "LocalDB")
if (install.DatabaseType == "SqlServer" || install.DatabaseType == "LocalDB")
{
UpgradeSqlServer(sql, tenant.DBConnectionString, tenant.DBType, false);
}
Expand Down Expand Up @@ -393,7 +384,6 @@ private Installation MigrateModules(InstallConfig install)
{
var moduleDefinitions = scope.ServiceProvider.GetRequiredService<IModuleDefinitionRepository>();
var sql = scope.ServiceProvider.GetRequiredService<ISqlRepository>();
var databases = scope.ServiceProvider.GetServices<IOqtaneDatabase>();

foreach (var moduleDefinition in moduleDefinitions.GetModuleDefinitions())
{
Expand All @@ -403,7 +393,7 @@ private Installation MigrateModules(InstallConfig install)
if (moduleType != null)
{
var versions = moduleDefinition.ReleaseVersions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
using (var db = GetInstallationContext(databases))
using (var db = GetInstallationContext())
{
foreach (var tenant in db.Tenant.ToList())
{
Expand Down Expand Up @@ -591,12 +581,19 @@ private string DenormalizeConnectionString(string connectionString)
return connectionString;
}

private InstallationContext GetInstallationContext(IEnumerable<IOqtaneDatabase> databases)
private InstallationContext GetInstallationContext()
{
var connectionString = _config.GetConnectionString(SettingKeys.ConnectionStringKey);
var databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey];
var connectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey));
IOqtaneDatabase database = null;

if (!String.IsNullOrEmpty(databaseType))
{
var type = Type.GetType(databaseType);
database = Activator.CreateInstance(type) as IOqtaneDatabase;
}

return new InstallationContext(databases.Single(d => d.TypeName == databaseType), connectionString);
return new InstallationContext(database, connectionString);
}

private string GetInstallationConfig(string key, string defaultValue)
Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Migrations/01000000_InitializeMaster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Master.01.00.00.00")]
public class InitializeMaster : MultiDatabaseMigration
{
public InitializeMaster(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public InitializeMaster(IOqtaneDatabase database) : base(database)
{
}

Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Migrations/01000000_InitializeTenant.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.01.00.00.00")]
public class InitializeTenant : MultiDatabaseMigration
{
public InitializeTenant(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public InitializeTenant(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Master.01.00.01.00")]
public class AddAdditionalIndexesInMaster : MultiDatabaseMigration
{
public AddAdditionalIndexesInMaster(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddAdditionalIndexesInMaster(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.01.00.01.00")]
public class AddAdditionalIndexesInTenant : MultiDatabaseMigration
{
public AddAdditionalIndexesInTenant(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddAdditionalIndexesInTenant(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.01.00.01.01")]
public class AddAdditionColumnToNotifications : MultiDatabaseMigration
{
public AddAdditionColumnToNotifications(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddAdditionColumnToNotifications(IOqtaneDatabase database) : base(database)
{
}

Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Migrations/01000201_DropColumnFromPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.01.00.02.01")]
public class DropColumnFromPage : MultiDatabaseMigration
{
public DropColumnFromPage(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public DropColumnFromPage(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.00.01")]
public class AddColumnToProfileAndUpdatePage : MultiDatabaseMigration
{
public AddColumnToProfileAndUpdatePage(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddColumnToProfileAndUpdatePage(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.01.01")]
public class UpdateIconColumnInPage : MultiDatabaseMigration
{
public UpdateIconColumnInPage(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public UpdateIconColumnInPage(IOqtaneDatabase database) : base(database)
{
}

Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Migrations/02000102_AddLanguageTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.01.02")]
public class AddLanguageTable : MultiDatabaseMigration
{
public AddLanguageTable(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddLanguageTable(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.01.03")]
public class UpdatePageAndAddColumnToSite : MultiDatabaseMigration
{
public UpdatePageAndAddColumnToSite(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public UpdatePageAndAddColumnToSite(IOqtaneDatabase database) : base(database)
{
}

Expand Down
2 changes: 1 addition & 1 deletion Oqtane.Server/Migrations/02000201_AddSiteGuidToSite.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Oqtane.Migrations

public class AddSiteGuidToSite : MultiDatabaseMigration
{
public AddSiteGuidToSite(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddSiteGuidToSite(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.02.02")]
public class UpdateDefaultContainerTypeInSitePage : MultiDatabaseMigration
{
public UpdateDefaultContainerTypeInSitePage(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public UpdateDefaultContainerTypeInSitePage(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.00.02.03")]
public class DropDefaultLayoutInSite : MultiDatabaseMigration
{
public DropDefaultLayoutInSite(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public DropDefaultLayoutInSite(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Oqtane.Migrations
[Migration("Tenant.02.01.00.00")]
public class AddAppVersionsTable : MultiDatabaseMigration
{
public AddAppVersionsTable(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddAppVersionsTable(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Master.02.01.00.00")]
public class AddIndexesForForeignKeyInMaster : MultiDatabaseMigration
{
public AddIndexesForForeignKeyInMaster(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddIndexesForForeignKeyInMaster(IOqtaneDatabase database) : base(database)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Oqtane.Migrations
[Migration("Master.02.01.00.01")]
public class AddDatabaseTypeColumnToTenant : MultiDatabaseMigration
{
public AddDatabaseTypeColumnToTenant(IEnumerable<IOqtaneDatabase> databases) : base(databases)
public AddDatabaseTypeColumnToTenant(IOqtaneDatabase database) : base(database)
{
}

Expand Down
8 changes: 4 additions & 4 deletions Oqtane.Server/Migrations/Framework/MultiDatabaseMigration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ namespace Oqtane.Migrations
{
public abstract class MultiDatabaseMigration : Migration
{
private readonly IEnumerable<IOqtaneDatabase> _databases;
private readonly IOqtaneDatabase _databases;

protected MultiDatabaseMigration(IEnumerable<IOqtaneDatabase> databases)
protected MultiDatabaseMigration(IOqtaneDatabase database)
{
_databases = databases;
ActiveDatabase = database;
}

protected IOqtaneDatabase ActiveDatabase => _databases.FirstOrDefault(d => d.Provider == ActiveProvider);
protected IOqtaneDatabase ActiveDatabase { get; }

protected string RewriteName(string name)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace Oqtane.Migrations.Framework
{
public class MultiDatabaseMigrationsAssembly: MigrationsAssembly
{
private readonly IEnumerable<IOqtaneDatabase> _databases;
private readonly IOqtaneDatabase _database;

public MultiDatabaseMigrationsAssembly(
ICurrentDbContext currentContext,
Expand All @@ -23,15 +23,15 @@ public MultiDatabaseMigrationsAssembly(
: base(currentContext, options, idGenerator, logger)
{
var multiDatabaseContext = currentContext.Context as IMultiDatabase;
if (multiDatabaseContext != null) _databases = multiDatabaseContext.Databases;
if (multiDatabaseContext != null) _database = multiDatabaseContext.ActiveDatabase;
}
public override Migration CreateMigration(TypeInfo migrationClass, string activeProvider)
{
var hasCtorWithCacheOptions = migrationClass.GetConstructor(new[] { typeof(IEnumerable<IOqtaneDatabase>) }) != null;
var hasCtorWithCacheOptions = migrationClass.GetConstructor(new[] { typeof(IOqtaneDatabase) }) != null;

if (hasCtorWithCacheOptions)
{
var migration = (Migration)Activator.CreateInstance(migrationClass.AsType(), _databases);
var migration = (Migration)Activator.CreateInstance(migrationClass.AsType(), _database);
if (migration != null)
{
migration.ActiveProvider = activeProvider;
Expand Down
Loading