status-go/postgres/helpers.go

65 lines
1.5 KiB
Go

package postgres
import (
"database/sql"
"fmt"
"os"
// Import postgres driver
_ "github.com/lib/pq"
)
var (
DefaultTestDBHost = GetEnvDefault("TEST_POSTGRES_HOST", "localhost")
DefaultTestDBPort = GetEnvDefault("TEST_POSTGRES_PORT", "5432")
DefaultTestURI = fmt.Sprintf("postgres://postgres@%s:%s/postgres?sslmode=disable", DefaultTestDBHost, DefaultTestDBPort)
DropTableURI = fmt.Sprintf("postgres://postgres@%s:%s/template1?sslmode=disable", DefaultTestDBHost, DefaultTestDBPort)
)
func GetEnvDefault(key, fallback string) string {
value := os.Getenv(key)
if len(value) == 0 {
return fallback
}
return value
}
func ResetDefaultTestPostgresDB() error {
db, err := sql.Open("postgres", DropTableURI)
if err != nil {
return err
}
defer func() {
_ = db.Close()
}()
// Drop current and prevent any future connections. Used in tests. Details here:
// https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db
_, err = db.Exec("REVOKE CONNECT ON DATABASE postgres FROM public;")
if err != nil {
return err
}
_, err = db.Exec("SELECT pid, pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'postgres' AND pid <> pg_backend_pid();")
if err != nil {
return err
}
_, err = db.Exec("DROP DATABASE IF EXISTS postgres;")
if err != nil {
return err
}
_, err = db.Exec("CREATE DATABASE postgres;")
if err != nil {
return err
}
_, err = db.Exec("GRANT CONNECT ON DATABASE postgres TO public;")
if err != nil {
return err
}
return nil
}