#!/bin/sh set -euo pipefail usage() { cat <<-'EOF' Usage: datomic backup DBFILE TODIR datomic gc DBFILE EOF } ACTION="${1:-}" DBFILE="${2:-}" TODIR="${3:-}" if [ -z "$ACTION" ]; then echo 'Missing ACTION.' >&2 usage >&2 exit 2 fi if [ -z "$DBFILE" ]; then echo 'Missing DBFILE.' >&2 usage >&2 exit 2 fi if [ "$ACTION" = 'backup' ] && [ -z "$TODIR" ]; then echo 'Missing TODIR.' >&2 usage >&2 exit 2 fi lastroot() ( cd "$TODIR"/datomic/roots find * | sort -n | tail -n1 ) backupcmd() { java \ -server \ -Xms4g \ -Xmx4g \ --class-path '@SYSCONFDIR@/:@JAVADIR@/*' \ clojure.main \ -m backup \ "$@" } case "$ACTION" in (backup) backupcmd backup datomic:sql://app?jdbc:sqlite:"$DBFILE" file:"$TODIR"/datomic backupcmd verify file:"$TODIR"/datomic true "$(lastroot)" sqlite3 "$DBFILE" ".backup '$TODIR/sqlite.db'" { sqlite3 "$DBFILE" .dump > "$TODIR"/dump.sql.next mv "$TODIR"/dump.sql.next "$TODIR"/dump.sql } { sqlite3 "$TODIR"/restored.db < @SYSCONFDIR@/init.sql > /dev/null backupcmd restore file:"$TODIR"/datomic datomic:sql://app?jdbc:sqlite:"$TODIR"/restored.db } ;; (gc) exec java \ -server \ -Xms4g \ -Xmx4g \ --class-path '@SYSCONFDIR@/:@JAVADIR@/*' \ clojure.main \ -m datomic.tools.gc-db \ datomic:sql://app?jdbc:sqlite:"$DBFILE" \ "$(date --date="$(date +'%Y-%m-01') - 3 months" -Is)" ;; (*) printf 'Bad ACTION: "%s"\n' "$ACTION" >&2 usage >&2 exit 2 ;; esac