From e3eb95d950747a2cc6e42642bcb5e042c67d89d2 Mon Sep 17 00:00:00 2001
From: Steven Wittens <steven@10.no-reply.drupal.org>
Date: Sat, 11 Mar 2006 20:50:30 +0000
Subject: [PATCH] - #53540: Relative links updater improvements

---
 database/updates.inc | 101 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 76 insertions(+), 25 deletions(-)

diff --git a/database/updates.inc b/database/updates.inc
index cb4943c143b1..bfe1cec40abd 100644
--- a/database/updates.inc
+++ b/database/updates.inc
@@ -1704,19 +1704,21 @@ function system_update_177() {
 }
 
 function _update_178_url_fix($text) {
-  //key is attribute to replace.
+  // Key is the attribute to replace.
   $urlpatterns['href'] = "/<a[^>]+href=\"([^\"]+)/i";
   $urlpatterns['src']  = "/<img[^>]+src=\"([^\"]+)/i";
 
+  $old = $text;
   foreach ($urlpatterns as $type => $pattern) {
-    preg_match_all($pattern, $text, $matches);
-    foreach($matches[1] as $url) {
-      if ($url != '' && !strstr($url, 'mailto:') && !strstr($url, '://') && !strstr($url, '../') && !strstr($url, './') && $url[0] != '/' && $url[0] != '#') {
-        $text = preg_replace('|'. $type .'\s*=\s*"'. preg_quote($url) .'\s*"|', $type. '="'.base_path(). $url  .'"', $text);
+    if (preg_match_all($pattern, $text, $matches)) {
+      foreach ($matches[1] as $url) {
+        if ($url != '' && !strstr($url, 'mailto:') && !strstr($url, '://') && !strstr($url, '../') && !strstr($url, './') && $url[0] != '/' && $url[0] != '#') {
+          $text = preg_replace('|'. $type .'\s*=\s*"'. preg_quote($url) .'\s*"|', $type. '="'.base_path(). $url  .'"', $text);
+        }
       }
     }
   }
-  return $text;
+  return $text != $old ? $text : FALSE;
 }
 
 /**
@@ -1724,36 +1726,81 @@ function _update_178_url_fix($text) {
  */
 function system_update_178() {
 
-  if(variable_get('clean_url', 0) == 1) {
+  if (variable_get('clean_url', 0) == 1) {
     // Multi-part update
     if (!isset($_SESSION['system_update_178_comment'])) {
+      // Check which formats need to be converted
+      $formats = array();
+
+      // Any format with the HTML filter in it
+      $result = db_query("SELECT format FROM {filters} WHERE module = 'filter' AND delta = 0");
+      while ($format = db_fetch_object($result)) {
+        $formats[$format->format] = true;
+      }
+
+      // Any format with only the linebreak filter in it
+      $result = db_query("SELECT format FROM {filters} WHERE module = 'filter' AND delta = 2");
+      while ($format = db_fetch_object($result)) {
+        if (db_result(db_query('SELECT COUNT(*) FROM {filters} WHERE format = %d', $format->format)) == 1) {
+          $formats[$format->format] = true;
+        }
+      }
+
+      if (count($formats) == 0) {
+        return array();
+      }
+
+      // Build format query string
+      $_SESSION['formats'] = array_keys($formats);
+      $_SESSION['format_string'] = '('. substr(str_repeat('%d, ', count($formats)), 0, -2) .')';
+
+      // Begin update
       $_SESSION['system_update_178_comment'] = 0;
       $_SESSION['system_update_178_node'] = 0;
-      $_SESSION['system_update_178_comment_max'] = db_result(db_query('SELECT MAX(cid) FROM {comments}'));
-      $_SESSION['system_update_178_node_max'] = db_result(db_query('SELECT MAX(nid) FROM {node_revisions}'));
+      $_SESSION['system_update_178_comment_max'] = db_result(db_query('SELECT MAX(cid) FROM {comments} WHERE format IN '. $_SESSION['format_string'], $_SESSION['formats']));
+      $_SESSION['system_update_178_node_max'] = db_result(db_query('SELECT MAX(vid) FROM {node_revisions} WHERE format IN '. $_SESSION['format_string'], $_SESSION['formats']));
     }
 
     $limit = 20;
-    $result = db_query_range("SELECT cid, comment FROM {comments} WHERE cid > %d", $_SESSION['system_update_178_comment'], 0, $limit);
-    while ($comment = db_fetch_object($result)) {
-      $_SESSION['system_update_178_comment'] = $comment->cid;
-      $comment->comment = _update_178_url_fix($comment->comment);
-      db_query("UPDATE {comments} SET comment = '%s' WHERE cid = %d", $comment->comment, $comment->cid);
+
+    // Comments
+    if ($_SESSION['system_update_178_comment'] != $_SESSION['system_update_178_comment_max']) {
+      $args = array_merge(array($_SESSION['system_update_178_comment']), $_SESSION['formats']);
+      $result = db_query_range("SELECT cid, comment FROM {comments} WHERE cid > %d AND format IN ". $_SESSION['format_string'] .' ORDER BY cid ASC', $args, 0, $limit);
+      while ($comment = db_fetch_object($result)) {
+        $_SESSION['system_update_178_comment'] = $comment->cid;
+        $comment->comment = _update_178_url_fix($comment->comment);
+        if ($comment->comment !== FALSE) {
+          db_query("UPDATE {comments} SET comment = '%s' WHERE cid = %d", $comment->comment, $comment->cid);
+        }
+      }
     }
 
-    $result = db_query_range("SELECT nid, vid, teaser, body FROM {node_revisions} WHERE nid > %d", $_SESSION['system_update_178_node'], 0, $limit);
+    // Node revisions
+    $args = array_merge(array($_SESSION['system_update_178_node']), $_SESSION['formats']);
+    $result = db_query_range("SELECT vid, teaser, body FROM {node_revisions} WHERE vid > %d AND format IN ". $_SESSION['format_string'] .' ORDER BY vid ASC', $args, 0, $limit);
     while ($node = db_fetch_object($result)) {
-      // Catch the infinite loop for node revisions. We ignore updating
-      // content past the 20th revision.
-      if ($_SESSION['system_update_178_node'] == $node->nid) {
-        $_SESSION['system_update_178_node']++;
-      }
-      else {
-        $_SESSION['system_update_178_node'] = $node->nid;
-      }
+      $_SESSION['system_update_178_node'] = $node->vid;
+      $set = array();
+      $args = array();
+
       $node->teaser = _update_178_url_fix($node->teaser);
+      if ($node->teaser !== FALSE) {
+        $set[] = "teaser = '%s'";
+        $args[] = $node->teaser;
+      }
+
       $node->body = _update_178_url_fix($node->body);
-      db_query('UPDATE {node_revisions} SET body = "%s", teaser = "%s" WHERE nid = %d AND vid = %d', $node->body, $node->teaser, $node->nid, $node->vid);
+      if ($node->body !== FALSE) {
+        $set[] = "body = '%s'";
+        $args[] = $node->body;
+      }
+
+      if (count($set)) {
+        $args[] = $node->vid;
+        db_query('UPDATE {node_revisions} SET '. implode(', ', $set) .' WHERE vid = %d', $args);
+      }
+      
     }
 
     if ($_SESSION['system_update_178_comment'] == $_SESSION['system_update_178_comment_max'] &&
@@ -1765,7 +1812,11 @@ function system_update_178() {
       return array();
     }
     else {
-      return array('#finished' => FALSE);
+      // Report percentage finished
+      return array('#finished' =>
+        ($_SESSION['system_update_178_comment'] + $_SESSION['system_update_178_node']) /
+        ($_SESSION['system_update_178_comment_max'] + $_SESSION['system_update_178_node_max'])
+      );
     }
   }
 
-- 
GitLab