#!/bin/bash PSQL_ROOT_PWD_FILE=/etc/yunohost/psql PSQL_VERSION=13 # Run SQL instructions in a database ($db_name by default) # # usage: ynh_psql_db_shell database <<< "instructions" # | arg: database - the database to connect to (by default, $db_name) # # examples: # ynh_psql_db_shell $db_name <<< "UPDATE ...;" # ynh_psql_db_shell < /path/to/file.sql # ynh_psql_db_shell() { local database="${1:-$db_name}" sudo --login --user=postgres psql "$database" } # Create a database and grant optionnaly privilegies to a user # # [internal] ... handled by the core / "database resource" # # usage: ynh_psql_create_db db [user] # | arg: db - the database name to create # | arg: user - the user to grant privilegies # ynh_psql_create_db() { local db=$1 local user=${2:-} local sql="CREATE DATABASE ${db};" # grant all privilegies to user if [ -n "$user" ]; then sql+="ALTER DATABASE ${db} OWNER TO ${user};" sql+="GRANT ALL PRIVILEGES ON DATABASE ${db} TO ${user} WITH GRANT OPTION;" fi sudo --login --user=postgres psql <<< "$sql" } # Drop a database # # [internal] ... handled by the core / "database resource" # # If you intend to drop the database *and* the associated user, # consider using ynh_psql_remove_db instead. # # usage: ynh_psql_drop_db db # | arg: db - the database name to drop # ynh_psql_drop_db() { local db=$1 # First, force disconnection of all clients connected to the database # https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db sudo --login --user=postgres psql $db <<< "REVOKE CONNECT ON DATABASE $db FROM public;" sudo --login --user=postgres psql $db <<< "SELECT pg_terminate_backend (pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$db' AND pid <> pg_backend_pid();" sudo --login --user=postgres dropdb $db } # Dump a database # # usage: ynh_psql_dump_db database # | arg: database - the database name to dump (by default, $db_name) # | ret: the psqldump output # # example: ynh_psql_dump_db 'roundcube' > ./dump.sql # ynh_psql_dump_db() { local database="${1:-$db_name}" sudo --login --user=postgres pg_dump "$database" } # Create a user # # [internal] ... handled by the core / "database resource" # # usage: ynh_psql_create_user user pwd # | arg: user - the user name to create # | arg: pwd - the password to identify user by # ynh_psql_create_user() { local user=$1 local pwd=$2 sudo --login --user=postgres psql <<< "CREATE USER $user WITH ENCRYPTED PASSWORD '$pwd'" } # Check if a psql user exists # # [internal] # # usage: ynh_psql_user_exists user # | arg: user= - the user for which to check existence # | exit: Return 1 if the user doesn't exist, 0 otherwise # ynh_psql_user_exists() { local user=$1 sudo --login --user=postgres psql -tAc "SELECT rolname FROM pg_roles WHERE rolname='$user';" | grep --quiet "$user" } # Check if a psql database exists # # [internal] # # usage: ynh_psql_database_exists database # | arg: database - the database for which to check existence # | exit: Return 1 if the database doesn't exist, 0 otherwise # ynh_psql_database_exists() { local database=$1 sudo --login --user=postgres psql -tAc "SELECT datname FROM pg_database WHERE datname='$database';" | grep --quiet "$database" } # Drop a user # # [internal] ... handled by the core / "database resource" # # usage: ynh_psql_drop_user user # | arg: user - the user name to drop # ynh_psql_drop_user() { sudo --login --user=postgres psql <<< "DROP USER ${1};" }