X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FHistoryBlob.php;h=587588552ddf3403a2f664eeeffb8b79acdfeb4e;hb=09da7fb96c45255899fa0f4c62412d14b8575b3e;hp=ebc47145d4587a6555decb0be4b2742d56b1bd29;hpb=7d1442e76f6cf626e746764c9e1737030db6c277;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php index ebc47145d4..587588552d 100644 --- a/includes/HistoryBlob.php +++ b/includes/HistoryBlob.php @@ -10,18 +10,30 @@ */ class HistoryBlob { - # setMeta and getMeta currently aren't used for anything, I just thought they might be useful in the future - # The meta value is a single string + /** + * setMeta and getMeta currently aren't used for anything, I just thought + * they might be useful in the future. + * @param string $meta a single string + */ function setMeta( $meta ) {} - # Gets the meta-value + /** + * setMeta and getMeta currently aren't used for anything, I just thought + * they might be useful in the future. + * Gets the meta-value + */ function getMeta() {} - # Adds an item of text, returns a stub object which points to the item - # You must call setLocation() on the stub object before storing it to the database + /** + * Adds an item of text, returns a stub object which points to the item. + * You must call setLocation() on the stub object before storing it to the + * database + */ function addItem() {} - # Get item by hash + /** + * Get item by hash + */ function getItem( $hash ) {} # Set the "default text" @@ -30,7 +42,9 @@ class HistoryBlob # be other revisions in the same object function setText() {} - # Get default text. This is called from Article::getRevisionText() + /** + * Get default text. This is called from Revision::getRevisionText() + */ function getText() {} } @@ -48,17 +62,20 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob die( "Need zlib support to read or write this kind of history object (ConcatenatedGzipHistoryBlob)\n" ); } } - + + /** @todo document */ function setMeta( $metaData ) { $this->uncompress(); $this->mItems['meta'] = $metaData; } + /** @todo document */ function getMeta() { $this->uncompress(); return $this->mItems['meta']; } - + + /** @todo document */ function addItem( $text ) { $this->uncompress(); $hash = md5( $text ); @@ -69,6 +86,7 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob return $stub; } + /** @todo document */ function getItem( $hash ) { $this->uncompress(); if ( array_key_exists( $hash, $this->mItems ) ) { @@ -78,11 +96,13 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob } } + /** @todo document */ function removeItem( $hash ) { $this->mSize -= strlen( $this->mItems[$hash] ); unset( $this->mItems[$hash] ); } - + + /** @todo document */ function compress() { if ( !$this->mCompressed ) { $this->mItems = gzdeflate( serialize( $this->mItems ) ); @@ -90,6 +110,7 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob } } + /** @todo document */ function uncompress() { if ( $this->mCompressed ) { $this->mItems = unserialize( gzinflate( $this->mItems ) ); @@ -97,32 +118,38 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob } } + /** @todo document */ function getText() { $this->uncompress(); return $this->getItem( $this->mDefaultHash ); } - + + /** @todo document */ function setText( $text ) { $this->uncompress(); $stub = $this->addItem( $text ); $this->mDefaultHash = $stub->mHash; } + /** @todo document */ function __sleep() { $this->compress(); return array( 'mVersion', 'mCompressed', 'mItems', 'mDefaultHash' ); } + /** @todo document */ function __wakeup() { $this->uncompress(); } - # Determines if this object is happy + /** + * Determines if this object is happy + */ function isHappy( $maxFactor, $factorThreshold ) { if ( count( $this->mItems ) == 0 ) { return true; } - if ( $this->mFast ) { + if ( !$this->mFast ) { $this->uncompress(); $record = serialize( $this->mItems ); $size = strlen( $record ); @@ -140,34 +167,141 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob } } -class HistoryBlobStub -{ - var $mOldId, $mHash; +/** + * One-step cache variable to hold base blobs; operations that + * pull multiple revisions may often pull multiple times from + * the same blob. By keeping the last-used one open, we avoid + * redundant unserialization and decompression overhead. + */ +global $wgBlobCache; +$wgBlobCache = array(); + + +/** + * @package MediaWiki + */ +class HistoryBlobStub { + var $mOldId, $mHash, $mRef; + + /** @todo document */ function HistoryBlobStub( $hash = '', $oldid = 0 ) { $this->mHash = $hash; } - # Sets the location (old_id) of the main object to which this object points + /** + * Sets the location (old_id) of the main object to which this object + * points + */ function setLocation( $id ) { $this->mOldId = $id; } - + + /** + * Sets the location (old_id) of the referring object + */ + function setReferrer( $id ) { + $this->mRef = $id; + } + + /** + * Gets the location of the referring object + */ + function getReferrer() { + return $this->mRef; + } + + /** @todo document */ function getText() { - $dbr =& wfGetDB( DB_SLAVE ); - $row = $dbr->selectRow( 'old', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) ); - if ( !$row || $row->old_flags != 'object' ) { - return false; - } - $obj = unserialize( $row->old_text ); - if ( !is_object( $obj ) ) { - $obj = unserialize( $obj ); + global $wgBlobCache; + if( isset( $wgBlobCache[$this->mOldId] ) ) { + $obj = $wgBlobCache[$this->mOldId]; + } else { + $dbr =& wfGetDB( DB_SLAVE ); + $row = $dbr->selectRow( 'text', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) ); + if( !$row ) { + return false; + } + $flags = explode( ',', $row->old_flags ); + if( in_array( 'external', $flags ) ) { + $url=$row->old_text; + @list($proto,$path)=explode('://',$url,2); + if ($path=="") { + wfProfileOut( $fname ); + return false; + } + require_once('ExternalStore.php'); + $row->old_text=ExternalStore::fetchFromUrl($url); + + } + if( !in_array( 'object', $flags ) ) { + return false; + } + + if( in_array( 'gzip', $flags ) ) { + // This shouldn't happen, but a bug in the compress script + // may at times gzip-compress a HistoryBlob object row. + $obj = unserialize( gzinflate( $row->old_text ) ); + } else { + $obj = unserialize( $row->old_text ); + } + + if( !is_object( $obj ) ) { + // Correct for old double-serialization bug. + $obj = unserialize( $obj ); + } + + // Save this item for reference; if pulling many + // items in a row we'll likely use it again. + $obj->uncompress(); + $wgBlobCache = array( $this->mOldId => $obj ); } return $obj->getItem( $this->mHash ); } + /** @todo document */ function getHash() { return $this->mHash; } } + + +/** + * To speed up conversion from 1.4 to 1.5 schema, text rows can refer to the + * leftover cur table as the backend. This avoids expensively copying hundreds + * of megabytes of data during the conversion downtime. + * + * Serialized HistoryBlobCurStub objects will be inserted into the text table + * on conversion if $wgFastSchemaUpgrades is set to true. + * + * @package MediaWiki + */ +class HistoryBlobCurStub { + var $mCurId; + + /** @todo document */ + function HistoryBlobCurStub( $curid = 0 ) { + $this->mCurId = $curid; + } + + /** + * Sets the location (cur_id) of the main object to which this object + * points + */ + function setLocation( $id ) { + $this->mCurId = $id; + } + + /** @todo document */ + function getText() { + $dbr =& wfGetDB( DB_SLAVE ); + $row = $dbr->selectRow( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mCurId ) ); + if( !$row ) { + return false; + } + return $row->cur_text; + } +} + + ?>