From 5e4de9e7387a0839655257fa6a2236b79c61e0ba Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Sun, 14 Aug 2005 07:58:56 +0000 Subject: [PATCH] scripts for external storage --- maintenance/storage/blobs.sql | 8 +++ maintenance/storage/resolveStubs.php | 96 ++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 maintenance/storage/blobs.sql create mode 100644 maintenance/storage/resolveStubs.php diff --git a/maintenance/storage/blobs.sql b/maintenance/storage/blobs.sql new file mode 100644 index 0000000000..9bf4d14870 --- /dev/null +++ b/maintenance/storage/blobs.sql @@ -0,0 +1,8 @@ +-- Blobs table for external storage + +CREATE TABLE /*$wgDBprefix*/blobs ( + blob_id int(8) NOT NULL default '0', + blob_text mediumtext, + PRIMARY KEY (blob_id) +) TYPE=InnoDB; + diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php new file mode 100644 index 0000000000..840ae3f787 --- /dev/null +++ b/maintenance/storage/resolveStubs.php @@ -0,0 +1,96 @@ +selectField( 'text', 'MAX(old_id)', false, $fname ); + $stubs = array(); + $flagsArray = array(); + + # Do it in 100 blocks + for ( $b = 0; $b < 100; $b++ ) { + print "$b%\r"; + $start = intval($maxID / 100) * $b + 1; + $end = intval($maxID / 100) * ($b + 1); + + $res = $dbr->select( 'text', array( 'old_id', 'old_text', 'old_flags' ), + "old_id>=$start AND old_id<=$end AND old_flags like '%object%' ". + "AND old_text LIKE 'O:15:\"historyblobstub\"%'", $fname ); + while ( $row = $dbr->fetchObject( $res ) ) { + $stubs[$row->old_id] = $row->old_text; + $flagsArray[$row->old_id] = $row->old_flags; + } + $dbr->freeResult( $res ); + } + print "100%\n"; + + print "\nConverting " . count( $stubs ) . " rows ...\n"; + + # Get master database, no transactions + $dbw =& wfGetDB( DB_MASTER ); + $dbw->clearFlag( DBO_TRX ); + $dbw->immediateCommit(); + + $i = 0; + foreach( $stubs as $id => $stub ) { + if ( !(++$i % REPORTING_INTERVAL) ) { + print "$i\n"; + wfWaitForSlaves( 5 ); + } + + $stub = unserialize( $stub ); + if ( get_class( $stub ) !== 'historyblobstub' ) { + print "Error, invalid stub object\n"; + return; + } + + # Get the (maybe) external row + $externalRow = $dbr->selectRow( 'text', array( 'old_text' ), + array( 'old_id' => $stub->mOldId, "old_flags LIKE '%external%'" ), + $fname + ); + + if ( !$externalRow ) { + # Object wasn't external + continue; + } + + # Preserve the legacy encoding flag, but switch from object to external + $flags = explode( ',', $flagsArray[$id] ); + if ( in_array( 'utf-8', $flags ) ) { + $newFlags = 'external,utf-8'; + } else { + $newFlags = 'external'; + } + + # Update the row + $dbw->update( 'text', + array( /* SET */ + 'old_flags' => $newFlags, + 'old_text' => $externalRow->old_text . '/' . $stub->mHash + ), + array( /* WHERE */ + 'old_id' => $id + ), $fname + ); + } +} + +?> -- 2.20.1