You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

106 lines
2.8 KiB

# -*- 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 </dev/null || return 1
## XXXvlab: Here we should have been able to use this, but
## pgm requires the ``prefix_pg_local_command=' '`` hack. As
## soon this is fixed, we can re
#dcmd /bin/sh pgm "$@"
echo docker run -i --rm \
$db_docker_opts -e prefix_pg_local_command=' ' \
--entrypoint pgm "$DOCKER_BASE_IMAGE" $db_cmd_opts "$@" >&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"
}