summaryrefslogtreecommitdiffstats
path: root/syncshadowdb
diff options
context:
space:
mode:
Diffstat (limited to 'syncshadowdb')
-rwxr-xr-xsyncshadowdb141
1 files changed, 141 insertions, 0 deletions
diff --git a/syncshadowdb b/syncshadowdb
new file mode 100755
index 000000000..6c6479e19
--- /dev/null
+++ b/syncshadowdb
@@ -0,0 +1,141 @@
+#!/usr/bonsaitools/bin/perl -w
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Terry Weissman <terry@mozilla.org>
+# David Gardiner <david.gardiner@unisa.edu.au>
+
+use diagnostics;
+use strict;
+
+require "globals.pl";
+
+# Shut up misguided -w warnings about "used only once". "use vars" just
+# doesn't work for me.
+
+sub sillyness {
+ my $zz;
+ $zz = $::dbwritesallowed;
+}
+
+my $verbose = 0;
+if ($ARGV[0] eq '-v') {
+ $verbose = 1;
+}
+$| = 1;
+
+sub Verbose ($) {
+ my ($str) = (@_);
+ if ($verbose) {
+ print $str, "\n";
+ }
+}
+
+
+
+my $db_name = "bugs";
+require "localconfig";
+
+if (!Param("shadowdb")) {
+ Verbose("We don't have shadow databases turned on; no syncing performed.");
+ exit;
+}
+
+ConnectToDatabase(1);
+$::dbwritesallowed = 1;
+
+SendSQL("SELECT GET_LOCK('synclock', 1)");
+if (!FetchOneColumn()) {
+ Verbose("Couldn't get the lock to do the shadow database syncing.");
+ exit;
+}
+
+my $shadowtable = "$db_name.shadowlog";
+
+SendSQL("SELECT id FROM $shadowtable " .
+ "WHERE reflected = 0 AND command = 'SYNCUP'");
+
+if (FetchOneColumn()) {
+ Verbose("Syncing up the shadow database by copying entire database in.");
+ my @tables;
+ SendSQL("SHOW TABLES");
+ while (MoreSQLData()) {
+ my $table = FetchOneColumn();
+ push(@tables, $table);
+ }
+ foreach my $table (@tables) {
+ Verbose("Dropping old shadow table $table");
+ SendSQL("DROP TABLE $table");
+ }
+ # Carefully lock the whole real database for reading, except for the
+ # shadowlog table, which we lock for writing. Then dump everything
+ # into the shadowdb database. Then mark everything in the shadowlog
+ # as reflected. Only then unlock everything. This sequence causes
+ # us to be sure not to miss anything or get something twice.
+ SendSQL("USE $db_name");
+ SendSQL("SHOW TABLES");
+ @tables = ();
+ my $query = "LOCK TABLES shadowlog WRITE";
+ while (MoreSQLData()) {
+ my $table = FetchOneColumn();
+ if ($table ne "shadowlog") {
+ $query .= ", $table READ";
+ push(@tables, $table);
+ }
+ }
+ Verbose("Locking entire database");
+ SendSQL($query);
+ my $tablelist = join(' ', @tables);
+ Verbose("Doing the actual sync (can take a real long time!)");
+ my $extra = "";
+ if ($verbose) {
+ $extra = "-v";
+ }
+ open(MYSQL, "mysqldump -l -e $db_name $tablelist | mysql $extra " .
+ Param("shadowdb") . "|") || die "Couldn't do db copy";
+ my $count = 0;
+ while (<MYSQL>) {
+ print ".";
+ $count++;
+ if ($count % 70 == 0) {
+ print "\n";
+ }
+ }
+ close(MYSQL);
+ Verbose("");
+
+
+ SendSQL("UPDATE shadowlog SET reflected = 1 WHERE reflected = 0", 1);
+ SendSQL("UNLOCK TABLES");
+ Verbose("OK, done.");
+}
+
+while (1) {
+ SendSQL("SELECT id, command FROM $shadowtable WHERE reflected = 0 " .
+ "ORDER BY id LIMIT 1");
+ my ($id, $command) = (FetchSQLData());
+ if (!$id) {
+ last;
+ }
+ Verbose("Executing command in shadow db: $command");
+ SendSQL($command, 1);
+ SendSQL("UPDATE $shadowtable SET reflected = 1 WHERE id = $id", 1);
+}
+
+SendSQL("SELECT RELEASE_LOCK('synclock')");