+#! @BASH@
+###
+### Backup script
+###
+### (c) 2012 Mark Wooding
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the `rsync-backup' program.
+###
+### rsync-backup is free software; you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or
+### (at your option) any later version.
+###
+### rsync-backup is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with rsync-backup; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+set -e
+
+mkdir -p @pkglocalstatedir@
+INDEXDB=@pkglocalstatedir@/index.db
+: ${STOREDIR=@mntbkpdir@/store}
+: ${METADIR=@mntbkpdir@/meta}
+
+if [ ! -f $STOREDIR/.rsync-backup-store ]; then
+ echo >&2 "$quis: no backup volume mounted"
+ exit 15
+fi
+: ${VOLUME=$(cat $METADIR/volume)}
+
+## If the database exists then we're OK. (This will turn into a version
+## check and upgrade if the schema changes.)
+if [ ! -f "$INDEXDB" ]; then
+
+ ## Create the database.
+ rm -f "$INDEXDB.new"
+ sqlite3 "$INDEXDB.new" <<EOF
+CREATE TABLE meta (
+ version INTEGER NOT NULL);
+INSERT INTO meta (version) VALUES (0);
+
+CREATE TABLE idx (
+ host TEXT NOT NULL,
+ fs TEXT NOT NULL,
+ date TEXT NOT NULL,
+ vol TEXT NOT NULL,
+ PRIMARY KEY (host, fs, date));
+CREATE INDEX idx_byvol ON idx (vol);
+EOF
+
+ ## Done.
+ mv "$INDEXDB.new" "$INDEXDB"
+fi
+
+{
+ ## Do everything in a single transaction. SQLite is pretty good at this,
+ ## and also it'll avoid updating the database until it sees a `COMMIT'
+ ## command, so if we fail halfway through we're still OK. So it's safe to
+ ## start by removing all of the current records referring to this volume.
+ cat <<EOF
+BEGIN;
+DELETE FROM idx WHERE vol = '$VOLUME';
+EOF
+
+ ## Now work through the various filesystems. This is a slightly cheesy way
+ ## of finding them.
+ for i in $STOREDIR/*/*/last; do
+
+ ## Parse out the host and filesystem names.
+ i=${i%/*}
+ fs=${i##*/} i=${i%/*}
+ host=${i##*/} i=${i%/*}
+
+ ## And work through the date list.
+ for j in $STOREDIR/$host/$fs/*; do
+ if [ -L "$j" ] || [ ! -d "$j" ]; then continue; fi
+ j=${j%/}
+ date=${j##*/}
+ cat <<EOF
+INSERT INTO idx (host, fs, date, vol)
+ VALUES ('$host', '$fs', '$date', '$VOLUME');
+EOF
+ done
+ done
+
+ ## Done.
+ cat <<EOF
+COMMIT;
+EOF
+} | sqlite3 "$INDEXDB"
+
+###----- That's all, folks --------------------------------------------------