X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fpage%2FWikiPage.php;h=40665010a1755999f6028c82863bd85d5285f45b;hb=c2e2afbc900dda1228f8ea6f5a3609d569fce00a;hp=0344756f0fe7901eac34bd403fc7f52ce395a394;hpb=fe79bc528b0e054aa630bd4fcfcdd4a9804892da;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index 0344756f0f..40665010a1 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -504,13 +504,13 @@ class WikiPage implements Page, IDBAccessObject { /** * Loads page_touched and returns a value indicating if it should be used - * @return bool True if not a redirect + * @return bool True if this page exists and is not a redirect */ public function checkTouched() { if ( !$this->mDataLoaded ) { $this->loadPageData(); } - return !$this->mIsRedirect; + return ( $this->mId && !$this->mIsRedirect ); } /** @@ -1770,7 +1770,6 @@ class WikiPage implements Page, IDBAccessObject { $revisionId = $revision->insertOn( $dbw ); // Update page_latest and friends to reflect the new revision if ( !$this->updateRevisionOn( $dbw, $revision, null, $meta['oldIsRedirect'] ) ) { - $dbw->rollback( __METHOD__ ); // sanity; this should never happen throw new MWException( "Failed to update page row to use new revision." ); } @@ -1920,7 +1919,6 @@ class WikiPage implements Page, IDBAccessObject { $revisionId = $revision->insertOn( $dbw ); // Update the page record with revision data if ( !$this->updateRevisionOn( $dbw, $revision, 0 ) ) { - $dbw->rollback( __METHOD__ ); // sanity; this should never happen throw new MWException( "Failed to update page row to use new revision." ); } @@ -2875,6 +2873,10 @@ class WikiPage implements Page, IDBAccessObject { return $status; } + // Given the lock above, we can be confident in the title and page ID values + $namespace = $this->getTitle()->getNamespace(); + $dbKey = $this->getTitle()->getDBkey(); + // At this point we are now comitted to returning an OK // status unless some DB query error or other exception comes up. // This way callers don't have to call rollback() if $status is bad @@ -2895,54 +2897,50 @@ class WikiPage implements Page, IDBAccessObject { $bitfield = 'rev_deleted'; } - /** - * For now, shunt the revision data into the archive table. - * Text is *not* removed from the text table; bulk storage - * is left intact to avoid breaking block-compression or - * immutable storage schemes. - * - * For backwards compatibility, note that some older archive - * table entries will have ar_text and ar_flags fields still. - * - * In the future, we may keep revisions and mark them with - * the rev_deleted field, which is reserved for this purpose. - */ - - $row = [ - 'ar_namespace' => 'page_namespace', - 'ar_title' => 'page_title', - 'ar_comment' => 'rev_comment', - 'ar_user' => 'rev_user', - 'ar_user_text' => 'rev_user_text', - 'ar_timestamp' => 'rev_timestamp', - 'ar_minor_edit' => 'rev_minor_edit', - 'ar_rev_id' => 'rev_id', - 'ar_parent_id' => 'rev_parent_id', - 'ar_text_id' => 'rev_text_id', - 'ar_text' => '\'\'', // Be explicit to appease - 'ar_flags' => '\'\'', // MySQL's "strict mode"... - 'ar_len' => 'rev_len', - 'ar_page_id' => 'page_id', - 'ar_deleted' => $bitfield, - 'ar_sha1' => 'rev_sha1', - ]; + // For now, shunt the revision data into the archive table. + // Text is *not* removed from the text table; bulk storage + // is left intact to avoid breaking block-compression or + // immutable storage schemes. + // In the future, we may keep revisions and mark them with + // the rev_deleted field, which is reserved for this purpose. - if ( $wgContentHandlerUseDB ) { - $row['ar_content_model'] = 'rev_content_model'; - $row['ar_content_format'] = 'rev_content_format'; - } - - // Copy all the page revisions into the archive table - $dbw->insertSelect( - 'archive', - [ 'page', 'revision' ], - $row, - [ - 'page_id' => $id, - 'page_id = rev_page' - ], - __METHOD__ + // Get all of the page revisions + $res = $dbw->select( + 'revision', + Revision::selectFields(), + [ 'rev_page' => $id ], + __METHOD__, + 'FOR UPDATE' ); + // Build their equivalent archive rows + $rowsInsert = []; + foreach ( $res as $row ) { + $rowInsert = [ + 'ar_namespace' => $namespace, + 'ar_title' => $dbKey, + 'ar_comment' => $row->rev_comment, + 'ar_user' => $row->rev_user, + 'ar_user_text' => $row->rev_user_text, + 'ar_timestamp' => $row->rev_timestamp, + 'ar_minor_edit' => $row->rev_minor_edit, + 'ar_rev_id' => $row->rev_id, + 'ar_parent_id' => $row->rev_parent_id, + 'ar_text_id' => $row->rev_text_id, + 'ar_text' => '', + 'ar_flags' => '', + 'ar_len' => $row->rev_len, + 'ar_page_id' => $id, + 'ar_deleted' => $bitfield, + 'ar_sha1' => $row->rev_sha1, + ]; + if ( $wgContentHandlerUseDB ) { + $rowInsert['ar_content_model'] = $row->rev_content_model; + $rowInsert['ar_content_format'] = $row->rev_content_format; + } + $rowsInsert[] = $rowInsert; + } + // Copy them into the archive table + $dbw->insert( 'archive', $rowsInsert, __METHOD__ ); // Save this so we can pass it to the ArticleDeleteComplete hook. $archivedRevisionCount = $dbw->affectedRows();