# -*- mode: shell-script -*- include pretty export DB_NAME="postgres" export DB_DATADIR=/var/lib/postgresql/data export DB_PASSFILE=/root/.pgpass is_db_locked() { is_volume_used "$DATASTORE/${SERVICE_NAME}" } _set_db_params() { local docker_ip="$1" docker_network="$2" export db_docker_opts="--network $docker_network -e PGHOST=$docker_ip -e PGUSER=postgres" export db_cmd_opts= } ddb () { dcmd psql -qAt "$@"; } ## ## Entrypoints ## db_drop () { local dbname="$1" dcmd dropdb --if-exists "$1" } db_create () { local dbname="$1" dcmd createdb "$dbname" || return 1 info "Database '$dbname' created." if [ "$POSTGIS" ]; then ddb -d "$dbname" < <(echo "CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology;") || return 1 dcmd /bin/bash -c "psql -d '$dbname' -f /usr/share/postgresql/*/contrib/postgis-2.1/legacy.sql" || return 1 info "Installed postgis extensions on database '$dbname'." fi if [ "$UNACCENT" ]; then ddb -d "$dbname" < <(echo "CREATE EXTENSION IF NOT EXISTS unaccent;") || return 1 info "Installed unaccent extension on database '$dbname'." fi } ## XXXvlab: if launched first, it'll fail handling correctly the open/close of docker db_has_database() { local dbname="$1" if [ "$(ddb < <(echo "SELECT 1 FROM pg_database WHERE datname = '$dbname'"))" ]; then debug "Database $dbname exists." return 0 else debug "Database $dbname exists." return 1 fi } ## XXXvlab: if launched first, it'll fail handling correctly the open/close of docker db_has_user() { local user="$1" users users=$(ddb < <(echo "select u.usename from pg_catalog.pg_user u")) || { err "Failed to get user list" return 1 } echo "$users" | grep "^${user}$" >/dev/null 2>&1 } db_create_user() { local user="$1" password="$2" ## Using this instead of pipes is important so that trap works ddb < <(echo "CREATE USER $user WITH PASSWORD '$password' CREATEDB NOCREATEROLE;") } db_change_password() { local user="$1" password="$2" ## Using this instead of pipes is important so that trap works ddb < <(echo "ALTER USER $user WITH PASSWORD '$password';") } PGM() { ensure_db_docker_running &2 docker run -i --rm \ $db_docker_opts -e prefix_pg_local_command=' ' \ --entrypoint pgm "$DOCKER_BASE_IMAGE" $db_cmd_opts "$@" } db_grant_rights () { local dbname="$1" user="$2" PGM chown "$user" "$dbname" }