diff options
-rw-r--r-- | database/updates.inc | 140 |
1 files changed, 73 insertions, 67 deletions
diff --git a/database/updates.inc b/database/updates.inc index bf4d89761..a854e97ce 100644 --- a/database/updates.inc +++ b/database/updates.inc @@ -1139,92 +1139,98 @@ function system_update_158() { function system_update_159() { $ret = array(); - $result = db_query_range("SELECT * FROM {old_revisions} WHERE done = 0 AND type IN ('page', 'story', 'poll', 'book', 'forum', 'blog')", 0, 20); + $result = db_query_range("SELECT * FROM {old_revisions} WHERE done = 0 AND type IN ('page', 'story', 'poll', 'book', 'forum', 'blog') ORDER BY nid DESC", 0, 20); - $vid = db_next_id('{node_revisions}_vid'); - while ($node = db_fetch_object($result)) { - $revisions = unserialize($node->revisions); - if (isset($revisions) && is_array($revisions) && count($revisions) > 0) { - $revisions_query = array(); - $revisions_args = array(); - $book_query = array(); - $book_args = array(); - $forum_query = array(); - $forum_args = array(); - foreach ($revisions as $version) { - $revision = array(); - foreach ($version['node'] as $node_field => $node_value) { - $revision[$node_field] = $node_value; + if (db_num_rows($result)) { + $vid = db_next_id('{node_revisions}_vid'); + while ($node = db_fetch_object($result)) { + $revisions = unserialize($node->revisions); + if (isset($revisions) && is_array($revisions) && count($revisions) > 0) { + $revisions_query = array(); + $revisions_args = array(); + $book_query = array(); + $book_args = array(); + $forum_query = array(); + $forum_args = array(); + foreach ($revisions as $version) { + $revision = array(); + foreach ($version['node'] as $node_field => $node_value) { + $revision[$node_field] = $node_value; + } + $revision['uid'] = $version['uid']; + $revision['timestamp'] = $version['timestamp']; + $vid++; + $revisions_query[] = "(%d, %d, %d, '%s', '%s', '%s', '%s', %d, %d)"; + $revisions_args = array_merge($revisions_args, array($node->nid, $vid, $revision['uid'], $revision['title'], $revision['body'], $revision['teaser'], $revision['log'], $revision['timestamp'], $revision['format'])); + switch ($node->type) { + case 'forum': + if ($revision['tid'] > 0) { + $forum_query[] = "(%d, %d, %d)"; + $forum_args = array_merge($forum_args, array($vid, $node->nid, $revision['tid'])); + } + break; + + case 'book': + $book_query[] = "(%d, %d, %d, %d)"; + $book_args = array_merge($book_args, array($vid, $node->nid, $revision['parent'], $revision['weight'])); + break; + } + } + if (count($revisions_query)) { + $revision_status = db_query("INSERT INTO {node_revisions} (nid, vid, uid, title, body, teaser, log, timestamp, format) VALUES ". implode(',', $revisions_query), $revisions_args); + } + if (count($forum_query)) { + $forum_status = db_query("INSERT INTO {forum} (vid, nid, tid) VALUES ". implode(',', $forum_query), $forum_args); + } + if (count($book_query)) { + $book_status = db_query("INSERT INTO {book} (vid, nid, parent, weight) VALUES ". implode(',', $book_query), $book_args); } - $revision['uid'] = $version['uid']; - $revision['timestamp'] = $version['timestamp']; - $vid++; - $revisions_query[] = "(%d, %d, %d, '%s', '%s', '%s', '%s', %d, %d)"; - $revisions_args = array_merge($revisions_args, array($node->nid, $vid, $revision['uid'], $revision['title'], $revision['body'], $revision['teaser'], $revision['log'], $revision['timestamp'], $revision['format'])); + $delete = FALSE; switch ($node->type) { case 'forum': - if ($revision['tid'] > 0) { - $forum_query[] = "(%d, %d, %d)"; - $forum_args = array_merge($forum_args, array($vid, $node->nid, $revision['tid'])); + if ($forum_status && $revision_status) { + $delete = TRUE; } break; case 'book': - $book_query[] = "(%d, %d, %d, %d)"; - $book_args = array_merge($book_args, array($vid, $node->nid, $revision['parent'], $revision['weight'])); + if ($book_status && $revision_status) { + $delete = TRUE; + } break; - } - } - if (count($revisions_query)) { - $revision_status = db_query("INSERT INTO {node_revisions} (nid, vid, uid, title, body, teaser, log, timestamp, format) VALUES ". implode(',', $revisions_query), $revisions_args); - } - if (count($forum_query)) { - $forum_status = db_query("INSERT INTO {forum} (vid, nid, tid) VALUES ". implode(',', $forum_query), $forum_args); - } - if (count($book_query)) { - $book_status = db_query("INSERT INTO {book} (vid, nid, parent, weight) VALUES ". implode(',', $book_query), $book_args); - } - $delete = FALSE; - switch ($node->type) { - case 'forum': - if ($forum_status && $revision_status) { - $delete = TRUE; - } - break; - case 'book': - if ($book_status && $revision_status) { - $delete = TRUE; - } - break; + default: + if ($revision_status) { + $delete = TRUE; + } + break; + } - default: - if ($revision_status) { - $delete = TRUE; - } - break; - } + if ($delete) { + db_query('DELETE FROM {old_revisions} WHERE nid = %d', $node->nid); + } + else { + db_query('UPDATE {old_revisions} SET done = 1 WHERE nid = %d', $node->nid); + } - if ($delete) { - db_query('DELETE FROM {old_revisions} WHERE nid = %d', $node->nid); + switch ($GLOBALS['db_type']) { + case 'mysqli': + case 'mysql': + $ret[] = update_sql("UPDATE {sequences} SET id = $vid WHERE name = '{node_revisions}_vid'"); + break; + + case 'pgsql': + $ret[] = update_sql("SELECT setval('{node_revisions}_vid_seq', $vid)"); + break; + } } else { db_query('UPDATE {old_revisions} SET done = 1 WHERE nid = %d', $node->nid); + watchdog('php', "Recovering old revisions for node $node->nid failed.", WATCHDOG_WARNING); } } } - switch ($GLOBALS['db_type']) { - case 'mysqli': - case 'mysql': - $ret[] = update_sql("UPDATE {sequences} SET id = $vid WHERE name = '{node_revisions}_vid'"); - break; - - case 'pgsql': - $ret[] = update_sql("SELECT setval('{node_revisions}_vid_seq', $vid)"); - break; - } - if (db_num_rows($result) < 20) { $ret[] = update_sql('ALTER TABLE {old_revisions} DROP done'); } |