#!/bin/sh

#	bf_copy

set -e # barf on errors

compact=0
while test "$1" ; do
    case "$1" in
	-c) compact=1 ;;
	-*) echo "unknown option $1" >&2 ; exit 1 ;;
	*) break;
    esac
    shift
done

if [ $# -ne 2 ] ; then
    echo 2>&1 usage: db_copy [-c] source_dir dest_dir
    echo 2>&1 -c means: only copy active logs, not all
    exit 1
fi

SRC="$1"
DST="$2"

# flush mempools
db_checkpoint -1h "$SRC" || :

mkdir "$DST"

f=bfc.$$.unneeded
rm -f $f
trap "rm -rf $f \"$DST\"" 0
if test $compact -eq 1 ; then
  # don't copy unneeded logs
  db_archive -h "$SRC" >$f
else
  : >$f
fi
logs=`ls "$SRC"/log.* | grep -v -F -f $f`
if test "$logs" ; then cp -p $logs "$DST" ; fi
env=`ls "$SRC"/__db.* || :`
if test "$env" ; then cp -p $env "$DST" ; fi
if test -f "$SRC"/DB_CONFIG ; then cp -p "$SRC"/DB_CONFIG "$DST" ; fi

for FILE in "$SRC"/*.db ; do
    NAME=`basename $FILE`
    SIZE=`db_stat -h "$SRC" -d $NAME | awk '/page size/ {print $1}'`
    dd bs=$SIZE if="$FILE" of="$DST/"`basename "$FILE"`
done

db_recover -h "$DST"
rm -f $f
trap - 0
