website/build/init/init
2024-05-24 09:05:42 -04:00

108 lines
1.7 KiB
Bash
Executable file

#!/bin/sh
errors=$(mktemp)
step() {
printf '\x1b[34;1m>> %s\x1b[0m\n' "$*"
}
error() {
{
printf '\x1b[31;1merror: \x1b[0m%s\n' "$*";
grep -v 'current transaction is aborted' < "$errors";
printf "\x1b[31m;1error: \x1b[0mAborting migrations, fix file(s) then restart process.";
} 1>&2;
}
try() {
"$@" 2> "$errors";
count=$(grep -c 'ERROR' < "$errors")
if [ "$count" -eq 0 ]; then
return 0;
else
return 1;
fi
}
export PGPASSWORD="$POSTGRES_PASSWORD"
psql() {
/usr/bin/psql \
-h db \
-p 5432 \
-d "$POSTGRES_DB" \
-U "$POSTGRES_USER" \
"$@"
}
pg_isready() {
/usr/bin/pg_isready \
-h db \
-p 5432 \
-d "$POSTGRES_DB" \
-U "$POSTGRES_USER"
}
curr_revision() {
psql -qtAX -f /db/rev.sql;
}
wait_until_ready() {
step 'Checking if the database is ready...';
while true; do
pg_isready;
code=$?;
if [ $code -eq 0 ]; then
break;
fi
sleep 3;
done
}
run_migrations() {
i="$1"
while true; do
name=$(printf "%04d" "$i");
file="/db/migrations/$name.sql"
if [ -f "$file" ]; then
if try psql -f "$file"; then
i=$((i+1));
continue;
else
error "An error occoured during a migration (rev $name)"
return 1;
fi
else
return 0;
fi
done
}
init () {
# reomve ready status
# so php ignores requests
rm -f /status/ready
step 'Waiting for database';
# make sure the database is running
# before we run any requests
wait_until_ready;
step 'Database ready';
step 'Peforming migrations';
# get the current revision
REV=$(curr_revision);
step "Database at revision: $REV"
# run each migration that is
# higher than our current revision
if ! run_migrations "$REV"; then
return 1;
fi
step 'Database is initialized'
# database is ready
touch /status/ready
}
init
rm "$errors"