mHash = $hash; } /** * Sets the location (old_id) of the main object to which this object * points * @param int $id */ public function setLocation( $id ) { $this->mOldId = $id; } /** * Gets the location of the main object * @return int */ public function getLocation() { return $this->mOldId; } /** * Sets the location (old_id) of the referring object * @param string $id */ public function setReferrer( $id ) { $this->mRef = $id; } /** * Gets the location of the referring object * @return string */ public function getReferrer() { return $this->mRef; } /** * @return string|false */ public function getText() { if ( isset( self::$blobCache[$this->mOldId] ) ) { $obj = self::$blobCache[$this->mOldId]; } else { $dbr = MediaWikiServices::getInstance()->getConnectionProvider()->getReplicaDatabase(); $row = $dbr->newSelectQueryBuilder() ->select( [ 'old_flags', 'old_text' ] ) ->from( 'text' ) ->where( [ 'old_id' => $this->mOldId ] ) ->caller( __METHOD__ )->fetchRow(); if ( !$row ) { return false; } $flags = explode( ',', $row->old_flags ); if ( in_array( 'external', $flags ) ) { $url = $row->old_text; $parts = explode( '://', $url, 2 ); if ( !isset( $parts[1] ) || $parts[1] == '' ) { return false; } $row->old_text = MediaWikiServices::getInstance() ->getExternalStoreAccess() ->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 = HistoryBlobUtils::unserialize( gzinflate( $row->old_text ), true ); } else { $obj = HistoryBlobUtils::unserialize( $row->old_text, true ); } // Save this item for reference; if pulling many // items in a row we'll likely use it again. self::$blobCache = [ $this->mOldId => $obj ]; } if ( method_exists( $obj, 'getItem' ) ) { return $obj->getItem( $this->mHash ); } return false; } /** * Get the content hash * * @return string */ public function getHash() { return $this->mHash; } } // Blobs generated by MediaWiki < 1.5 on PHP 4 were serialized with the // class name coerced to lowercase. We can improve efficiency by adding // autoload entries for the lowercase variants of these classes (T166759). // The code below is never executed, but it is picked up by the AutoloadGenerator // parser, which scans for class_alias() calls. /* class_alias( HistoryBlobStub::class, 'historyblobstub' ); */