SIP2: Return slightly more hold info
[working/Evergreen.git] / build / tools / update_db.sh
old mode 100644 (file)
new mode 100755 (executable)
index d0c1f37..e93431c
@@ -25,7 +25,7 @@ PARAMETERS:
   db_user - database username
   db_name - database name
     
-Run from your source repository Open-ILS/src/sql/Pg directory.
+Run from your source repository root or Open-ILS/src/sql/Pg directory.
 
 You will be prompted for the postgres password if necessary.
 
@@ -55,23 +55,47 @@ function feedback() {
 
 PSQL_ACCESS="-h $DB_HOST -U $DB_USER $DB_NAME";
 
-VERSION=$(psql -c "select max(version) from config.upgrade_log" -t $PSQL_ACCESS);
+# Find the current version of Evergreen, which is the installed version to which the upgrade script is being applied
+EGVERSION=$(eg_config --version|cut -f2 -d' ');
+[  $? -gt 0  ] && die "Could not find eg_config, please make sure it is in your path.";
+[  -z "$EGVERSION"  ] && die "Could not determine Evergreen version from eg_config.";
+
+# Need to avoid versions like '1.6.0.4' from throwing off the upgrade
+VERSION=$(psql -c "SELECT MAX(version) FROM config.upgrade_log WHERE version ~ E'^\\\\d+$'" -t $PSQL_ACCESS);
 [  $? -gt 0  ] && die "Database access failed.";
 # [ $VERBOSE ] && echo RAW VERSION: $VERSION     # TODO: for verbose mode
 VERSION=$(echo $VERSION | sed -e 's/^ *0*//');    # This is a separate step so we can check $? above.
 [ -z "$VERSION" ] && usage_die "config.upgrade_log missing ANY installed version data!";
-echo "* Last installed version -> $VERSION";
+echo "* Last installed version  ->  $VERSION";
 
+if [ -d ./Open-ILS/src/sql/Pg ] ; then
+    cd ./Open-ILS/src/sql/Pg ;
+fi
 [ -d ./upgrade ] || usage_die "No ./upgrade directory found.  Please run from Open-ILS/src/sql/Pg";
 
+MAX=$(ls upgrade/[0-9][0-9][0-9][0-9]* 2>/dev/null | tail -1 | cut -c9-12 );   # could take an optional arg to set this, if we wanted.
+echo "* Last upgrade file found -> $MAX";
+MAX=$(echo $MAX | sed -e 's/^ *0*//');      # remove leading zeroes
+
 declare -a FILES;
+declare -a SKIPPED;
 while true; do
     VERSION=$(($VERSION + 1));
+    [ $VERSION -gt $MAX ] && break;
     PREFIX=$(printf "%0.4d" $VERSION);
     FILE=$(ls upgrade/$PREFIX* 2>/dev/null);
-    [ ! -f "$FILE" ] && break;
-    FILES[${#FILES[@]}]=$FILE;      # "push" onto FILES array
-    echo "* Pending $FILE";
+    if [ -f "$FILE" ] ; then
+        # Note: we only report skipped files once we find the next one.  
+        # Otherwise, we'd report everything from $VERSION+1 to $MAX
+        for skip in ${SKIPPED[@]} ; do
+            echo "* WARNING: Upgrade $skip NOT FOUND.  Skipping it."; 
+        done
+        SKIPPED=();                     # After we reported them, reset array.
+        FILES[${#FILES[@]}]=$FILE;      # "push" onto FILES array
+        # echo "* Pending $FILE";
+    else
+        SKIPPED[${#SKIPPED[@]}]=$PREFIX; # "push" onto SKIPPED array
+    fi
 done;
 
 COUNT=${#FILES[@]};
@@ -82,7 +106,7 @@ if [ $COUNT -gt 0 ] ; then
     for (( i=0; i<$COUNT; i++ )) ; do
         echo "* Applying ${FILES[$i]}" >&3;   # to the main script STDOUT
         cat ${FILES[$i]};                     # to the psql pipe
-    done | psql $PSQL_ACCESS ;
+    done | psql --set=eg_version="'$EGVERSION'" $PSQL_ACCESS ;
 else
     echo "* Nothing to update";
 fi