Skip to content

Commit

Permalink
use hashed createscript as a stable name for the database
Browse files Browse the repository at this point in the history
  • Loading branch information
Barsonax committed Apr 5, 2024
1 parent d347e27 commit ea4ad02
Show file tree
Hide file tree
Showing 24 changed files with 94 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ namespace AngularAuth.Backend.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/AngularAuth/AngularAuth.Backend.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
WebRootPath = "wwwroot/browser"
});

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseNpgsql(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme);
Expand Down
11 changes: 7 additions & 4 deletions Examples/Api/MsSql/Api.MsSql.Sut/BloggingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@ namespace Api.MsSql.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
{
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

optionsBuilder.UseSqlServer(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/Api/MsSql/Api.MsSql.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseSqlServer(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

var app = builder.Build();

Expand Down
9 changes: 7 additions & 2 deletions Examples/Api/PostgreSql/Api.PostgreSql.Sut/BloggingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ namespace Api.PostgreSql.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/Api/PostgreSql/Api.PostgreSql.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseNpgsql(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

var app = builder.Build();

Expand Down
9 changes: 7 additions & 2 deletions Examples/ApiJwtAuth/ApiJwtAuth.Sut/BloggingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ namespace ApiJwtAuth.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/ApiJwtAuth/ApiJwtAuth.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@

builder.Services.AddAuthorization();

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseNpgsql(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

var app = builder.Build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private sealed class MigrationTestCases : IEnumerable
{
public IEnumerator GetEnumerator()
{
using DbContext context = new BloggingContext(new DbContextOptionsBuilder<BloggingContext>().UseSqlServer().Options);
using DbContext context = new BloggingContext();
var migrations = context.GenerateMigrationScripts();

foreach (var migration in migrations)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@ namespace Migrations.MsSql.EntityFrameworkCore.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
{
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

optionsBuilder.UseSqlServer(_connectionString);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseSqlServer(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

var app = builder.Build();

Expand Down
9 changes: 7 additions & 2 deletions Examples/Razor/Razor.Sut/BloggingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ namespace Razor.PostgreSql.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/Razor/Razor.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseNpgsql(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

builder.Services.AddRazorPages();

Expand Down
9 changes: 7 additions & 2 deletions Examples/Vue/Vue.Backend.Sut/BloggingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@ namespace Vue.Backend.Sut;

public class BloggingContext : DbContext
{
private readonly string? _connectionString;
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Post> Posts => Set<Post>();

public BloggingContext()
public BloggingContext() { }

public BloggingContext(IConfiguration configuration)
{
_connectionString = configuration["DbConnectionString"];
}

public BloggingContext(DbContextOptions<BloggingContext> context) : base(context)
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
}

Expand Down
5 changes: 1 addition & 4 deletions Examples/Vue/Vue.Backend.Sut/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<BloggingContext>(options =>
{
options.UseNpgsql(builder.Configuration["DbConnectionString"]);
});
builder.Services.AddDbContext<BloggingContext>();

var app = builder.Build();

Expand Down
17 changes: 0 additions & 17 deletions TestExamplesDotnet.EntityFrameworkCore/DataBaseNameGenerator.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
using Microsoft.EntityFrameworkCore;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;


namespace TestExamplesDotnet;

public sealed class DbContextMigrationInitializer<TDbContext> : IDatabaseInitializer
where TDbContext : DbContext
where TDbContext : DbContext, new()
{
private int _counter;
private readonly Lazy<string> _databaseHash;

public DbContextMigrationInitializer()
{
_databaseHash = new Lazy<string>(() =>
{
using var context = new TDbContext();
var createScript = context.GetService<IRelationalDatabaseCreator>().GenerateCreateScript();
#pragma warning disable CA5351
return Convert.ToHexString(MD5.HashData(Encoding.UTF8.GetBytes(createScript)));
#pragma warning restore CA5351
});
}

public void Initialize(IHost app)
{
using var serviceScope = app.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
Expand All @@ -21,4 +42,10 @@ public void Initialize(IHost app)
configurationRoot["Logging:LogLevel:Microsoft.EntityFrameworkCore"] = LogLevel.Information.ToString();
configurationRoot.Reload();
}

public string GetUniqueDataBaseName()
{
var counter = Interlocked.Increment(ref _counter);
return $"{_databaseHash.Value}_{counter}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ namespace TestExamplesDotnet.EntityFrameworkCore;
public static class ServiceCollectionExtensions
{
public static void RegisterMigrationInitializer<TContext>(this IServiceCollection services)
where TContext : DbContext
where TContext : DbContext, new()
{
services.AddTransient<IDatabaseInitializer, DbContextMigrationInitializer<TContext>>();
services.AddSingleton<IDataBaseNameGenerator, DataBaseNameGenerator<TContext>>();
services.AddSingleton<IDatabaseInitializer, DbContextMigrationInitializer<TContext>>();
}
}
2 changes: 1 addition & 1 deletion TestExamplesDotnet.Mssql/MsSqlDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public MsSqlDatabase(MsSqlContainer container, IDatabaseInitializer databaseInit
{
_databaseInitializer = databaseInitializer;
_respawnerOptions = respawnerOptions;
ConnectionString = $"Server=127.0.0.1,{container.GetMappedPublicPort(1433)};Database={Guid.NewGuid()};User Id=sa;Password=yourStrong(!)Password;TrustServerCertificate=True";
ConnectionString = $"Server=127.0.0.1,{container.GetMappedPublicPort(1433)};Database={databaseInitializer.GetUniqueDataBaseName()};User Id=sa;Password=yourStrong(!)Password;TrustServerCertificate=True";
}

public void Initialize(IHost host)
Expand Down
1 change: 0 additions & 1 deletion TestExamplesDotnet.Mssql/MsSqlDatabasePoolPolicy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public sealed class MsSqlDatabasePoolPolicy : IPooledObjectPolicy<IDatabase>
private readonly IDatabaseInitializer _databaseInitializer;
private readonly RespawnerOptions _respawnerOptions;


public MsSqlDatabasePoolPolicy(MsSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions)
{
_container = container;
Expand Down
4 changes: 2 additions & 2 deletions TestExamplesDotnet.PostgreSql/PostgreSqlDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ public sealed class PostgreSqlDatabase : IDatabase
private bool _initialized;
public string ConnectionString { get; }

public PostgreSqlDatabase(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions, IDataBaseNameGenerator dataBaseNameGenerator)
public PostgreSqlDatabase(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions)
{
_databaseInitializer = databaseInitializer;
_respawnerOptions = respawnerOptions;
ConnectionString = $"Host=127.0.0.1;Port={container.GetMappedPublicPort(5432)};Database={dataBaseNameGenerator.GetDataBaseName()};Username=postgres;Password=postgres;Include Error Detail=true";
ConnectionString = $"Host=127.0.0.1;Port={container.GetMappedPublicPort(5432)};Database={databaseInitializer.GetUniqueDataBaseName()};Username=postgres;Password=postgres;Include Error Detail=true";
}

public void Initialize(IHost host)
Expand Down
7 changes: 2 additions & 5 deletions TestExamplesDotnet.PostgreSql/PostgreSqlDatabasePoolPolicy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,15 @@ public sealed class PostgreSqlDatabasePoolPolicy : IPooledObjectPolicy<IDatabase
private readonly PostgreSqlContainer _container;
private readonly IDatabaseInitializer _databaseInitializer;
private readonly RespawnerOptions _respawnerOptions;
private readonly IDataBaseNameGenerator _dataBaseNameGenerator;


public PostgreSqlDatabasePoolPolicy(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions, IDataBaseNameGenerator dataBaseNameGenerator)
public PostgreSqlDatabasePoolPolicy(PostgreSqlContainer container, IDatabaseInitializer databaseInitializer, RespawnerOptions respawnerOptions)
{
_container = container;
_databaseInitializer = databaseInitializer;
_respawnerOptions = respawnerOptions;
_dataBaseNameGenerator = dataBaseNameGenerator;
}

public IDatabase Create() => new PostgreSqlDatabase(_container, _databaseInitializer, _respawnerOptions, _dataBaseNameGenerator);
public IDatabase Create() => new PostgreSqlDatabase(_container, _databaseInitializer, _respawnerOptions);

public bool Return(IDatabase obj) => true;
}
6 changes: 0 additions & 6 deletions TestExamplesDotnet/IDataBaseNameGenerator.cs

This file was deleted.

0 comments on commit ea4ad02

Please sign in to comment.