/[rserv]/bin/MasterInit
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /bin/MasterInit

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (show annotations)
Wed Oct 29 18:00:18 2003 UTC (20 years, 6 months ago) by dpavlin
Branch: MAIN
Changes since 1.7: +14 -1 lines
changes in preparation for multi-master: better debugging, variables convery
master/slave relationship (first letter m for master and s for slave)

1 #!/usr/bin/perl -w
2 # MasterInit
3 # Vadim Mikheev, (c) 2000, PostgreSQL Inc.
4
5 eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
6 & eval 'exec perl -S $0 $argv:q'
7 if 0;
8
9 use strict;
10 use Pg;
11 use Getopt::Long;
12
13 $| = 1;
14
15 my ($debug,$verbose) = (0,0);
16 my ($help,$masterhost,$masterport,$masteruser,$masterpassword);
17 my $lib;
18 my $mserver = 0;
19
20 my $result = GetOptions(
21 "debug!" => \$debug, "verbose!" => \$verbose, "help" => \$help,
22 "masterhost=s" => \$masterhost, "masterport=i" => \$masterport,
23 "masteruser=s" => \$masteruser, "masterpassword=s" => \$masterpassword,
24 "lib=s" => \$lib,
25 "masterserver=i" => \$mserver,
26 );
27
28 if (defined($help) || (scalar(@ARGV) < 1)) {
29 print "Usage: $0 [options] masterdb
30 Options:
31 --masterhost=hostname --masterport=port
32 --masteruser=username --masterpassword=string
33 --lib=libpath
34 [--masterserver=master_number]
35 ";
36 exit ((scalar(@ARGV) < 1)? 1:0);
37 }
38
39 my $master = $ARGV[0] || "master";
40
41 my $minfo = "dbname=$master";
42 $minfo = "$minfo host=$masterhost" if (defined($masterhost));
43 $minfo = "$minfo port=$masterport" if (defined($masterport));
44 $minfo = "$minfo user=$masteruser" if (defined($masteruser));
45 $minfo = "$minfo password=$masterpassword" if (defined($masterpassword));
46
47 if (!defined($lib) || !-e $lib) {
48 # find my compiled rserv.so module
49 $lib = $0; $lib =~ s#/[^/]+$#/../lib#;
50 if ($lib =~ m#^\.#) {
51 my $pwd = `pwd`;
52 chomp($pwd);
53 $lib = "$pwd/$lib/";
54 }
55 while ($lib =~ s#/[^/]+/\.\./#/#g) {};
56 while ($lib =~ s#/\./#/#g) {};
57 $lib =~ s#//#/#g;
58
59 if (-e "$lib/rserv.so") {
60 $lib .= "rserv.so";
61 } else {
62 print STDERR "Can't find compiled rserv.so in $lib. Go there and type make.\n";
63 exit 1;
64 }
65 }
66 print "Using lib '$lib'\n" if ($verbose);
67
68 sub RollbackAndQuit {
69 my $conn = shift @_;
70
71 print STDERR "Error in query: ", $conn->errorMessage;
72 $conn->exec("ROLLBACK");
73 exit (-1);
74 }
75
76 my $conn = Pg::connectdb($minfo);
77 if ($conn->status != PGRES_CONNECTION_OK) {
78 print STDERR "Failed opening $minfo\n";
79 exit 1;
80 }
81
82 $result = $conn->exec("BEGIN");
83 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
84
85 $result = $conn->exec("set transaction isolation level serializable");
86 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
87
88 # List of slave servers
89 $result = $conn->exec("create table _RSERV_SERVERS_" .
90 " (server serial primary key, host text not ".
91 "null, port int4 default 5432, dbase text not ".
92 "null, unique(host,port,dbase))");
93 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
94
95 # insert master server in list
96 $result = $conn->exec("insert into _RSERV_SERVERS_" .
97 " (server, host, port, dbase) ".
98 " values ($mserver,".
99 ($masterhost || "'localhost'").",".
100 ($masterport || 5432).",".
101 "'$master')");
102 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
103
104 # List of replicated tables
105 $result = $conn->exec("create table _RSERV_TABLES_" .
106 " (tname name not null, cname name not null, ".
107 "reloid oid primary key, key int4 not null)");
108 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
109
110 ## should always call MasterDelTable
111 #$result = $conn->exec("CREATE RULE _rserv_deltrig_ AS ON delete to _RSERV_TABLES_ DO (DELETE FROM pg_trigger WHERE tgname='_rserv_trigger_t_' AND tgrelid=(SELECT oid FROM pg_class WHERE relname=old.tname);UPDATE pg_class SET reltriggers=reltriggers-1 WHERE relname=old.tname)");
112 #RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
113
114 # Bookkeeping log for row replication
115 $result = $conn->exec("create table _RSERV_LOG_" .
116 " (reloid oid REFERENCES _RSERV_TABLES_(reloid) ON ".
117 "DELETE CASCADE ON UPDATE CASCADE, logid int4 not ".
118 "null, logtime timestamp not null, insert smallint, ".
119 "update smallint, delete smallint, key text, ".
120 "server int4, ".
121 "CONSTRAINT only_one CHECK (insert+update+delete=1))");
122 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
123
124 # This is to speedup lookup of deleted tuples
125 $result = $conn->exec("create index _RSERV_LOG_INDX_DLT_ID_ on _RSERV_LOG_ ".
126 "(delete, logid) WHERE delete = 1");
127 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
128
129 # This is to speedup lookup of updated tuples
130 $result = $conn->exec("create index _RSERV_LOG_INDX_UPD_ID_ on _RSERV_LOG_ ".
131 "(update, logid) WHERE update = 1");
132 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
133
134 # This is to speedup lookup of insert tuples
135 $result = $conn->exec("create index _RSERV_LOG_INDX_INS_ID_ on _RSERV_LOG_ ".
136 "(insert, logid) WHERE insert = 1");
137 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
138
139 # This is to speedup cleanup
140 $result = $conn->exec("create index _RSERV_LOG_INDX_TM_ID_ on _RSERV_LOG_ ".
141 "(logtime, logid)");
142 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
143
144 # This is to speedup trigger
145 $result = $conn->exec("create index _RSERV_LOG_INDX_REL_KEY_ on _RSERV_LOG_ ".
146 "(reloid, key)");
147 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
148
149 # View to help managing _rserv_log_ table
150 $result = $conn->exec("CREATE VIEW _RSERV_HUMAN_LOG_ AS SELECT log.logid, ".
151 "tab.tname AS table_name, tab.cname AS column_name, ".
152 "log.key AS column_value, log.insert, log.update, ".
153 "log.delete, log.logtime FROM _RSERV_LOG_ log, ".
154 "_RSERV_TABLES_ tab WHERE tab.reloid ".
155 "= log.reloid ORDER BY log.logtime");
156 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
157
158 # View to help logging daily transactions
159 $result = $conn->exec("CREATE VIEW _RSERV_DAILY_LOG_ AS ".
160 "SELECT count(*) AS \"# records\", ".
161 "to_char(_rserv_log_.logtime, 'YYYY-MM-DD') ".
162 "AS day FROM _rserv_log_ GROUP BY day");
163 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
164
165 # Sync point for each slave server
166 $result = $conn->exec("create table _RSERV_SYNC_ " .
167 "(server int REFERENCES _RSERV_SERVERS_(server) ".
168 "ON DELETE CASCADE ON UPDATE CASCADE, syncid int4 ".
169 "not null, synctime timestamp, status int4 not null,".
170 " minid int4 not null, maxid int4 not null, active text)");
171 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
172
173 $result = $conn->exec("create index _RSERV_SYNC_INDX_SRV_ID_ on _RSERV_SYNC_ ".
174 "(server, syncid)");
175 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
176
177 # Sync point reference numbers
178 $result = $conn->exec("create sequence _rserv_sync_seq_");
179 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
180
181 $result = $conn->exec("CREATE FUNCTION _rserv_log_() RETURNS opaque" .
182 " AS '$lib' LANGUAGE 'c'");
183 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
184
185 $result = $conn->exec("CREATE FUNCTION _rserv_sync_(int4) RETURNS int4" .
186 " AS '$lib' LANGUAGE 'c'");
187 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
188
189 $result = $conn->exec("CREATE FUNCTION _rserv_debug_(int4) RETURNS int4" .
190 " AS '$lib' LANGUAGE 'c'");
191 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
192
193 $result = $conn->exec("COMMIT");
194 RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK);
195
196 exit (0);

  ViewVC Help
Powered by ViewVC 1.1.26