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";