private void CreateDb(string catalog, TenantDatabaseCreationExpressions config, bool dropExisting, string maintenanceDb) { var cmdText = string.Empty; if (dropExisting) { if (config.KillConnections) { cmdText = $"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '{catalog}' AND pid <> pg_backend_pid();"; } cmdText += $"DROP DATABASE IF EXISTS \"{catalog}\";"; } using (var connection = new NpgsqlConnection(maintenanceDb)) using (var cmd = connection.CreateCommand(cmdText)) { cmd.CommandText += $"CREATE DATABASE \"{catalog}\" WITH" + config; connection.Open(); try { cmd.ExecuteNonQuery(); config.OnDbCreated?.Invoke(connection); } finally { connection.Close(); connection.Dispose(); } } }
public ITenantDatabaseCreationExpressions ForTenant(string tenantId = Tenancy.DefaultTenantId) { var configurator = new TenantDatabaseCreationExpressions(); _configurationPerTenant.Add(tenantId, configurator); return(configurator); }
private void CreateDb(ITenant tenant, TenantDatabaseCreationExpressions config) { string catalog; var maintenanceDb = _maintenanceDbConnectionString; using (var t = tenant.CreateConnection()) { catalog = t.Database; if (maintenanceDb == null) { var cstringBuilder = new NpgsqlConnectionStringBuilder(t.ConnectionString); cstringBuilder.Database = "postgres"; maintenanceDb = cstringBuilder.ToString(); } var noExistingDb = config.CheckAgainstCatalog ? new Func <bool>(() => IsNotInPgDatabase(catalog, maintenanceDb)) : (() => CannotConnectDueToInvalidCatalog(t)); if (noExistingDb()) { CreateDb(catalog, config, false, maintenanceDb); return; } } if (config.DropExistingDatabase) { CreateDb(catalog, config, true, maintenanceDb); } }