addDescription( "Fetch the raw revision blob from a blob address.\n" . "Integer IDs are interpreted as referring to text.old_id for backwards compatibility.\n" . "NOTE: Export transformations are NOT applied. " . "This is left to dumpTextPass.php" ); } /** * @return SqlBlobStore */ private function getBlobStore() { return MediaWikiServices::getInstance()->getBlobStore(); } /** * returns a string containing the following in order: * textid * \n * length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc) * \n * text (may be empty) * * note that the text string itself is *not* followed by newline */ public function execute() { $stdin = $this->getStdin(); while ( !feof( $stdin ) ) { $line = fgets( $stdin ); if ( $line === false ) { // We appear to have lost contact... break; } $blobAddress = trim( $line ); // Plain integers are supported for backwards compatibility with pre-MCR dumps. if ( strpos( $blobAddress, ':' ) === false && is_numeric( $blobAddress ) ) { $blobAddress = SqlBlobStore::makeAddressFromTextId( intval( $blobAddress ) ); } try { $text = $this->getBlobStore()->getBlob( $blobAddress ); $textLen = strlen( $text ); } catch ( BlobAccessException $ex ) { // XXX: log $ex to stderr? $textLen = '-1'; $text = ''; } catch ( InvalidArgumentException $ex ) { // XXX: log $ex to stderr? $textLen = '-1'; $text = ''; } $this->output( $blobAddress . "\n" . $textLen . "\n" . $text ); } } } $maintClass = FetchText::class; require_once RUN_MAINTENANCE_IF_MAIN;