Skip to content

Instantly share code, notes, and snippets.

@szg251
Created December 25, 2019 07:51
Show Gist options
  • Save szg251/778168885a5c0328136504d4345c642d to your computer and use it in GitHub Desktop.
Save szg251/778168885a5c0328136504d4345c642d to your computer and use it in GitHub Desktop.
PostgreSQL setup script for nix-shell
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