#!/bin/sh

PSQL="/usr/bin/psql"

free_megs() {
	fsdir=$1
	while [ ! -d "$fsdir" ]; do
		fsdir=$(dirname $fsdir)
	done
	df -m $fsdir | while read fs bl us av cap mnt; do [ "$av" = "Available" ] || echo $av; done
}

pg_init_data() {
	# make sure we got at least 50MB of free space
	[ $(free_megs $1) -lt 50 ] && return 1
	pg_ctl initdb -U postgres -D $1
}

pg_server_ready() {
	t=0
	while [ $t -le 90 ]; do
		pg_ctl status -U postgres -D $1 2>/dev/null >/dev/null && return 0
		t=$((t+1))
		sleep 1
	done
	return 1
}

# $1: dbname, $2: username, $3: password
pg_require_db() {
	pg_test_db $@ && return 0
	( echo "CREATE DATABASE $1;"
	echo -n "CREATE USER $2"
	[ "$3" ] && echo -n " WITH PASSWORD '$3'"
	echo ";"
	echo "GRANT ALL PRIVILEGES ON DATABASE \"$1\" to $2;" ) |
		$PSQL -U postgres -d template1 -e
	return $?
}

pg_test_db() {
	PGPASSWORD=$3
	echo "SHOW ALL;" | $PSQL -U $2 -d $1 -q 2>/dev/null >/dev/null
	return $?
}

uci_require_db() {
	local dbname dbuser dbpass
	config_get dbname $1 name
	config_get dbuser $1 user
	config_get dbpass $1 pass
	pg_require_db $dbname $dbuser $dbpass
}

[ "$1" = "init" ] && {
	. /lib/functions.sh
	pg_server_ready $2 || exit 1
	config_load postgresql
	config_foreach uci_require_db postgres-db
}