aboutsummaryrefslogtreecommitdiff
path: root/nix/dbinit.sh
diff options
context:
space:
mode:
Diffstat (limited to 'nix/dbinit.sh')
-rwxr-xr-xnix/dbinit.sh49
1 files changed, 49 insertions, 0 deletions
diff --git a/nix/dbinit.sh b/nix/dbinit.sh
new file mode 100755
index 0000000..9ca7481
--- /dev/null
+++ b/nix/dbinit.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+PSQL=$1
+DB=$2
+DB_USER=$3
+
+echo 'creating role, database, assigning owner...'
+
+"$PSQL" <<EOF
+DO \$\$
+BEGIN
+CREATE ROLE $DB_USER WITH LOGIN;
+EXCEPTION WHEN duplicate_object THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
+END
+\$$;
+
+SELECT 'CREATE DATABASE $DB'
+WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DB')\gexec
+
+ALTER DATABASE $DB OWNER TO $DB_USER;
+EOF
+
+echo 'echo creating pgcrypto extension...'
+
+"$PSQL" -c "CREATE EXTENSION IF NOT EXISTS pgcrypto;" "$DB"
+
+readarray -t TABLES < <("$PSQL" -qAt -c "SELECT tablename FROM pg_tables WHERE schemaname = 'public';" "$DB")
+readarray -t SEQUENCES < <("$PSQL" -qAt -c "SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public';" "$DB")
+readarray -t VIEWS < <("$PSQL" -qAt -c "SELECT table_name FROM information_schema.views WHERE table_schema = 'public';" "$DB")
+
+cat <<EOF >&2
+patching owner:
+ tables: ${TABLES[*]}
+ sequences: ${SEQUENCES[*]}
+ views: ${VIEWS[*]}
+EOF
+
+STMT=""
+
+for tbl in "${TABLES[@]}" "${SEQUENCES[@]}" "${VIEWS[@]}"; do
+ STMT+="ALTER TABLE \"$tbl\" OWNER TO $DB_USER;"
+ STMT+=$'\n'
+done
+
+"$PSQL" -c "$STMT" "$DB"
+
+echo "success"