mirror of
https://github.com/bitwarden/server.git
synced 2025-07-01 16:12:49 -05:00
Add Sqlite as EF DB provider (#2487)
* Add Sqlite as EF DB provider Note: In-memory sqlite does not work across projects, since the migrator only runs on the Admin project Co-authored-by: Justin Baur <justindbaur@users.noreply.github.com> * Include example sqlite connection string * Add migrator assembly to sqlite connection * Update initial migration to current schema state * dotnet format 🤖 * Update package locks * Respect name set in BW_SSL_KEY for cert generation (#2490) (cherry picked from commit2469e10110
) * [PS-2016] Add ability to change UID/GID for Bitwarden unified (#2495) (cherry picked from commitc6fbe8cc44
) * Add SqliteMigrations project to unified Dockerfile Co-authored-by: Justin Baur <justindbaur@users.noreply.github.com> Co-authored-by: accolon <mail@accolon.net> Co-authored-by: Vince Grassia <593223+vgrassia@users.noreply.github.com>
This commit is contained in:
36
util/SqliteMigrations/Factories.cs
Normal file
36
util/SqliteMigrations/Factories.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using Bit.Core.Settings;
|
||||
using Bit.Infrastructure.EntityFramework.Repositories;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Design;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace Bit.SqliteMigrations;
|
||||
|
||||
public static class GlobalSettingsFactory
|
||||
{
|
||||
public static GlobalSettings GlobalSettings { get; } = new GlobalSettings();
|
||||
static GlobalSettingsFactory()
|
||||
{
|
||||
var configBuilder = new ConfigurationBuilder().AddUserSecrets("bitwarden-Api");
|
||||
var Configuration = configBuilder.Build();
|
||||
ConfigurationBinder.Bind(Configuration.GetSection("GlobalSettings"), GlobalSettings);
|
||||
}
|
||||
}
|
||||
|
||||
public class DatabaseContextFactory : IDesignTimeDbContextFactory<DatabaseContext>
|
||||
{
|
||||
public DatabaseContext CreateDbContext(string[] args)
|
||||
{
|
||||
var globalSettings = GlobalSettingsFactory.GlobalSettings;
|
||||
var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
|
||||
var connectionString = globalSettings.Sqlite?.ConnectionString ?? "Data Source=:memory:";
|
||||
if (string.IsNullOrWhiteSpace(connectionString))
|
||||
{
|
||||
throw new Exception("No Sqlite connection string found.");
|
||||
}
|
||||
optionsBuilder.UseSqlite(
|
||||
connectionString,
|
||||
b => b.MigrationsAssembly("SqliteMigrations"));
|
||||
return new DatabaseContext(optionsBuilder.Options);
|
||||
}
|
||||
}
|
1679
util/SqliteMigrations/Migrations/20221212154007_initial.Designer.cs
generated
Normal file
1679
util/SqliteMigrations/Migrations/20221212154007_initial.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
1084
util/SqliteMigrations/Migrations/20221212154007_initial.cs
Normal file
1084
util/SqliteMigrations/Migrations/20221212154007_initial.cs
Normal file
File diff suppressed because it is too large
Load Diff
1677
util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs
Normal file
1677
util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs
Normal file
File diff suppressed because it is too large
Load Diff
41
util/SqliteMigrations/SqliteDbMigrator.cs
Normal file
41
util/SqliteMigrations/SqliteDbMigrator.cs
Normal file
@ -0,0 +1,41 @@
|
||||
using Bit.Core;
|
||||
using Bit.Core.Utilities;
|
||||
using Bit.Infrastructure.EntityFramework.Repositories;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Bit.SqliteMigrations;
|
||||
|
||||
public class SqliteDbMigrator : IDbMigrator
|
||||
{
|
||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||
private readonly ILogger<SqliteDbMigrator> _logger;
|
||||
|
||||
public SqliteDbMigrator(IServiceScopeFactory serviceScopeFactory, ILogger<SqliteDbMigrator> logger)
|
||||
{
|
||||
_serviceScopeFactory = serviceScopeFactory;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public bool MigrateDatabase(bool enableLogging = true,
|
||||
CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
if (enableLogging && _logger != null)
|
||||
{
|
||||
_logger.LogInformation(Constants.BypassFiltersEventId, "Migrating database.");
|
||||
}
|
||||
|
||||
using var scope = _serviceScopeFactory.CreateScope();
|
||||
var databaseContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
|
||||
databaseContext.Database.Migrate();
|
||||
|
||||
if (enableLogging && _logger != null)
|
||||
{
|
||||
_logger.LogInformation(Constants.BypassFiltersEventId, "Migration successful.");
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
return true;
|
||||
}
|
||||
}
|
25
util/SqliteMigrations/SqliteMigrations.csproj
Normal file
25
util/SqliteMigrations/SqliteMigrations.csproj
Normal file
@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\Core\Core.csproj" />
|
||||
<ProjectReference Include="..\..\src\Infrastructure.EntityFramework\Infrastructure.EntityFramework.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.4">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\EfShared\MigrationBuilderExtensions.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
2760
util/SqliteMigrations/packages.lock.json
Normal file
2760
util/SqliteMigrations/packages.lock.json
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user