Created
December 25, 2019 07:51
-
-
Save szg251/778168885a5c0328136504d4345c642d to your computer and use it in GitHub Desktop.
PostgreSQL setup script for nix-shell
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
trap_stack_name() { | |
local sig=''${1//[^a-zA-Z0-9]/_} | |
echo "__trap_stack_$sig" | |
} | |
extract_trap() { | |
echo ''${@:3:$(($#-3))} | |
} | |
get_trap() { | |
eval echo $(extract_trap `trap -p $1`) | |
} | |
trap_push() { | |
local new_trap=$1 | |
shift | |
local sigs=$* | |
for sig in $sigs; do | |
local stack_name=`trap_stack_name "$sig"` | |
local old_trap=$(get_trap $sig) | |
eval "''${stack_name}"'[''${#'"''${stack_name}"'[@]}]=$old_trap' | |
trap "''${new_trap}" "$sig" | |
done | |
} | |
trap_prepend() { | |
local new_trap=$1 | |
shift | |
local sigs=$* | |
for sig in $sigs; do | |
if [[ -z $(get_trap $sig) ]]; then | |
trap_push "$new_trap" "$sig" | |
else | |
trap_push "$new_trap ; $(get_trap $sig)" "$sig" | |
fi | |
done | |
} | |
function initPG() { | |
${nixpkgs.lib.optionalString nixpkgs.stdenv.isDarwin "export TMPDIR=/tmp"} | |
${nixpkgs.lib.optionalString (!nixpkgs.stdenv.isDarwin) "export LANG=C.UTF-8"} | |
${nixpkgs.lib.optionalString (!nixpkgs.stdenv.isDarwin) "export LC_ALL=C.UTF-8"} | |
${nixpkgs.lib.optionalString (!nixpkgs.stdenv.isDarwin) "export LC_CTYPE=C.UTF-8"} | |
export TZ='UTC' | |
export PGHOST=$(mktemp -d) | |
export PGDATA=$(pwd)/.postgres | |
export PGSOCK=$PGHOST/.s.PGSQL.$PGPORT | |
# We set these environment variables so postgresql-typed knows how | |
# to connect to the database at compile-time to make sure all SQL | |
# queries are well typed and well formed | |
export TPG_SOCK=$PGSOCK | |
export TPG_DB=$PGDATABASE | |
export TPG_USER=$PGUSER | |
# | |
${pg}/bin/initdb -E UTF8 $PGDATA | |
# avoid conflicts on travis and elsewhere | |
echo "port = $PGPORT" >> $PGDATA/postgresql.conf | |
${pg}/bin/postgres -D $PGDATA -k $PGHOST & | |
echo -n "Waiting for database to start up..." | |
while [[ ! -e $PGSOCK ]]; do sleep 0.1; done | |
${pg}/bin/createuser -h $PGHOST -U $(id -u --name) -s $PGUSER | |
${pg}/bin/createdb -h $PGHOST -O $PGUSER $PGDATABASE | |
echo "Created database PGDATABASE=$PGDATABASE at PGHOST=$PGHOST." | |
echo "Call killPG to stop and delete it. Call initPG to re-create it" | |
} | |
function killPG() { | |
echo "Killing postgres database at $PGHOST" | |
pg_ctl stop || true | |
echo "Waiting for postgres database to die ..." | |
while [[ -e $PGSOCK ]]; do sleep 0.1; done | |
echo "Postgres is dead, deleting its data dir" | |
rm -rf $PGHOST | |
} | |
function reinitPG { | |
killPG && initPG | |
} | |
# export the functions so they're available in the development nix-shell | |
# so the database can be re-created easly | |
export -f initPG | |
export -f killPG | |
export -f reinitPG | |
trap_prepend "killPG" EXIT |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment