From caa28ef02fb915824bb5fdf4041d9daecb857cf5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 11 Mar 2005 08:38:24 +0000 Subject: [PATCH] Consolidate some bits in Article::insertNewArticle() and Article::updateArticle() Added Article::insertOn() and Article::updateRevisionOn() for the db-accessing guts, using Revision for the actual revision+text saving. --- includes/Article.php | 194 ++++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 84 deletions(-) diff --git a/includes/Article.php b/includes/Article.php index 49bdb94d38..23db0ea5c5 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -702,6 +702,70 @@ class Article { $wgUser->clearNotification( $this->mTitle ); } + /** + * Insert a new empty page record for this article. + * This *must* be followed up by creating a revision + * and running $this->updateToLatest( $rev_id ); + * or else the record will be left in a funky state. + * Best if all done inside a transaction. + * + * @param Database $dbw + * @return int The newly created page_id key + * @access private + */ + function insertOn( &$dbw ) { + $fname = 'Article::insertOn'; + wfProfileIn( $fname ); + + $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' ); + $dbw->insert( 'page', array( + 'page_id' => $page_id, + 'page_namespace' => $this->mTitle->getNamespace(), + 'page_title' => $this->mTitle->getDBkey(), + 'page_counter' => 0, + 'page_restrictions' => '', + 'page_is_redirect' => 0, # Will set this shortly... + 'page_is_new' => 1, + 'page_random' => wfRandom(), + 'page_touched' => $dbw->timestamp(), + 'page_latest' => 0, # Fill this in shortly... + ), $fname ); + $newid = $dbw->insertId(); + + wfProfileOut( $fname ); + return $newid; + } + + /** + * Update the page record to point to a newly saved revision. + * + * @param Database $dbw + * @param int $revId + * @param int $lastRevision + * @param bool $isRedirect + * @return bool true on success, false on failure + * @access private + */ + function updateRevisionOn( &$dbw, $revId, $lastRevision, $isRedirect = false ) { + $fname = 'Article::updateToRevision'; + wfProfileIn( $fname ); + + $dbw->update( 'page', + array( /* SET */ + 'page_latest' => $revId, + 'page_touched' => $dbw->timestamp(), + 'page_is_new' => ($lastRevision == 0), + 'page_is_redirect' => $isRedirect, + ), array( /* WHERE */ + 'page_id' => $this->getId(), + 'page_latest' => $lastRevision, # Paranoia + ), $fname + ); + + wfProfileOut( $fname ); + return ( $dbw->affectedRows() != 0 ); + } + /** * Theoretically we could defer these whole insert and update * functions for after display, but that's taking a big leap @@ -720,53 +784,26 @@ class Article { $ns = $this->mTitle->getNamespace(); $ttl = $this->mTitle->getDBkey(); $text = $this->preSaveTransform( $text ); - if ( $this->isRedirect( $text ) ) { $redir = 1; } - else { $redir = 0; } - - $now = wfTimestampNow(); - wfSeedRandom(); - $rand = wfRandom(); $isminor = ( $isminor && $wgUser->isLoggedIn() ) ? 1 : 0; - - $mungedText = $text; - $flags = Revision::compressRevisionText( $mungedText ); $dbw =& wfGetDB( DB_MASTER ); - $old_id = $dbw->nextSequenceValue( 'text_old_id_seq' ); - $dbw->insert( 'text', array( - 'old_id' => $old_id, - 'old_text' => $mungedText, - 'old_flags' => $flags, - ), $fname ); - $revisionId = $dbw->insertId(); + # Add the page record; stake our claim on this title! + $newid = $this->insertOn( $dbw ); - $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' ); - $dbw->insert( 'page', array( - 'page_id' => $page_id, - 'page_namespace' => $ns, - 'page_title' => $ttl, - 'page_counter' => 0, - 'page_restrictions' => '', - 'page_is_redirect' => $redir, - 'page_is_new' => 1, - 'page_random' => $rand, - 'page_touched' => $dbw->timestamp($now), - 'page_latest' => $revisionId, - ), $fname ); - $newid = $dbw->insertId(); - - $dbw->insert( 'revision', array( - 'rev_page' => $newid, - 'rev_id' => $revisionId, - 'rev_comment' => $summary, - 'rev_user' => $wgUser->getID(), - 'rev_timestamp' => $dbw->timestamp($now), - 'rev_minor_edit' => $isminor, - 'rev_user_text' => $wgUser->getName(), - ), $fname ); + # Save the revision text... + $revision = new Revision( array( + 'page' => $newid, + 'comment' => $summary, + 'minor_edit' => $isminor, + 'text' => $text + ) ); + $revisionId = $revision->insertOn( $dbw ); $this->mTitle->resetArticleID( $newid ); + + # Update the page record with revision data + $this->updateRevisionOn( $dbw, $revisionId, 0, $this->isRedirect( $text ) ); Article::onArticleCreate( $this->mTitle ); RecentChange::notifyNew( $now, $this->mTitle, $isminor, $wgUser, $summary ); @@ -918,8 +955,7 @@ class Article { $fname = 'Article::updateArticle'; $good = true; - if ( $this->mMinorEdit ) { $me1 = 1; } else { $me1 = 0; } - if ( $minor && $wgUser->isLoggedIn() ) { $me2 = 1; } else { $me2 = 0; } + $isminor = ( $minor && $wgUser->isLoggedIn() ); if ( $this->isRedirect( $text ) ) { # Remove all content but redirect # This could be done by reconstructing the redirect from a title given by @@ -959,25 +995,15 @@ class Article { $revision = new Revision( array( 'page' => $this->getId(), 'comment' => $summary, - 'minor_edit' => $me2, + 'minor_edit' => $isminor, 'text' => $text ) ); $revisionId = $revision->insertOn( $dbw ); # Update page - $dbw->update( 'page', - array( /* SET */ - 'page_latest' => $revisionId, - 'page_touched' => $dbw->timestamp( $now ), - 'page_is_new' => 0, - 'page_is_redirect' => $redir, - ), array( /* WHERE */ - 'page_id' => $this->getID(), - 'page_latest' => $lastRevision, # Paranoia - ), $fname - ); + $ok = $this->updateRevisionOn( $dbw, $revisionId, $lastRevision, $redir ); - if( $dbw->affectedRows() == 0 ) { + if( !$ok ) { /* Belated edit conflict! Run away!! */ $good = false; } else { @@ -996,38 +1022,38 @@ class Article { } if ( $good ) { - if ($watchthis) { - if (!$this->mTitle->userIsWatching()) $this->watch(); - } else { - if ( $this->mTitle->userIsWatching() ) { - $this->unwatch(); + if ($watchthis) { + if (!$this->mTitle->userIsWatching()) $this->watch(); + } else { + if ( $this->mTitle->userIsWatching() ) { + $this->unwatch(); + } } - } - # standard deferred updates - $this->editUpdates( $text, $summary, $minor, $now ); - - - $urls = array(); - # Template namespace - # Purge all articles linking here - if ( $this->mTitle->getNamespace() == NS_TEMPLATE) { - $titles = $this->mTitle->getLinksTo(); - Title::touchArray( $titles ); + # standard deferred updates + $this->editUpdates( $text, $summary, $minor, $now ); + + + $urls = array(); + # Template namespace + # Purge all articles linking here + if ( $this->mTitle->getNamespace() == NS_TEMPLATE) { + $titles = $this->mTitle->getLinksTo(); + Title::touchArray( $titles ); + if ( $wgUseSquid ) { + foreach ( $titles as $title ) { + $urls[] = $title->getInternalURL(); + } + } + } + + # Squid updates if ( $wgUseSquid ) { - foreach ( $titles as $title ) { - $urls[] = $title->getInternalURL(); - } + $urls = array_merge( $urls, $this->mTitle->getSquidURLs() ); + $u = new SquidUpdate( $urls ); + array_push( $wgPostCommitUpdateList, $u ); } - } - - # Squid updates - if ( $wgUseSquid ) { - $urls = array_merge( $urls, $this->mTitle->getSquidURLs() ); - $u = new SquidUpdate( $urls ); - array_push( $wgPostCommitUpdateList, $u ); - } - - $this->showArticle( $text, wfMsg( 'updated' ), $sectionanchor, $me2, $now, $summary, $lastRevision ); + + $this->showArticle( $text, wfMsg( 'updated' ), $sectionanchor, $me2, $now, $summary, $lastRevision ); } return $good; } -- 2.20.1