#!/bin/bash abort () { cat <<'EOF' _ _ _ _ / \ __ _| |__ | | | / _ \ / _` | '_ \| | | / ___ \ (_| | | | |_|_| /_/ \_\__, |_| |_(_|_) |___/ EOF cat <& /dev/null exit 1 } usage () { cat < [ []]] Actualiza una base de datos de PAPO versión 0.1.30 ó posterior. Como siempre, NO HAY GARANTIA DE QUE NO SE PIERDAN DATOS, y recomendamos correr el script primero contra una base de datos de prueba, y hacer un backup antes de convertir una base de producción. EOF exit } BASE="${1:-papo}" USER="${2:-papo}" HOST="${3:-localhost}" DB="psql -q -A -t -v ON_ERROR_STOP=1 -h $HOST -U $USER $BASE" echo '\d' | $DB > /dev/null || usage $DB -c 'select * from __papo__ where 1=0' >& /dev/null if [ $? -ne 0 ]; then cat <& /dev/null CREATE TABLE __papo__ ( key varchar(255) primary key, value varchar(255), date timestamp default now() ); CREATE TABLE __papo_patches__ ( patch varchar(255) primary key, date timestamp default now() ); INSERT INTO __papo__ (key, value) VALUES ('version', '$PAPO_VERSION'); EOF else broken=$( $DB -c "select to_char(date, 'YYYY-MM-DD%sHH24:MI:SS%s\n') || value from __papo__ where key='BROKEN_DB'" ) if [ -n "$broken" ]; then echo "La base de datos está en un estado desconocido, y existe" echo "una muy buena posibilidad de que esté rota." printf "Esto pasó el $broken.\n" " a las " " cuando yo estaba " echo echo "por favor comunicate con papo-abusers." exit 1 fi PAPO_VERSION=$( $DB -c "select value from __papo__ where key='version'" ) fi shopt -s extglob DIR=${PAPO_VERSION%.+([0-9])}/$PAPO_VERSION while [ -d "$DIR" ]; do echo Aplicando cambios a $PAPO_VERSION: for i in $DIR/+([0-9])-*; do # don't apply backups or temps --- habrá una forma mejor de hacer esto? [ "${i%[\~\#]}" != "$i" ] && continue if $DB -c "insert into __papo_patches__ (patch) values ('$i')" >& /dev/null; then echo " voy a aplicar $i" if [ -x "$i" ]; then RES=$("$i") || abort corriendo "$i" echo "$RES" | $DB >& /dev/null || abort aplicando "$i" else $DB -f "$i" >& /dev/null || abort aplicando "$i" fi echo " ok" else echo " no voy a aplicar $i otra vez" fi done if [ -f "$DIR/__NEXT_VERSION__" ]; then PAPO_VERSION=$( cat "$DIR/__NEXT_VERSION__" ) else break fi $DB -c "update __papo__ set value='$PAPO_VERSION' where key='version';" DIR=${PAPO_VERSION%.+([0-9])}/$PAPO_VERSION done echo "No hay versiones de la base más nuevas que $PAPO_VERSION"