#!/usr/local/bin/perl
# backup.pl
# Called by cron to backup a database, or all databases

$no_acl_check++;
require './mysql-lib.pl';

if ($ARGV[0] eq "--all") {
	$all = 1;
	@dbs = &list_databases();
	$cmode = $config{'backup_cmode_'};
	}
else {
	$ARGV[0] || die "Missing database parameter";
	@dbs = ( $ARGV[0] );
	$cmode = 0;
	}

if ($cmode) {
	# Run and check before-backup command (for all DBs)
	$bok = &execute_before(undef, STDOUT, 0, $config{'backup_'}, undef);
	if (!$bok) {
		print STDERR "Before-backup command failed!\n";
		exit(1);
		}
	}
$ex = 0;
foreach $db (@dbs) {
	if ($all) {
		$file = &date_subs("$config{'backup_'}/$db.sql");
		}
	else {
		$file = &date_subs($config{'backup_'.$db});
		}
	if (!$file) {
		print STDERR "No backup file set for database $db\n";
		exit(1);
		}
	$drop = $config{'backup_drop_'.$db} ? "--add-drop-table" : "";
	$where = $config{'backup_where_'.$db} ?
		"\"--where=".$config{'backup_where_'.$db}."\"" : "";
	$charset = $config{'backup_charset_'.$db} ?
		"--default-character-set=".quotemeta($config{'backup_charset_'.$db}) : "";
	if (&supports_quoting()) {
		$quoting = " --quote-names";
		}
	@tables = split(/\s+/, $config{'backup_tables_'.$db});
	$tables = join(" ", map { quotemeta($_) } @tables);

	if (!$cmode) {
		# Run and check before-backup command (for one DB)
		$bok = &execute_before($db, STDOUT, 0, $file, $all ? undef : $db);
		if (!$bok) {
			print STDERR "Before-backup command failed!\n";
			$ex = 1;
			next;
			}
		}
	unlink($file);
	$out = &backquote_logged("$config{'mysqldump'} $authstr $drop $where $charset $quoting ".quotemeta($db)." $tables 2>&1 >$file");
	if ($? || $out) {
		print "Backup of database $db to file $file failed:\n";
		print $out;
		$ex = 1;
		}
	if (!$cmode) {
		&execute_after($db, STDOUT, 0, $file, $all ? undef : $db);
		}
	}
if ($cmode) {
	&execute_after(undef, STDOUT, 0, $config{'backup_'}, undef);
	}
exit($ex);

