summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtemp-postgres.sh87
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
Generated by cgit. See skreutz.com for my tech blog and contact information.