diff options
author | Stefan Kreutz <mail@skreutz.com> | 2022-05-19 09:58:22 +0200 |
---|---|---|
committer | Stefan Kreutz <mail@skreutz.com> | 2022-05-19 09:58:22 +0200 |
commit | 3dd843c80c051987f957df9d19fa74119be9659a (patch) | |
tree | d0c4e86274c66e5a2e1a5d349a6e568c2dd66817 | |
download | temp-postgres-3dd843c80c051987f957df9d19fa74119be9659a.tar |
Add existing implementationtemp-postgres-0.1.0
-rwxr-xr-x | temp-postgres.sh | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/temp-postgres.sh b/temp-postgres.sh new file mode 100755 index 0000000..14d7d16 --- /dev/null +++ b/temp-postgres.sh @@ -0,0 +1,87 @@ +#! /bin/sh + +# Copyright (c) 2019-2020 Stefan Kreutz <mail@skreutz.com> +# +# Permission to use, copy, modify, and distribute this software for any purpose +# with or without fee is hereby granted, provided that the above copyright +# notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +# Run the PostgreSQL server off a temporary data directory. +# +# Expects exactly two arguments: database name and user name. You may also set +# the port by setting the environment variable PGPORT, see postgres(1). +# +# Exits 0 on SIGINT, and >0 if an error occurs. +# +# First published at https://www.skreutz.com/posts/temporary-postgresql-server/ +# on 14 October 2020. + +set -o nounset + +# Remove the temporary directory before exiting. +trap 'quit' INT +quit() { + code="${1:-0}" + trap '' INT TERM + kill -TERM 0 + wait + rm -rf "${tmpdir-}" || { + ( >&2 printf "temp-postgres: failed to remove temporary directory: %s\\n" "${tmpdir}" ) + [ "${code}" -ne 0 ] || code=1 + } + exit "${code}" +} + +# Parse arguments. +[ $# -eq 2 ] || { + ( >&2 printf "temp-postgres: invalid arguments\\n" ) + printf "Usage: temp-postgres <dbname> <username>\\n" + quit 1 +} +dbname="$1" +username="$2" + +# Create a temporary directory +tmpdir="$( mktemp -d )" || { + ( >&2 printf "temp-postgres: failed to create temporary directory\\n" ) + quit 1 +} + +# Initialize the directory +initdb --pgdata="${tmpdir}" --username="${username}" || { + ( >&2 printf "temp-postgres: failed to initialize database\\n" ) + quit 1 +} + +# Serve the directory +( postgres -k "${tmpdir}" -D "${tmpdir}" </dev/null ) & + +# Test the connection +sleep 1 +pg_isready --host="${tmpdir}" --dbname="nope" --username="${username}" --timeout=10 || { + ( >&2 printf "temp-postgres: failed to connect to server\\n" ) + quit 1 +} + +# Create the database +createdb --host="${tmpdir}" --username="${username}" --no-password "${dbname}" || { + ( >&2 printf "temp-postgres: failed to create database\\n" ) + quit 1 +} + +printf ' +Connect with the following command: + +\tpsql --host=localhost "%s" "%s" + +' "${dbname}" "${username}" + +wait |