#!/bin/bash
set -e
# Must be run as (a) Postgres super user
SQL_INIT=swh-init.sql
SQL_ENUMS=swh-enums.sql
SQL_SCHEMA=swh-schema.sql
SQL_FUNC=swh-func.sql
SQL_INDEX=swh-indexes.sql
SQL_TRIGGER=swh-triggers.sql
SQL_DATA=swh-data.sql
ROOT_SQLS="$SQL_INIT"
USER_SQLS="$SQL_ENUMS $SQL_SCHEMA $SQL_FUNC $SQL_INDEX $SQL_TRIGGER $SQL_DATA"
SQLS="$ROOT_SQLS $USER_SQLS"
DB_ENCODING="UTF-8"
DB_LOCALE="C.UTF-8"
DB_TEMPLATE="template0"
if ! [ -f "$SQL_INIT" ] ; then
echo "Cannot find $SQL_INIT. Abort."
echo "Note: db-init should usually be run from swh-storage/sql as bin/db-init."
exit 2
fi
if [ -z "$1" -o -z "$2" -o -z "$3" ] ; then
echo "Usage: bin/db-init DB_PORT DB_NAME DB_USER"
echo "Example: bin/db-init 5432 softwareheritage-dev swhdev"
echo "Note: DB_NAME should not exist and will be created; DB_USER can exist."
exit 2
fi
db_port="$1"
db_name="$2"
db_user="$3"
conn_flags="--port ${db_port}"
echo "I: creating Postgres user ${db_user} ..."
createuser $conn_flags --pwprompt "$db_user" || true
echo "I: creating Postgres database ${db_name} ..."
createdb $conn_flags \
--encoding "$DB_ENCODING" --locale "$DB_LOCALE" \
--template "$DB_TEMPLATE" \
--owner "$db_user" "$db_name"
sqls_flags=''
for f in $SQLS ; do
sqls_flags="${sqls_flags} --file ${f}"
done
echo "I: initializing DB ${db_name} ..."
psql $conn_flags ${sqls_flags} "$db_name"
echo "I: granting privileges to user ${db_user} on DB ${db_name} ..."
echo "grant all privileges on all tables in schema public to ${db_user}" | \
psql $conn_flags "$db_name"
echo "grant all privileges on all sequences in schema public to ${db_user}" | \
psql $conn_flags "$db_name"
echo "I: all done."