From cb3fb370cb49ece5819086dc63271fe2a2d65657 Mon Sep 17 00:00:00 2001 From: Rob Church Date: Wed, 17 May 2006 07:37:20 +0000 Subject: [PATCH] Maintenance script to remove orphaned revisions from the database --- RELEASE-NOTES | 1 + maintenance/deleteOrphanedRevisions.inc.php | 33 +++++++++++++ maintenance/deleteOrphanedRevisions.php | 55 +++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 maintenance/deleteOrphanedRevisions.inc.php create mode 100644 maintenance/deleteOrphanedRevisions.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 18067393d2..acacccc8ca 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -281,6 +281,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * (bug 5962) Update for Italian language (it) * Suppress images in galleries which appear on the bad image list (when rendering for a wiki page; galleries in special pages and categories are unaffected) +* Maintenance script to remove orphaned revisions from the database == Compatibility == diff --git a/maintenance/deleteOrphanedRevisions.inc.php b/maintenance/deleteOrphanedRevisions.inc.php new file mode 100644 index 0000000000..7cfb1c6bb5 --- /dev/null +++ b/maintenance/deleteOrphanedRevisions.inc.php @@ -0,0 +1,33 @@ + + */ + +/** + * Delete one or more revisions from the database + * Do this inside a transaction + * + * @param $id Array of revision id values + * @param $db Database class (needs to be a master) + */ +function deleteRevisions( $id, &$dbw ) { + if( !is_array( $id ) ) + $id = array( $id ); + $dbw->delete( 'revision', array( 'rev_id' => $id ), 'deleteRevision' ); +} + +/** + * Spit out script usage information and exit + */ +function showUsage() { + echo( "Finds revisions which refer to nonexisting pages and deletes them from the database\n" ); + echo( "USAGE: php deleteOrphanedRevisions.php [--report]\n\n" ); + echo( " --report : Prints out a count of affected revisions but doesn't delete them\n\n" ); +} + +?> \ No newline at end of file diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php new file mode 100644 index 0000000000..b4f5b5172e --- /dev/null +++ b/maintenance/deleteOrphanedRevisions.php @@ -0,0 +1,55 @@ + + * @todo More efficient cleanup of text records + */ + +$options = array( 'report', 'help' ); +require_once( 'commandLine.inc' ); +require_once( 'deleteOrphanedRevisions.inc.php' ); +echo( "Delete Orphaned Revisions\n" ); + +if( isset( $options['help'] ) ) + showUsage(); + +$report = isset( $options['report'] ); + +$dbw =& wfGetDB( DB_MASTER ); +$dbw->immediateBegin(); +extract( $dbw->tableNames( 'page', 'revision' ) ); + +# Find all the orphaned revisions +echo( "Checking for orphaned revisions..." ); +$sql = "SELECT rev_id FROM {$revision} LEFT JOIN {$page} ON rev_page = page_id WHERE page_namespace IS NULL"; +$res = $dbw->query( $sql, 'deleteOrphanedRevisions' ); + +# Stash 'em all up for deletion (if needed) +while( $row = $dbw->fetchObject( $res ) ) + $revisions[] = $row->rev_id; +$dbw->freeResult( $res ); +$count = count( $revisions ); +echo( "found {$count}.\n" ); + +# Nothing to do? +if( $report || $count == 0 ) { + $dbw->immediateCommit(); + exit(); +} + +# Delete each revision +echo( "Deleting..." ); +deleteRevisions( $revisions, $dbw ); +echo( "done.\n" ); + +# Close the transaction and call the script to purge unused text records +$dbw->immediateCommit(); +require_once( 'purgeOldText.inc' ); +PurgeRedundantText( true ); + +?> \ No newline at end of file -- 2.20.1