package main
import (
"context"
"fmt"
"strings"
"github.com/jackc/pgx/v5"
)
func initializeDatabase(ctx context.Context, dsn string) error {
cfg, err := pgx.ParseConfig(dsn)
if err != nil {
return err
}
name := cfg.Database
if !strings.HasPrefix(name, "assignment_harness_") {
return fmt.Errorf("database must use assignment_harness_ prefix")
}
cfg.Database = "postgres"
c, err := pgx.ConnectConfig(ctx, cfg)
if err != nil {
return err
}
defer c.Close(ctx)
var exists bool
if err = c.QueryRow(ctx, `SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname=$1)`, name).Scan(&exists); err != nil {
return err
}
if exists {
target, err := openDB(ctx, dsn)
if err != nil {
return err
}
defer target.Close(ctx)
if err = guard(ctx, target); err != nil {
return fmt.Errorf("existing database is unmarked; refusing to manage it: %w", err)
}
return nil
}
_, err = c.Exec(ctx, "CREATE DATABASE "+pgx.Identifier{name}.Sanitize())
return err
}
func databaseURL(value string) string {
if value == "" {
return "dbname=assignment_harness_native"
}
return value
}