#! /usr/bin/perl
use DBI;
use strict;
use warnings;
no warnings qw(once);
use Encode;
use Time::HiRes;
require './config.pm';

sub copy_escape {
	my $x = shift;
	if (!defined($x)) {
		return '\N';
	}
	$x = Encode::decode('iso8859-1', $x);
	$x =~ s/\\/\\\\/g;
	$x =~ s/\r/\\r/g;
	$x =~ s/\n/\\n/g;
	$x =~ s/\t/\\t/g;
	return $x;
}

sub sync_table {
	my ($mdbh, $sdbh, $table) = @_;
	my $start = [ Time::HiRes::gettimeofday ];
	my $data = $mdbh->selectall_arrayref("SELECT * FROM $table");
	my $elapsed = Time::HiRes::tv_interval($start);
	#printf "MySQL $table time used: $elapsed\n";

	$start = [ Time::HiRes::gettimeofday ];
	$sdbh->do("DELETE FROM $table");
	$sdbh->do("COPY $table FROM STDIN");
	
	for my $row (@$data) {
		$sdbh->pg_putcopydata(join("\t", map { copy_escape($_) } (@$row)) . "\n");
	}
	$sdbh->pg_putcopyend();
	$elapsed = Time::HiRes::tv_interval($start);
	#printf "PostgreSQL $table time used: $elapsed\n";
}

my $mdbh = DBI->connect($config::master_connstr, $config::master_username, $config::master_password)
	or die "PostgreSQL connect: " . $DBI::errstr;
$mdbh->{AutoCommit} = 0;
$mdbh->{RaiseError} = 1;

my $sdbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
	or die "PostgreSQL connect: " . $DBI::errstr;
$sdbh->{AutoCommit} = 0;
$sdbh->{RaiseError} = 1;

# For our own enjoyment.
sync_table($mdbh, $sdbh, "Fotballbrukere");
sync_table($mdbh, $sdbh, "Fotballdeltagere");
sync_table($mdbh, $sdbh, "Fotballresultater");
sync_table($mdbh, $sdbh, "Fotballresultater_2123");
sync_table($mdbh, $sdbh, "Fotballserier");

# Just for backup.
sync_table($mdbh, $sdbh, 'Fotballjuks');
sync_table($mdbh, $sdbh, 'FotballKaffeklubb');
sync_table($mdbh, $sdbh, 'Fotballkommentarer');
sync_table($mdbh, $sdbh, 'Fotballkommentartema');
sync_table($mdbh, $sdbh, 'FotballLogin');
sync_table($mdbh, $sdbh, 'Fotballspraak');
sync_table($mdbh, $sdbh, 'Fotballtoppti');
sync_table($mdbh, $sdbh, 'Fotballvariabler');

$sdbh->do('DELETE FROM last_sync');
$sdbh->do('INSERT INTO last_sync VALUES ( CURRENT_TIMESTAMP );');

$mdbh->rollback();
$sdbh->commit();
