X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Ffilerepo%2Ffile%2FLocalFile.php;h=263e45b015aa50ccafe8fa65708b682c46e520e0;hb=d9ba7cd0050d531c4f016fda285793568fa133c7;hp=7be8f06246dab06cc464cb2b9d84e615cf70b490;hpb=526341516a91502ac7cfd2e5590e7432b3f50c5d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 7be8f06246..263e45b015 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -24,6 +24,7 @@ use MediaWiki\Logger\LoggerFactory; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\IDatabase; +use MediaWiki\MediaWikiServices; /** * Class to represent a local file in the wiki's own database @@ -215,7 +216,7 @@ class LocalFile extends File { 'img_user_text', 'img_timestamp', 'img_sha1', - ] + CommentStore::newKey( 'img_description' )->getFields(); + ] + CommentStore::getStore()->getFields( 'img_description' ); } /** @@ -230,7 +231,7 @@ class LocalFile extends File { * - joins: (array) to include in the `$join_conds` to `IDatabase->select()` */ public static function getQueryInfo( array $options = [] ) { - $commentQuery = CommentStore::newKey( 'img_description' )->getJoin(); + $commentQuery = CommentStore::getStore()->getJoin( 'img_description' ); $ret = [ 'tables' => [ 'image' ] + $commentQuery['tables'], 'fields' => [ @@ -566,8 +567,8 @@ class LocalFile extends File { function decodeRow( $row, $prefix = 'img_' ) { $decoded = $this->unprefixRow( $row, $prefix ); - $decoded['description'] = CommentStore::newKey( 'description' ) - ->getComment( (object)$decoded )->text; + $decoded['description'] = CommentStore::getStore() + ->getComment( 'description', (object)$decoded )->text; $decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] ); @@ -1275,6 +1276,10 @@ class LocalFile extends File { ) { if ( $this->getRepo()->getReadOnlyReason() !== false ) { return $this->readOnlyFatalStatus(); + } elseif ( MediaWikiServices::getInstance()->getRevisionStore()->isReadOnly() ) { + // Check this in advance to avoid writing to FileBackend and the file tables, + // only to fail on insert the revision due to the text store being unavailable. + return $this->readOnlyFatalStatus(); } $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src; @@ -1292,7 +1297,7 @@ class LocalFile extends File { $options = []; $handler = MediaHandler::getHandler( $props['mime'] ); if ( $handler ) { - $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] ); + $metadata = Wikimedia\quietCall( 'unserialize', $props['metadata'] ); if ( !is_array( $metadata ) ) { $metadata = []; @@ -1424,9 +1429,9 @@ class LocalFile extends File { # Test to see if the row exists using INSERT IGNORE # This avoids race conditions by locking the row until the commit, and also # doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition. - $commentStore = new CommentStore( 'img_description' ); + $commentStore = CommentStore::getStore(); list( $commentFields, $commentCallback ) = - $commentStore->insertWithTempTable( $dbw, $comment ); + $commentStore->insertWithTempTable( $dbw, 'img_description', $comment ); $dbw->insert( 'image', [ 'img_name' => $this->getName(), @@ -1522,7 +1527,9 @@ class LocalFile extends File { [ 'image_comment_temp' => [ 'LEFT JOIN', [ 'imgcomment_name = img_name' ] ] ] ); foreach ( $res as $row ) { - list( , $callback ) = $commentStore->insertWithTempTable( $dbw, $row->img_description ); + list( , $callback ) = $commentStore->insertWithTempTable( + $dbw, 'img_description', $row->img_description + ); $callback( $row->img_name ); } } @@ -2403,10 +2410,7 @@ class LocalFileDeleteBatch { $now = time(); $dbw = $this->file->repo->getMasterDB(); - $commentStoreImgDesc = new CommentStore( 'img_description' ); - $commentStoreOiDesc = new CommentStore( 'oi_description' ); - $commentStoreFaDesc = new CommentStore( 'fa_description' ); - $commentStoreFaReason = new CommentStore( 'fa_deleted_reason' ); + $commentStore = CommentStore::getStore(); $encTimestamp = $dbw->addQuotes( $dbw->timestamp( $now ) ); $encUserId = $dbw->addQuotes( $this->user->getId() ); @@ -2454,7 +2458,7 @@ class LocalFileDeleteBatch { $fields += array_map( [ $dbw, 'addQuotes' ], - $commentStoreFaReason->insert( $dbw, $this->reason ) + $commentStore->insert( $dbw, 'fa_deleted_reason', $this->reason ) ); if ( $wgCommentTableSchemaMigrationStage <= MIGRATION_WRITE_BOTH ) { @@ -2484,7 +2488,9 @@ class LocalFileDeleteBatch { [ 'image_comment_temp' => [ 'LEFT JOIN', [ 'imgcomment_name = img_name' ] ] ] ); foreach ( $res as $row ) { - list( , $callback ) = $commentStoreImgDesc->insertWithTempTable( $dbw, $row->img_description ); + list( , $callback ) = $commentStore->insertWithTempTable( + $dbw, 'img_description', $row->img_description + ); $callback( $row->img_name ); } } @@ -2508,9 +2514,9 @@ class LocalFileDeleteBatch { ); $rowsInsert = []; if ( $res->numRows() ) { - $reason = $commentStoreFaReason->createComment( $dbw, $this->reason ); + $reason = $commentStore->createComment( $dbw, $this->reason ); foreach ( $res as $row ) { - $comment = $commentStoreOiDesc->getComment( $row ); + $comment = $commentStore->getComment( 'oi_description', $row ); $rowsInsert[] = [ // Deletion-specific fields 'fa_storage_group' => 'deleted', @@ -2535,8 +2541,8 @@ class LocalFileDeleteBatch { 'fa_user_text' => $row->oi_user_text, 'fa_timestamp' => $row->oi_timestamp, 'fa_sha1' => $row->oi_sha1 - ] + $commentStoreFaReason->insert( $dbw, $reason ) - + $commentStoreFaDesc->insert( $dbw, $comment ); + ] + $commentStore->insert( $dbw, 'fa_deleted_reason', $reason ) + + $commentStore->insert( $dbw, 'fa_description', $comment ); } } @@ -2734,9 +2740,7 @@ class LocalFileRestoreBatch { $dbw = $this->file->repo->getMasterDB(); - $commentStoreImgDesc = new CommentStore( 'img_description' ); - $commentStoreOiDesc = new CommentStore( 'oi_description' ); - $commentStoreFaDesc = new CommentStore( 'fa_description' ); + $commentStore = CommentStore::getStore(); $status = $this->file->repo->newGood(); @@ -2824,12 +2828,12 @@ class LocalFileRestoreBatch { ]; } - $comment = $commentStoreFaDesc->getComment( $row ); + $comment = $commentStore->getComment( 'fa_description', $row ); if ( $first && !$exists ) { // This revision will be published as the new current version $destRel = $this->file->getRel(); list( $commentFields, $commentCallback ) = - $commentStoreImgDesc->insertWithTempTable( $dbw, $comment ); + $commentStore->insertWithTempTable( $dbw, 'img_description', $comment ); $insertCurrent = [ 'img_name' => $row->fa_name, 'img_size' => $row->fa_size, @@ -2885,7 +2889,7 @@ class LocalFileRestoreBatch { 'oi_minor_mime' => $props['minor_mime'], 'oi_deleted' => $this->unsuppress ? 0 : $row->fa_deleted, 'oi_sha1' => $sha1 - ] + $commentStoreOiDesc->insert( $dbw, $comment ); + ] + $commentStore->insert( $dbw, 'oi_description', $comment ); } $deleteIds[] = $row->fa_id;