From 3dd843c80c051987f957df9d19fa74119be9659a Mon Sep 17 00:00:00 2001 From: Stefan Kreutz Date: Thu, 19 May 2022 09:58:22 +0200 Subject: Add existing implementation --- temp-postgres.sh | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100755 temp-postgres.sh 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 +# +# 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 \\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}" &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 -- cgit v1.2.3