1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#!/usr/bin/env perl
# -*-mode:cperl; indent-tabs-mode: nil-*-
## Test handling of object names
use 5.008003;
use strict;
use warnings;
use utf8;
use open qw( :std :utf8 );
use charnames ':full';
use lib 't','.';
use DBD::Pg;
use Test::More;
my $dbdpgversion = $DBD::Pg::VERSION;
(my $majorversion = $dbdpgversion) =~ s/^(\d+).*/$1/;
if ($majorversion < 3) {
plan (skip_all => "Test skipped unless DBD::Pg is version 3 or higher: this is $dbdpgversion");
}
plan tests => 20;
use BucardoTesting;
my $bct = BucardoTesting->new({ location => 'makedelta' })
or BAIL_OUT "Creation of BucardoTesting object failed\n";
END { $bct->stop_bucardo if $bct }
ok my $dbhA = $bct->repopulate_cluster('A'), 'Populate cluster A';
ok my $dbhB = $bct->repopulate_cluster('B'), 'Populate cluster B';
ok my $dbhC = $bct->repopulate_cluster('C'), 'Populate cluster C';
ok my $dbhD = $bct->repopulate_cluster('D'), 'Populate cluster D';
ok my $dbhX = $bct->setup_bucardo('A'), 'Set up Bucardo';
END { $_->disconnect for grep { $_ } $dbhA, $dbhB, $dbhC, $dbhD, $dbhX }
# Teach Bucardo about the databases.
for my $db (qw(A B C D)) {
my ($user, $port, $host) = $bct->add_db_args($db);
like $bct->ctl(
"bucardo add db $db dbname=bucardo_test user=$user port=$port host=$host"
), qr/Added database "$db"/, qq{Add database "$db" to Bucardo};
}
for my $arr ((['A','B'], ['C','D'])) {
my ($src, $dest) = @$arr;
like $bct->ctl("bucardo add table bucardo_test1 db=$src relgroup=myrels_$src"),
qr/Added the following tables/, "Added table in db $src ";
like $bct->ctl("bucardo add sync test_$src relgroup=myrels_$src dbs=$src:source,$dest:target"),
qr/Added sync "test_$src"/, "Create sync from $src to $dest";
}
# Now remove syncs, for easier testing
map { $bct->ctl('bucardo remove sync $_') } qw/A C/;
# Remove a table from just database C
like $bct->ctl('bucardo remove table public.bucardo_test1 db=C'),
qr/Removed the following tables:\s*\n\s+public.bucardo_test1 \(DB: C\)/,
"Removed table from just one database";
## Test non-ASCII characters in table names
## XXX Probably ought to test non-ASCII schemas as well, as well as different client_encoding values
for my $dbh (($dbhA, $dbhB)) {
$dbh->do(qq/CREATE TABLE test_büçárđo ( pkey_\x{2695} INTEGER PRIMARY KEY, data TEXT );/);
$dbh->commit;
}
## XXX TODO: Make sync names and relgroup names with non-ASCII characters work
like $bct->ctl('bucardo add table test_büçárđo db=A relgroup=unicode'),
qr/Added the following tables/, "Added table in db A";
like($bct->ctl("bucardo add sync test_unicode relgroup=unicode dbs=A:source,B:target"),
qr/Added sync "test_unicode"/, "Create sync from A to B")
or BAIL_OUT "Failed to add test_unicode sync";
$dbhA->do("INSERT INTO test_büçárđo (pkey_\x{2695}, data) VALUES (1, 'Something')");
$dbhA->commit;
## Get Bucardo going
$bct->restart_bucardo($dbhX);
## Kick off the sync.
my $timer_regex = qr/\[0\s*s\]\s+(?:[\b]{6}\[\d+\s*s\]\s+)*/;
like $bct->ctl('kick sync test_unicode 0'),
qr/^Kick\s+test_unicode:\s+${timer_regex}DONE!/,
'Kick test_unicode' or die 'Sync failed, no point continuing';
my $res = $dbhB->selectall_arrayref('SELECT * FROM test_büçárđo');
ok($#$res == 0 && $res->[0][0] == 1 && $res->[0][1] eq 'Something', 'Replication worked');
END {
$bct and $bct->stop_bucardo();
$dbhX and $dbhX->disconnect();
$dbhA and $dbhA->disconnect();
$dbhB and $dbhB->disconnect();
$dbhC and $dbhC->disconnect();
$dbhD and $dbhD->disconnect();
}
|