Exemplo n.º 1
0
        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();
                    }
                }
        }
Exemplo n.º 2
0
        public ITenantDatabaseCreationExpressions ForTenant(string tenantId = Tenancy.DefaultTenantId)
        {
            var configurator = new TenantDatabaseCreationExpressions();

            _configurationPerTenant.Add(tenantId, configurator);
            return(configurator);
        }
Exemplo n.º 3
0
        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);
            }
        }