diff --git a/.gitignore b/.gitignore index 98408e86..29b72c2a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ msbuild.binlog Oqtane.Server/appsettings.json Oqtane.Server/Data/*.mdf Oqtane.Server/Data/*.ldf +Oqtane.Server/Data/*.db /Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml Oqtane.Server/Content diff --git a/Oqtane.Client/UI/Installer.razor b/Oqtane.Client/UI/Installer.razor index 9231e092..5983c253 100644 --- a/Oqtane.Client/UI/Installer.razor +++ b/Oqtane.Client/UI/Installer.razor @@ -27,10 +27,19 @@ - + + + + + + + + + @@ -38,7 +47,7 @@ - + @@ -46,7 +55,7 @@ - + @@ -129,6 +138,7 @@ @code { private string _databaseType = "LocalDB"; private string _serverName = "(LocalDb)\\MSSQLLocalDB"; + private string _fileName = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm") + ".db"; private string _databaseName = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm"); private string _username = string.Empty; private string _password = string.Empty; @@ -138,6 +148,8 @@ private string _hostEmail = string.Empty; private string _message = string.Empty; private string _integratedSecurityDisplay = "display: none;"; + private string _fileFieldsDisplay = "display: none;"; + private string _serverFieldsDisplay = "display: none;"; private string _loadingDisplay = "display: none;"; protected override async Task OnAfterRenderAsync(bool firstRender) @@ -158,33 +170,38 @@ private async Task Install() { - if (_serverName != "" && _databaseName != "" && _hostUsername != "" && _hostPassword.Length >= 6 && _hostPassword == _confirmPassword && _hostEmail != "") + if (((_serverName != "" && _databaseName != "") || _fileName !="") && _hostUsername != "" && _hostPassword.Length >= 6 && _hostPassword == _confirmPassword && _hostEmail != "") { _loadingDisplay = ""; StateHasChanged(); var connectionstring = ""; - if (_databaseType == "LocalDB") + switch (_databaseType) { - connectionstring = "Data Source=" + _serverName + ";AttachDbFilename=|DataDirectory|\\" + _databaseName + ".mdf;Initial Catalog=" + _databaseName + ";Integrated Security=SSPI;"; - } - else - { - connectionstring = "Data Source=" + _serverName + ";Initial Catalog=" + _databaseName + ";"; - if (_integratedSecurityDisplay == "display: none;") - { - connectionstring += "Integrated Security=SSPI;"; - } - else - { - connectionstring += "User ID=" + _username + ";Password=" + _password; - } + case "LocalDB": + connectionstring = "Data Source=" + _serverName + ";AttachDbFilename=|DataDirectory|\\" + _databaseName + ".mdf;Initial Catalog=" + _databaseName + ";Integrated Security=SSPI;"; + break; + case "SQLServer": + connectionstring = "Data Source=" + _serverName + ";Initial Catalog=" + _databaseName + ";"; + if (_integratedSecurityDisplay == "display: none;") + { + connectionstring += "Integrated Security=SSPI;"; + } + else + { + connectionstring += "User ID=" + _username + ";Password=" + _password; + } + break; + case "Sqlite": + connectionstring = "Data Source=" + _fileName; + break; } Uri uri = new Uri(NavigationManager.Uri); var config = new InstallConfig { + DatabaseType = _databaseType, ConnectionString = connectionstring, Aliases = uri.Authority, HostEmail = _hostEmail, diff --git a/Oqtane.Server/Data/Oqtane.db b/Oqtane.Server/Data/Oqtane.db deleted file mode 100644 index d02cc5a4..00000000 Binary files a/Oqtane.Server/Data/Oqtane.db and /dev/null differ diff --git a/Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs b/Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs index 4904d0d3..485423a4 100644 --- a/Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/DbContextOptionsBuilderExtensions.cs @@ -5,10 +5,18 @@ namespace Oqtane.Extensions { public static class DbContextOptionsBuilderExtensions { - public static DbContextOptionsBuilder UseOqtaneDatabase([NotNull] this DbContextOptionsBuilder optionsBuilder, string connectionString) + public static DbContextOptionsBuilder UseOqtaneDatabase([NotNull] this DbContextOptionsBuilder optionsBuilder, string databaseType, string connectionString) { - optionsBuilder.UseSqlServer(connectionString); - //optionsBuilder.UseSqlite("Data Source=Oqtane.db"); + switch (databaseType) + { + case "SqlServer": + optionsBuilder.UseSqlServer(connectionString); + + break; + case "Sqlite": + optionsBuilder.UseSqlite(connectionString); + break; + } return optionsBuilder; } diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index 8a002481..1d2a2799 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -171,7 +171,8 @@ namespace Oqtane.Infrastructure if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory ?? String.Empty); var connectionString = NormalizeConnectionString(install.ConnectionString); - using (var dbc = new DbContext(new DbContextOptionsBuilder().UseOqtaneDatabase(connectionString).Options)) + var databaseType = install.DatabaseType; + using (var dbc = new DbContext(new DbContextOptionsBuilder().UseOqtaneDatabase(databaseType, connectionString).Options)) { // create empty database if it does not exist dbc.Database.EnsureCreated(); @@ -199,7 +200,7 @@ namespace Oqtane.Infrastructure { try { - var dbConfig = new DbConfig(null, null) {ConnectionString = install.ConnectionString}; + var dbConfig = new DbConfig(null, null) {ConnectionString = install.ConnectionString, DatabaseType = install.DatabaseType}; using (var masterDbContext = new MasterDBContext(new DbContextOptions(), dbConfig)) { @@ -216,6 +217,7 @@ namespace Oqtane.Infrastructure if (result.Success) { UpdateConnectionString(install.ConnectionString); + UpdateDatabaseType(install.DatabaseType); } } else @@ -232,12 +234,18 @@ namespace Oqtane.Infrastructure if (!string.IsNullOrEmpty(install.TenantName) && !string.IsNullOrEmpty(install.Aliases)) { - using (var db = new InstallationContext(NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)))) + using (var db = new InstallationContext(install.DatabaseType, NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)))) { Tenant tenant; if (install.IsNewTenant) { - tenant = new Tenant { Name = install.TenantName, DBConnectionString = DenormalizeConnectionString(install.ConnectionString), CreatedBy = "", CreatedOn = DateTime.UtcNow, ModifiedBy = "", ModifiedOn = DateTime.UtcNow }; + tenant = new Tenant { Name = install.TenantName, + DBConnectionString = DenormalizeConnectionString(install.ConnectionString), + DBType = install.DatabaseType, + CreatedBy = "", + CreatedOn = DateTime.UtcNow, + ModifiedBy = "", + ModifiedOn = DateTime.UtcNow }; db.Tenant.Add(tenant); db.SaveChanges(); _cache.Remove("tenants"); @@ -276,13 +284,15 @@ namespace Oqtane.Infrastructure { var upgrades = scope.ServiceProvider.GetRequiredService(); - using (var db = new InstallationContext(NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)))) + var databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey]; + var connectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)); + using (var db = new InstallationContext(databaseType, connectionString)) { foreach (var tenant in db.Tenant.ToList()) { try { - var dbConfig = new DbConfig(null, null) {ConnectionString = install.ConnectionString}; + var dbConfig = new DbConfig(null, null) {ConnectionString = install.ConnectionString, DatabaseType = install.DatabaseType}; using (var tenantDbContext = new TenantDBContext(dbConfig, null)) { // Push latest model into database @@ -337,44 +347,37 @@ namespace Oqtane.Infrastructure if (moduleType != null) { var versions = moduleDefinition.ReleaseVersions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - using (var db = new InstallationContext(NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)))) - { + var databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey]; + var connectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)); + using (var db = new InstallationContext(databaseType, connectionString)) { foreach (var tenant in db.Tenant.ToList()) { - if (moduleType.GetInterface("IMigratable") != null) + var index = Array.FindIndex(versions, item => item == moduleDefinition.Version); + if (tenant.Name == install.TenantName && install.TenantName != TenantNames.Master) { - var moduleObject = ActivatorUtilities.CreateInstance(scope.ServiceProvider, moduleType) as IMigratable; - moduleObject.Migrate(tenant, MigrationType.Up); + index = -1; } - else + if (index != (versions.Length - 1)) { - var index = Array.FindIndex(versions, item => item == moduleDefinition.Version); - if (tenant.Name == install.TenantName && install.TenantName != TenantNames.Master) + if (index == -1) index = 0; + for (var i = index; i < versions.Length; i++) { - index = -1; - } - if (index != (versions.Length - 1)) - { - if (index == -1) index = 0; - for (var i = index; i < versions.Length; i++) + try { - try + if (moduleType.GetInterface("IInstallable") != null) { - if (moduleType.GetInterface("IInstallable") != null) - { - var moduleObject = ActivatorUtilities.CreateInstance(scope.ServiceProvider, moduleType); - ((IInstallable)moduleObject).Install(tenant, versions[i]); - } - else - { - sql.ExecuteScript(tenant, moduleType.Assembly, Utilities.GetTypeName(moduleDefinition.ModuleDefinitionName) + "." + versions[i] + ".sql"); - } + var moduleObject = ActivatorUtilities.CreateInstance(scope.ServiceProvider, moduleType) as IInstallable; + moduleObject?.Install(tenant, versions[i]); } - catch (Exception ex) + else { - result.Message = "An Error Occurred Installing " + moduleDefinition.Name + " Version " + versions[i] + " - " + ex.Message; + sql.ExecuteScript(tenant, moduleType.Assembly, Utilities.GetTypeName(moduleDefinition.ModuleDefinitionName) + "." + versions[i] + ".sql"); } } + catch (Exception ex) + { + result.Message = "An Error Occurred Installing " + moduleDefinition.Name + " Version " + versions[i] + " - " + ex.Message; + } } } } @@ -530,11 +533,17 @@ namespace Oqtane.Infrastructure connectionString = DenormalizeConnectionString(connectionString); if (_config.GetConnectionString(SettingKeys.ConnectionStringKey) != connectionString) { - AddOrUpdateAppSetting($"ConnectionStrings:{SettingKeys.ConnectionStringKey}", connectionString); + AddOrUpdateAppSetting($"{SettingKeys.ConnectionStringsSection}:{SettingKeys.ConnectionStringKey}", connectionString); _config.Reload(); } } + public void UpdateDatabaseType(string databaseType) + { + AddOrUpdateAppSetting($"{SettingKeys.DatabaseSection}:{SettingKeys.DatabaseTypeKey}", databaseType); + _config.Reload(); + } + public void AddOrUpdateAppSetting(string sectionPathKey, T value) { try diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index 3b627c70..3962baf5 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Hosting; using Oqtane.Shared; +// ReSharper disable AssignNullToNotNullAttribute namespace Oqtane.Infrastructure { diff --git a/Oqtane.Server/Infrastructure/Interfaces/IMigratable.cs b/Oqtane.Server/Infrastructure/Interfaces/IMigratable.cs deleted file mode 100644 index 009268fc..00000000 --- a/Oqtane.Server/Infrastructure/Interfaces/IMigratable.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Oqtane.Enums; -using Oqtane.Models; - -namespace Oqtane.Infrastructure -{ - public interface IMigratable - { - bool Migrate(Tenant tenant, MigrationType migrationType); - } -} diff --git a/Oqtane.Server/Migrations/01000000_InitializeTenant.cs b/Oqtane.Server/Migrations/01000000_InitializeTenant.cs index d977e508..fe1b8b1e 100644 --- a/Oqtane.Server/Migrations/01000000_InitializeTenant.cs +++ b/Oqtane.Server/Migrations/01000000_InitializeTenant.cs @@ -21,6 +21,12 @@ namespace Oqtane.Migrations pageEntityBuilder.Create(); pageEntityBuilder.AddIndex("IX_Page", new [] {"SiteId", "Path", "UserId"}, true); + //Add Column to Page table (for Sql Server only) we will drop it later for Sql Server only + if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer") + { + pageEntityBuilder.AddBooleanColumn("EditMode"); + } + //Create Module table var moduleEntityBuilder = new ModuleEntityBuilder(migrationBuilder); moduleEntityBuilder.Create(); diff --git a/Oqtane.Server/Migrations/01000201_DropColumnFromPage.cs b/Oqtane.Server/Migrations/01000201_DropColumnFromPage.cs index 516aae4d..9ee79ff7 100644 --- a/Oqtane.Server/Migrations/01000201_DropColumnFromPage.cs +++ b/Oqtane.Server/Migrations/01000201_DropColumnFromPage.cs @@ -12,7 +12,7 @@ namespace Oqtane.Migrations protected override void Up(MigrationBuilder migrationBuilder) { //Drop Column from Page table - if (migrationBuilder.ActiveProvider != "Microsoft.EntityFrameworkCore.Sqlite") + if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer") { var pageEntityBuilder = new PageEntityBuilder(migrationBuilder); pageEntityBuilder.DropColumn("EditMode"); diff --git a/Oqtane.Server/Migrations/02010001_AddDatabaseTypeColumnToTenant.cs b/Oqtane.Server/Migrations/02010001_AddDatabaseTypeColumnToTenant.cs new file mode 100644 index 00000000..bfea92bd --- /dev/null +++ b/Oqtane.Server/Migrations/02010001_AddDatabaseTypeColumnToTenant.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Oqtane.Migrations.EntityBuilders; +using Oqtane.Repository; + +namespace Oqtane.Migrations +{ + [DbContext(typeof(MasterDBContext))] + [Migration("Master.02.01.00.01")] + public class AddDatabaseTypeColumnToTenant : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + //Add Column to Site table + var tenantEntityBuilder = new TenantEntityBuilder(migrationBuilder); + tenantEntityBuilder.AddStringColumn("DBType", 200, true); + + //Update new column + migrationBuilder.Sql( + @" + UPDATE Tenant + SET DBType = 'SqlServer' + "); + + } + } +} diff --git a/Oqtane.Server/Migrations/EntityBuilders/PageEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/PageEntityBuilder.cs index 49c75ba0..c259b945 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/PageEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/PageEntityBuilder.cs @@ -35,7 +35,6 @@ namespace Oqtane.Migrations.EntityBuilders IsNavigation = table.AddBooleanColumn("IsNavigation"); Url = table.AddStringColumn("Url", 500, true); LayoutType = table.AddStringColumn("LayoutType", 200); - EditMode = table.AddBooleanColumn("EditMode"); UserId = table.AddIntegerColumn("UserId", true); IsPersonalizable = table.AddBooleanColumn("IsPersonalizable"); DefaultContainerType = table.AddStringColumn("DefaultContainerType", 200, true); @@ -69,8 +68,6 @@ namespace Oqtane.Migrations.EntityBuilders public OperationBuilder LayoutType { get; private set; } - public OperationBuilder EditMode { get; private set; } - public OperationBuilder UserId { get; private set; } public OperationBuilder IsPersonalizable { get; private set; } diff --git a/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs b/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs index d8afa1b2..4329a4c7 100644 --- a/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs +++ b/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs @@ -12,7 +12,7 @@ using Oqtane.Enums; namespace Oqtane.Modules.HtmlText.Manager { - public class HtmlTextManager : IMigratable, IPortable + public class HtmlTextManager : MigratableModuleBase, IInstallable, IPortable { private readonly IHtmlTextRepository _htmlText; private readonly ISqlRepository _sql; @@ -23,35 +23,6 @@ namespace Oqtane.Modules.HtmlText.Manager _sql = sql; } - public bool Migrate(Tenant tenant, MigrationType migrationType) - { - var result = true; - - var dbConfig = new DbConfig(null, null) {ConnectionString = tenant.DBConnectionString}; - using (var db = new HtmlTextContext(dbConfig, null)) - { - try - { - var migrator = db.GetService(); - if (migrationType == MigrationType.Down) - { - migrator.Migrate(Migration.InitialDatabase); - } - else - { - migrator.Migrate(); - } - } - catch (Exception e) - { - Console.WriteLine(e); - result = false; - } - - } - return result; - } - public string ExportModule(Module module) { string content = ""; @@ -80,5 +51,17 @@ namespace Oqtane.Modules.HtmlText.Manager _htmlText.AddHtmlText(htmlText); } } + + public bool Install(Tenant tenant, string version) + { + var dbConfig = new DbConfig(null, null) {ConnectionString = tenant.DBConnectionString, DatabaseType = tenant.DBType}; + return Migrate(new HtmlTextContext(dbConfig, null), tenant, MigrationType.Up); + } + + public bool Uninstall(Tenant tenant) + { + var dbConfig = new DbConfig(null, null) {ConnectionString = tenant.DBConnectionString, DatabaseType = tenant.DBType}; + return Migrate(new HtmlTextContext(dbConfig, null), tenant, MigrationType.Down); + } } } diff --git a/Oqtane.Server/Modules/MigratableModuleBase.cs b/Oqtane.Server/Modules/MigratableModuleBase.cs new file mode 100644 index 00000000..c282d324 --- /dev/null +++ b/Oqtane.Server/Modules/MigratableModuleBase.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Oqtane.Enums; +using Oqtane.Models; +using Oqtane.Modules.HtmlText.Repository; +using Oqtane.Repository; + +namespace Oqtane.Modules +{ + public class MigratableModuleBase + { + public bool Migrate(DBContextBase dbContext, Tenant tenant, MigrationType migrationType) + { + var result = true; + + using (dbContext) + { + try + { + var migrator = dbContext.GetService(); + if (migrationType == MigrationType.Down) + { + migrator.Migrate(Migration.InitialDatabase); + } + else + { + migrator.Migrate(); + } + } + catch (Exception e) + { + Console.WriteLine(e); + result = false; + } + + } + return result; + + } + } +} diff --git a/Oqtane.Server/Repository/Context/DBContextBase.cs b/Oqtane.Server/Repository/Context/DBContextBase.cs index 013675d0..550665da 100644 --- a/Oqtane.Server/Repository/Context/DBContextBase.cs +++ b/Oqtane.Server/Repository/Context/DBContextBase.cs @@ -7,48 +7,62 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Oqtane.Extensions; using Oqtane.Models; +using Oqtane.Shared; + // ReSharper disable BuiltInTypeReferenceStyleForMemberAccess namespace Oqtane.Repository { public class DBContextBase : IdentityUserContext { - private readonly IDbConfig _dbConfig; private readonly ITenantResolver _tenantResolver; + private readonly IHttpContextAccessor _accessor; + private readonly IConfiguration _configuration; + private string _connectionString; + private string _databaseType; + + public DBContextBase(ITenantResolver tenantResolver, IHttpContextAccessor httpContextAccessor) + { + _connectionString = String.Empty; + _tenantResolver = tenantResolver; + _accessor = httpContextAccessor; + } public DBContextBase(IDbConfig dbConfig, ITenantResolver tenantResolver) { - _dbConfig = dbConfig; + _accessor = dbConfig.Accessor; + _configuration = dbConfig.Configuration; + _connectionString = dbConfig.ConnectionString; + _databaseType = dbConfig.DatabaseType; _tenantResolver = tenantResolver; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - var connectionString = _dbConfig.ConnectionString; - - if (string.IsNullOrEmpty(connectionString) && _tenantResolver != null) + if (string.IsNullOrEmpty(_connectionString) && _tenantResolver != null) { var tenant = _tenantResolver.GetTenant(); - var configuration = _dbConfig.Configuration; if (tenant != null) { - connectionString = tenant.DBConnectionString + _connectionString = tenant.DBConnectionString .Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString()); + _databaseType = tenant.DBType; } else { - if (!String.IsNullOrEmpty(configuration.GetConnectionString("DefaultConnection"))) + if (!String.IsNullOrEmpty(_configuration.GetConnectionString("DefaultConnection"))) { - connectionString = configuration.GetConnectionString("DefaultConnection") + _connectionString = _configuration.GetConnectionString("DefaultConnection") .Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString()); } + _databaseType = _configuration.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey]; } } - if (!string.IsNullOrEmpty(connectionString)) + if (!string.IsNullOrEmpty(_connectionString) && !string.IsNullOrEmpty(_databaseType)) { - optionsBuilder.UseOqtaneDatabase(connectionString); + optionsBuilder.UseOqtaneDatabase(_databaseType, _connectionString); } base.OnConfiguring(optionsBuilder); @@ -56,7 +70,7 @@ namespace Oqtane.Repository public override int SaveChanges() { - DbContextUtils.SaveChanges(this, _dbConfig.Accessor); + DbContextUtils.SaveChanges(this, _accessor); return base.SaveChanges(); } diff --git a/Oqtane.Server/Repository/Context/DbConfig.cs b/Oqtane.Server/Repository/Context/DbConfig.cs index 7bc5cb8a..7cc636ef 100644 --- a/Oqtane.Server/Repository/Context/DbConfig.cs +++ b/Oqtane.Server/Repository/Context/DbConfig.cs @@ -16,5 +16,7 @@ namespace Oqtane.Repository public IConfiguration Configuration { get; } public string ConnectionString { get; set; } + + public string DatabaseType { get; set; } } } diff --git a/Oqtane.Server/Repository/Context/InstallationContext.cs b/Oqtane.Server/Repository/Context/InstallationContext.cs index 52036bbe..061aecbb 100644 --- a/Oqtane.Server/Repository/Context/InstallationContext.cs +++ b/Oqtane.Server/Repository/Context/InstallationContext.cs @@ -9,14 +9,16 @@ namespace Oqtane.Repository public class InstallationContext : DbContext { private readonly string _connectionString; + private readonly string _databaseType; - public InstallationContext(string connectionString) + public InstallationContext(string databaseType, string connectionString) { _connectionString = connectionString; + _databaseType = databaseType; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - => optionsBuilder.UseOqtaneDatabase(_connectionString); + => optionsBuilder.UseOqtaneDatabase(_databaseType, _connectionString); public virtual DbSet Alias { get; set; } public virtual DbSet Tenant { get; set; } diff --git a/Oqtane.Server/Repository/Context/MasterDBContext.cs b/Oqtane.Server/Repository/Context/MasterDBContext.cs index 68ef6b07..04f61176 100644 --- a/Oqtane.Server/Repository/Context/MasterDBContext.cs +++ b/Oqtane.Server/Repository/Context/MasterDBContext.cs @@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore; using Oqtane.Models; using Microsoft.Extensions.Configuration; using Oqtane.Extensions; +using Oqtane.Shared; // ReSharper disable BuiltInTypeReferenceStyleForMemberAccess // ReSharper disable UnusedAutoPropertyAccessor.Global @@ -24,6 +25,7 @@ namespace Oqtane.Repository { var connectionString = _dbConfig.ConnectionString; var configuration = _dbConfig.Configuration; + var databaseType = _dbConfig.DatabaseType; if(string.IsNullOrEmpty(connectionString) && configuration != null) { @@ -33,11 +35,12 @@ namespace Oqtane.Repository .Replace("|DataDirectory|", AppDomain.CurrentDomain.GetData("DataDirectory")?.ToString()); } + databaseType = configuration.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey]; } if (!string.IsNullOrEmpty(connectionString)) { - optionsBuilder.UseOqtaneDatabase(connectionString); + optionsBuilder.UseOqtaneDatabase(databaseType, connectionString); } base.OnConfiguring(optionsBuilder); } diff --git a/Oqtane.Server/Repository/Interfaces/IDbConfig.cs b/Oqtane.Server/Repository/Interfaces/IDbConfig.cs index 6ba4cfbe..cde50726 100644 --- a/Oqtane.Server/Repository/Interfaces/IDbConfig.cs +++ b/Oqtane.Server/Repository/Interfaces/IDbConfig.cs @@ -10,5 +10,6 @@ namespace Oqtane.Repository public IConfiguration Configuration { get; } public string ConnectionString { get; set; } + public string DatabaseType { get; set; } } } diff --git a/Oqtane.Server/appsettings.json b/Oqtane.Server/appsettings.json index 06f423f8..33858f9e 100644 --- a/Oqtane.Server/appsettings.json +++ b/Oqtane.Server/appsettings.json @@ -1,10 +1,10 @@ { "Database": { - "DatabaseType": "", + "DatabaseType": "Sqlite", "DatabaseEngineVersion": "" }, "ConnectionStrings": { - "DefaultConnection": "Data Source=.;Initial Catalog=Oqtane-Migrations;Integrated Security=SSPI;" + "DefaultConnection": "Data Source=Oqtane.db" }, "Runtime": "Server", "Installation": { diff --git a/Oqtane.Shared/Models/Tenant.cs b/Oqtane.Shared/Models/Tenant.cs index 645f1e97..d0891563 100644 --- a/Oqtane.Shared/Models/Tenant.cs +++ b/Oqtane.Shared/Models/Tenant.cs @@ -7,6 +7,7 @@ namespace Oqtane.Models public int TenantId { get; set; } public string Name { get; set; } public string DBConnectionString { get; set; } + public string DBType { get; set; } public string Version { get; set; } public string CreatedBy { get; set; } public DateTime CreatedOn { get; set; } diff --git a/Oqtane.Shared/Shared/InstallConfig.cs b/Oqtane.Shared/Shared/InstallConfig.cs index 7658e97d..5ca5284d 100644 --- a/Oqtane.Shared/Shared/InstallConfig.cs +++ b/Oqtane.Shared/Shared/InstallConfig.cs @@ -3,6 +3,7 @@ namespace Oqtane.Shared public class InstallConfig { public string ConnectionString { get; set; } + public string DatabaseType { get; set; } public string Aliases { get; set; } public string TenantName { get; set; } public bool IsNewTenant { get; set; } diff --git a/Oqtane.Shared/Shared/SettingKeys.cs b/Oqtane.Shared/Shared/SettingKeys.cs index 6524e333..0656bbc5 100644 --- a/Oqtane.Shared/Shared/SettingKeys.cs +++ b/Oqtane.Shared/Shared/SettingKeys.cs @@ -2,12 +2,18 @@ { public static class SettingKeys { + public const string ConnectionStringsSection = "ConnectionStrings"; + public const string DatabaseSection = "Database"; public const string InstallationSection = "Installation"; + + public const string ConnectionStringKey = "DefaultConnection"; + + public const string DatabaseTypeKey = "DatabaseType"; + public const string DefaultAliasKey = "DefaultAlias"; public const string HostPasswordKey = "HostPassword"; public const string HostEmailKey = "HostEmail"; public const string SiteTemplateKey = "SiteTemplate"; - public const string ConnectionStringKey = "DefaultConnection"; public const string DefaultThemeKey = "DefaultTheme"; public const string DefaultLayoutKey = "DefaultLayout"; public const string DefaultContainerKey = "DefaultContainer";