From 6181e7512ffa1376ed8c8234fe957af8ea1cc050 Mon Sep 17 00:00:00 2001
From: Joe <joe@incal.net>
Date: Sun, 13 Nov 2011 10:30:49 +0100
Subject: [PATCH] Workaround for the demented hyperdb bug

---
 tools/noblogs-new-topology.php | 54 +++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 23 deletions(-)

diff --git a/tools/noblogs-new-topology.php b/tools/noblogs-new-topology.php
index f4d2930..36b1cee 100755
--- a/tools/noblogs-new-topology.php
+++ b/tools/noblogs-new-topology.php
@@ -1,34 +1,40 @@
 #!/opt/noblogs/cron/php-noblogs
 <?php
-
-// Load wordpress api.
-define('WP_CACHE',false);
-/** Setup WordPress environment */
-require_once('wp-load.php');
-require_once('db-config.php');
-
 /*
    Parse command line options
  */
-$opts = getopt('',array('no-database', 'calc-size'));
+$opts = getopt('',array('no-database', 'calc-size', 'db-only'));
 if (array_key_exists('calc-size', $opts)) {
     $opts['no-database'] = true;
     $g_added_size = array();
 }
+$new_topology = array_pop($argv);
+$old_topology = array_pop($argv);
+if (!($new_topology && $old_topology)) {
+    usage();
+    exit(-1);
+}
+
+// Get all blogs
+define('WP_CACHE',false);
+require_once('wp-load.php');
+require_once('db-config.php');
+$blogs = get_all_blogs();
 
 $n_hashmap = new Flexihash();
-$new_map = noblogs_load_backends(array_pop($argv), $n_hashmap);
+$new_map = noblogs_load_backends($new_topology, $n_hashmap);
 
 $o_hashmap = new Flexihash();
-$old_map = noblogs_load_backends(array_pop($argv), $o_hashmap);
+$old_map = noblogs_load_backends($old_topology, $o_hashmap);
+
+
 
-$blogs = get_all_blogs();
 foreach ($blogs as $blog) {
     $blog_id = $blog->blog_id;
 
-    $old_params = fhash($blog_id, $old_map);
+    $old_params = fhash($blog_id, $old_map, $o_hashmap);
     $old_dburi = mysqlurl($old_params);
-    $new_params = fhash($blog_id, $new_map);
+    $new_params = fhash($blog_id, $new_map, $n_hashmap);
     $new_dburi = mysqlurl($new_params);
 
     if ($new_counts[$new_params['host']]) {
@@ -39,20 +45,22 @@ foreach ($blogs as $blog) {
 
     if ($old_dburi != $new_dburi) {
         echo "echo moving blog $blog_id from " . $old_params['host'] . " to " . $new_params['host'] . "\n";
-        if ( array_key_exists('no-database', $opts) ) {
+        if ( !array_key_exists('no-database', $opts) ) {
             echo "tables=\$(mysql " . mysqlopts($old_params) . " " . $old_params['db'] . " -NBe \"show tables like 'wp\\_" . $blog_id . "\\_%'\")\n";
             echo "mysqldump --opt " . mysqlopts($old_params) . " " . $old_params['db'] . " \${tables} \\\n";
             echo "  | mysql " . mysqlopts($new_params) . " " . $new_params['db'] . "\n";
         }
+	if (!array_key_exists('db-only',$opts)) {
         if (array_key_exists('calc-size', $opts)) {
-            $cmd = escapeshellargs(sprintf("ssh root@%s du -sk /opt/noblogs/www/wp-content/blogs.dir/%d", $old_params['host'], $blog_id));
-            list($size, $dummy) = explode("\t",exec($cmd, $ret));
+#            $cmd = sprintf("ssh root@%s du -sk /opt/noblogs/www/wp-content/blogs.dir/%d", $old_params['host'], $blog_id);
+	    $cmd = sprintf("du -sk /opt/noblogs/www/wp-content/blogs.dir/%d", $blog_id);
+	    list($size, $dummy) = explode("\t",exec($cmd, $ret));
             $g_added_size[$new_params['host']] += $size;
         } else {
-            printf("rsync -avz --delete root@%s:/opt/noblogs/www/wp-content/blogs.dir/%d root@%s:/opt/noblogs/www/wp-content/blogs.dir/%d\n", $old_params['host'], $blog_id, $new_params['host'], $blog_id);
+            printf("ssh root@%s rsync -avz --delete /opt/noblogs/www/wp-content/blogs.dir/%d root@%s:/opt/noblogs/www/wp-content/blogs.dir/\n", $old_params['host'], $blog_id, $new_params['host']);
         }
+	}
         $moved_count += 1;
-
     } else {
         echo "echo blog $blog_id stays on " . $old_params['host'] . "\n";
     }
@@ -68,9 +76,8 @@ if (array_key_exists('calc-size', $opts)) {
     print_r($g_added_size);
 }
 
-function fhash($dbid, $reversemap) {
-  global $wpdb;
-  $lookup = $wpdb->hash_map->lookup($dbid);
+function fhash($dbid, $reversemap, $hashptr) {
+  $lookup = $hashptr->lookup($dbid);
   $backend = $reversemap[$lookup];
   $result = array();
   if (preg_match('/^(.*):([0-9]*)$/', $backend['host'], $matches)) {
@@ -96,7 +103,7 @@ function mysqlurl(&$attrs) {
 function get_all_blogs() 
 {
   global $wpdb;
-  $sql = "SELECT blog_id, domain, path FROM $wpdb->blogs WHERE public = 1 AND deleted = 0 AND archived = '0' ORDER BY domain, path";
+  $sql = "SELECT blog_id, domain, path FROM $wpdb->blogs WHERE deleted = 0 AND archived = '0' ORDER BY domain, path";
   $result = $wpdb->get_results($sql);
   return ($result);
 }
@@ -105,4 +112,5 @@ function usage() {
     $str = <<<USAGE
 noblogs-new-topology.php [--no-database|--calc-size] <OLD_MAP> <NEW_MAP> 
 USAGE;
-}
\ No newline at end of file
+    echo $str;
+}
-- 
GitLab