public T TryCreate <T>(string name, bool autoMigrate)
            where T : class, IDbConnection
        {
            using (_Logger.LogScope(LogLevel.Trace, nameof(DatabaseConnectionFactory) + "." + nameof(TryCreate)))
            {
                var connectionString = _Configuration.Element <string>($"Data/ConnectionStrings/{name}")
                                       .WithEncryption("ConnectionStrings", _DataProtection)
                                       .Value();

                if (connectionString == null)
                {
                    _Logger.LogDebug($"no connection string for database connection '{name}'");
                    return(null);
                }

                var provider = _Container.Resolve <IDatabaseConnectionProvider <T> >(IfUnresolved.ReturnDefaultIfNotRegistered);
                if (provider == null)
                {
                    _Logger.LogError($"no database provider for type '{typeof(T)}' has been registered");
                    return(null);
                }

                var connection = provider.Create(connectionString);
                if (autoMigrate)
                {
                    _DatabaseMigrator.Migrate(connection, name);
                }

                return(connection);
            }
        }
Пример #2
0
        public void Initialise()
        {
            try
            {
                // Ensure database is up-to-date
                _databaseMigrator.Migrate(ConnectionString);
            }
            catch (Exception)
            {
                _logger.LogError("Error performing database migration; deleting database and retrying");

                // Delete database and try to migrate again, in case the database file is corrupt or
                // there was an incompatible schema update.
                File.Delete(CacheDatabase);
                _databaseMigrator.Migrate(ConnectionString);
            }
        }
Пример #3
0
        public void Configure(
            IServiceScopeFactory scopeFactory,
            IDatabaseMigrator dbMigrator,
            IApplicationBuilder app,
            ILogger <Startup> log,
            IHostingEnvironment env)
        {
            var version = typeof(Startup).Assembly
                          .GetCustomAttribute <AssemblyInformationalVersionAttribute>()
                          .InformationalVersion;

            log.LogInformation(Events.Startup, "Starting {ServerVersion}", version);

            using (var scope = scopeFactory.CreateScope())
            {
                dbMigrator.Migrate();
            }

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseMiddleware <IpBlockerMiddleware>();
            app.UseMiddleware <LoggingMiddleware>();
            app.UseMiddleware <CookieAuthenticationMiddleware>();

            app.UseAuthentication();

            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseMiddleware <UserPreloadMiddleware>();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });

            if (!Runtime.IsIntegrationTesting)
            {
                app.UseSpa(spa =>
                {
                    spa.Options.SourcePath = "ClientApp";

                    if (env.IsDevelopment())
                    {
                        spa.UseAngularCliServer(npmScript: "start");
                    }
                });
            }
        }
        public void SetupDbMigrationTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            Assert.True(dbAccessFacade.AppliedItems.Count == 5);
        }
Пример #5
0
        public async Task EnqueueManyAsync(IEnumerable <WorkQueueItem> items)
        {
            using (var databaseConnection = TryCreateConnection())
            {
                if (databaseConnection == null)
                {
                    return;
                }

                databaseConnection.Open();
                await _DatabaseMigrator.Migrate(databaseConnection, "SqliteWorkqueue");

                using (var transaction = databaseConnection.BeginTransaction().NotNull())
                {
                    foreach (var item in items)
                    {
                        var json = item.Payload.ToString();
                        var hash = _Hasher.Hash(json);
                        try
                        {
                            await databaseConnection.ExecuteAsync(
                                "INSERT INTO queue (type, payload, hash, when_to_process, retry_count) VALUES (@Type, @Payload, @Hash, @WhenToProcess, @RetryCount)",
                                new
                            {
                                item.Type,
                                Payload = json,
                                Hash    = hash,
                                item.WhenToProcess,
                                item.RetryCount
                            }, transaction).NotNull();
                        }
                        catch (SqliteException ex) when(ex.SqliteErrorCode == _SqliteConstraintViolationErrorCode)
                        {
                            // ignored
                        }
                    }

                    transaction.Commit();
                }
            }
        }
Пример #6
0
        private void Provision(string connection, Type migration)
        {
            _log.LogInformation($"Provisioning {migration.FullName}");
            var assembly = System.Reflection.Assembly.GetAssembly(migration);

            _log.LogInformation($"Creating db");
            _creator.Create(_config.MasterConnectionString, connection);

            _log.LogInformation($"Migrating db");
            _migrator.Migrate(connection, assembly);

            _log.LogInformation($"Provisioned {migration.FullName}");
        }
        public void ParametersAndFiltersTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            config.AddScriptsLocation(Assembly.GetExecutingAssembly(), "TemplateTestScripts");

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            PendingItem script = dbAccessFacade.ClasspathScripts.First(s => s.Version.Equals("201701171635"));

            Assert.NotNull(script);

            Assert.True(script.Content.ToString().Contains("0x"));
        }
        public void ParametersTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            config.AddParameter("parameters_test_key_1", "col1");
            config.AddParameter("parameters_test_key_2", "col2");

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            PendingItem script = dbAccessFacade.ClasspathScripts.First(s => s.Version.Equals("201606201610"));

            Assert.NotNull(script);

            Assert.True(script.Content.ToString().Contains("[col1]"));
            Assert.True(script.Content.ToString().Contains("[col2]"));
            Assert.False(script.Content.ToString().Contains("{{parameters_test_key_1}}"));
            Assert.False(script.Content.ToString().Contains("{{parameters_test_key_2}}"));
        }
        public void UpdateSchemaTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            dbAccessFacade.DbItems.Add(new AppliedItem
            {
                Id       = "201606201607",
                Type     = ItemType.Versioned,
                Version  = "201606201607",
                Name     = "V2016.06.20_1607_test1.sql",
                Executed = DateTime.Now,
                Checksum = "2e542df38430899677f99ce8be5b97a6"
            });

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            Assert.True(dbAccessFacade.DbItems.Count == 5);
            Assert.True(dbAccessFacade.AppliedItems.Count == 4);
        }
        public void RepeatableScriptsNoReapplyTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            dbAccessFacade.DbItems.Add(new AppliedItem
            {
                Id       = "201606201701",
                Type     = ItemType.Repeatable,
                Version  = "201606201701",
                Name     = "R2016.06.20_1701_repeatable_test2.sql",
                Executed = DateTime.Now,
                Checksum = "470f6a50c4fd0323b2dc95be00ab72e1"
            });

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            Assert.True(dbAccessFacade.DbItems.Count == 1);
            Assert.True(dbAccessFacade.AppliedItems.Count == 0);
        }
        public void RepeatableScriptsReapplyTest()
        {
            DbAccessFacadeMock dbAccessFacade = new DbAccessFacadeMock();

            dbAccessFacade.DbItems.Add(new AppliedItem
            {
                Id       = "201606201701",
                Type     = ItemType.Repeatable,
                Version  = "201606201701",
                Name     = "R2016.06.20_1701_repeatable_test2.sql",
                Executed = DateTime.Now,
                Checksum = "2e542df38430899677f99ce8be5b97a7"
            });

            IDatabaseMigrator migrator = DatabaseMigratorBuilder.Build(config, dbAccessFacade);

            migrator.Migrate(new SqlConnection());

            Assert.True(dbAccessFacade.DbItems.Count == 1);
            Assert.True(dbAccessFacade.AppliedItems.Count == 1);
        }
Пример #12
0
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDatabaseMigrator databaseMigrator)
        {
            Activity.DefaultIdFormat = ActivityIdFormat.W3C;

            databaseMigrator.Migrate();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseConfiguredSwagger();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
Пример #13
0
 public void Initialize(IStore store)
 {
     _migrator.Migrate(store);
 }
Пример #14
0
            public async Task <Unit> Handle(MigrateDatabaseRequest request, CancellationToken cancellationToken)
            {
                await _migrator.Migrate();

                return(Unit.Value);
            }