X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FEditPage.php;h=1fb7925a7f4b09b30ca090a06a439cb0f29ad607;hb=60c94987aab3141a19d735fbc003d5cb646a8502;hp=06910ecee24ee7e8a3a41558f70a0b0cc0dbb302;hpb=c410b3f316335e6d23ae2b629c707c7df7c2318d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index 06910ecee2..1fb7925a7f 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1,10 +1,18 @@ mArticle =& $article; global $wgTitle; $this->mTitle =& $wgTitle; } - # This is the function that gets called for "action=edit". - - function edit() - { + /** + * This is the function that gets called for "action=edit". + */ + function edit() { global $wgOut, $wgUser, $wgWhitelistEdit, $wgRequest; // this is not an article $wgOut->setArticleFlag(false); @@ -46,31 +58,34 @@ class EditPage { } if ( wfReadOnly() ) { if( $this->save || $this->preview ) { - $this->editForm( "preview" ); + $this->editForm( 'preview' ); } else { $wgOut->readOnlyPage( $this->mArticle->getContent( true ) ); } return; } if ( $this->save ) { - $this->editForm( "save" ); - } else if ( $this->preview ) { - $this->editForm( "preview" ); + $this->editForm( 'save' ); + } else if ( $this->preview or $wgUser->getOption('previewonfirst')) { + $this->editForm( 'preview' ); } else { # First time through - $this->editForm( "initial" ); + $this->editForm( 'initial' ); } } + /** + * @todo document + */ function importFormData( &$request ) { # These fields need to be checked for encoding. # Also remove trailing whitespace, but don't remove _initial_ # whitespace from the text boxes. This may be significant formatting. - $this->textbox1 = rtrim( $request->getText( "wpTextbox1" ) ); - $this->textbox2 = rtrim( $request->getText( "wpTextbox2" ) ); - $this->summary = trim( $request->getText( "wpSummary" ) ); + $this->textbox1 = rtrim( $request->getText( 'wpTextbox1' ) ); + $this->textbox2 = rtrim( $request->getText( 'wpTextbox2' ) ); + $this->summary = trim( $request->getText( 'wpSummary' ) ); $this->edittime = $request->getVal( 'wpEdittime' ); - if( !preg_match( '/^\d{14}$/', $this->edittime ) ) $this->edittime = ""; + if( !preg_match( '/^\d{14}$/', $this->edittime )) $this->edittime = ''; $this->preview = $request->getCheck( 'wpPreview' ); $this->save = $request->wasPosted() && !$this->preview; @@ -83,32 +98,34 @@ class EditPage { $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) ); } - # Since there is only one text field on the edit form, - # pressing will cause the form to be submitted, but - # the submit button value won't appear in the query, so we - # Fake it here before going back to edit(). This is kind of - # ugly, but it helps some old URLs to still work. - - function submit() - { + /** + * Since there is only one text field on the edit form, + * pressing will cause the form to be submitted, but + * the submit button value won't appear in the query, so we + * Fake it here before going back to edit(). This is kind of + * ugly, but it helps some old URLs to still work. + */ + function submit() { if( !$this->preview ) $this->save = true; $this->edit(); } - # The edit form is self-submitting, so that when things like - # preview and edit conflicts occur, we get the same form back - # with the extra stuff added. Only when the final submission - # is made and all is well do we actually save and redirect to - # the newly-edited page. - - function editForm( $formtype ) - { + /** + * The edit form is self-submitting, so that when things like + * preview and edit conflicts occur, we get the same form back + * with the extra stuff added. Only when the final submission + * is made and all is well do we actually save and redirect to + * the newly-edited page. + * + * @param string $formtype Type of form either : save, initial or preview + */ + function editForm( $formtype ) { global $wgOut, $wgUser; global $wgLang, $wgParser, $wgTitle; global $wgAllowAnonymousMinor; global $wgWhitelistEdit; - global $wgSpamRegex; + global $wgSpamRegex, $wgFilterCallback; $sk = $wgUser->getSkin(); $isConflict = false; @@ -116,11 +133,11 @@ class EditPage { $isCssJsSubpage = (Namespace::getUser() == $wgTitle->getNamespace() and preg_match("/\\.(css|js)$/", $wgTitle->getText() )); if(!$this->mTitle->getArticleID()) { # new article - $wgOut->addWikiText(wfmsg("newarticletext")); + $wgOut->addWikiText(wfmsg('newarticletext')); } if( Namespace::isTalk( $this->mTitle->getNamespace() ) ) { - $wgOut->addWikiText(wfmsg("talkpagetext")); + $wgOut->addWikiText(wfmsg('talkpagetext')); } # Attempt submission here. This will check for edit conflicts, @@ -128,16 +145,15 @@ class EditPage { # that edit() already checked just in case someone tries to sneak # in the back door with a hand-edited submission URL. - if ( "save" == $formtype ) { + if ( 'save' == $formtype ) { # Check for spam - if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1 ) ) { - if ( $wgUser->isSysop() ) { - $this->spamPage(); - } else { - sleep(10); - $wgOut->redirect( $this->mTitle->getFullURL() ); - } - return; + if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) { + $this->spamPage ( $matches ); + return; + } + if ( $wgFilterCallback && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section ) ) { + # Error messages or other handling should be performed by the filter function + return; } if ( $wgUser->isBlocked() ) { $this->blockedIPpage(); @@ -153,11 +169,11 @@ class EditPage { } # If article is new, insert it. - $aid = $this->mTitle->getArticleID(); + $aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE ); if ( 0 == $aid ) { # Don't save a new article if it's blank. - if ( ( "" == $this->textbox1 ) || - ( wfMsg( "newarticletext" ) == $this->textbox1 ) ) { + if ( ( '' == $this->textbox1 ) || + ( wfMsg( 'newarticletext' ) == $this->textbox1 ) ) { $wgOut->redirect( $this->mTitle->getFullURL() ); return; } @@ -168,15 +184,22 @@ class EditPage { # Article exists. Check for edit conflict. $this->mArticle->clear(); # Force reload of dates, etc. + $this->mArticle->forUpdate( true ); # Lock the article - if( ( $this->section != "new" ) && + if( ( $this->section != 'new' ) && ($this->mArticle->getTimestamp() != $this->edittime ) ) { $isConflict = true; } $userid = $wgUser->getID(); - $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded( - $this->section, $this->textbox1, $this->summary); + if ( $isConflict) { + $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded( + $this->section, $this->textbox1, $this->summary, $this->edittime); + } + else { + $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded( + $this->section, $this->textbox1, $this->summary); + } # Suppress edit conflict with self if ( ( 0 != $userid ) && ( $this->mArticle->getUser() == $userid ) ) { @@ -189,7 +212,7 @@ class EditPage { // Successful merge! Maybe we should tell the user the good news? $isConflict = false; } else { - $this->section = ""; + $this->section = ''; $this->textbox1 = $text; } } @@ -230,33 +253,33 @@ class EditPage { # First time through: get contents, set time for conflict # checking, etc. - if ( "initial" == $formtype ) { + if ( 'initial' == $formtype ) { $this->edittime = $this->mArticle->getTimestamp(); $this->textbox1 = $this->mArticle->getContent( true ); - $this->summary = ""; + $this->summary = ''; $this->proxyCheck(); } - $wgOut->setRobotpolicy( "noindex,nofollow" ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); # Enabled article-related sidebar, toplinks, etc. $wgOut->setArticleRelated( true ); if ( $isConflict ) { - $s = wfMsg( "editconflict", $this->mTitle->getPrefixedText() ); + $s = wfMsg( 'editconflict', $this->mTitle->getPrefixedText() ); $wgOut->setPageTitle( $s ); - $wgOut->addHTML( wfMsg( "explainconflict" ) ); + $wgOut->addHTML( wfMsg( 'explainconflict' ) ); $this->textbox2 = $this->textbox1; $this->textbox1 = $this->mArticle->getContent( true ); $this->edittime = $this->mArticle->getTimestamp(); } else { - $s = wfMsg( "editing", $this->mTitle->getPrefixedText() ); + $s = wfMsg( 'editing', $this->mTitle->getPrefixedText() ); - if( $this->section != "" ) { - if( $this->section == "new" ) { - $s.=wfMsg("commentedit"); + if( $this->section != '' ) { + if( $this->section == 'new' ) { + $s.=wfMsg('commentedit'); } else { - $s.=wfMsg("sectionedit"); + $s.=wfMsg('sectionedit'); } if(!$this->preview) { $sectitle=preg_match("/^=+(.*?)=+/mi", @@ -270,67 +293,71 @@ class EditPage { $wgOut->setPageTitle( $s ); if ( $this->oldid ) { $this->mArticle->setOldSubtitle(); - $wgOut->addHTML( wfMsg( "editingold" ) ); + $wgOut->addHTML( wfMsg( 'editingold' ) ); } } if( wfReadOnly() ) { - $wgOut->addHTML( "" . - wfMsg( "readonlywarning" ) . + $wgOut->addHTML( '' . + wfMsg( 'readonlywarning' ) . "" ); - } else if ( $isCssJsSubpage and "preview" != $formtype) { - $wgOut->addHTML( wfMsg( "usercssjsyoucanpreview" )); + } else if ( $isCssJsSubpage and 'preview' != $formtype) { + $wgOut->addHTML( wfMsg( 'usercssjsyoucanpreview' )); } if( $this->mTitle->isProtected() ) { - $wgOut->addHTML( "" . wfMsg( "protectedpagewarning" ) . + $wgOut->addHTML( '' . wfMsg( 'protectedpagewarning' ) . "
\n" ); } $kblength = (int)(strlen( $this->textbox1 ) / 1024); if( $kblength > 29 ) { - $wgOut->addHTML( "" . - wfMsg( "longpagewarning", $kblength ) - . "" ); + $wgOut->addHTML( '' . + wfMsg( 'longpagewarning', $wgLang->formatNum( $kblength ) ) + . '' ); } - $rows = $wgUser->getOption( "rows" ); - $cols = $wgUser->getOption( "cols" ); + $rows = $wgUser->getOption( 'rows' ); + $cols = $wgUser->getOption( 'cols' ); - $ew = $wgUser->getOption( "editwidth" ); + $ew = $wgUser->getOption( 'editwidth' ); if ( $ew ) $ew = " style=\"width:100%\""; - else $ew = "" ; + else $ew = ''; - $q = "action=submit"; + $q = 'action=submit'; #if ( "no" == $redirect ) { $q .= "&redirect=no"; } $action = $this->mTitle->escapeLocalURL( $q ); - $summary = wfMsg( "summary" ); - $subject = wfMsg("subject"); - $minor = wfMsg( "minoredit" ); - $watchthis = wfMsg ("watchthis"); - $save = wfMsg( "savearticle" ); - $prev = wfMsg( "showpreview" ); + $summary = wfMsg('summary'); + $subject = wfMsg('subject'); + $minor = wfMsg('minoredit'); + $watchthis = wfMsg ('watchthis'); + $save = wfMsg('savearticle'); + $prev = wfMsg('showpreview'); $cancel = $sk->makeKnownLink( $this->mTitle->getPrefixedText(), - wfMsg( "cancel" ) ); - $edithelpurl = $sk->makeUrl( wfMsg( "edithelppage" )); - $edithelp = ''. - wfMsg( "edithelp" ).''; - $copywarn = wfMsg( "copyrightwarning", $sk->makeKnownLink( - wfMsg( "copyrightpage" ) ) ); - - if( $wgUser->getOption("showtoolbar") and !$isCssJsSubpage ) { + wfMsg('cancel') ); + $edithelpurl = $sk->makeUrl( wfMsg( 'edithelppage' )); + $edithelp = ''. + htmlspecialchars( wfMsg( 'edithelp' ) ).' '. + htmlspecialchars( wfMsg( 'newwindow' ) ); + + global $wgRightsText; + $copywarn = "
\n" . + wfMsg( $wgRightsText ? 'copyrightwarning' : 'copyrightwarning2', + '[[' . wfMsg( 'copyrightpage' ) . ']]', + $wgRightsText ) . "\n
"; + + if( $wgUser->getOption('showtoolbar') and !$isCssJsSubpage ) { # prepare toolbar for edit buttons $toolbar = $sk->getEditToolbar(); } else { - $toolbar = ""; + $toolbar = ''; } // activate checkboxes if user wants them to be always active if( !$this->preview ) { - if( $wgUser->getOption( "watchdefault" ) ) $this->watchthis = true; - if( $wgUser->getOption( "minordefault" ) ) $this->minoredit = true; + if( $wgUser->getOption( 'watchdefault' ) ) $this->watchthis = true; + if( $wgUser->getOption( 'minordefault' ) ) $this->minoredit = true; // activate checkbox also if user is already watching the page, // require wpWatchthis to be unset so that second condition is not @@ -338,39 +365,40 @@ class EditPage { if( !$this->watchthis && $this->mTitle->userIsWatching() ) $this->watchthis = true; } - $minoredithtml = ""; + $minoredithtml = ''; if ( 0 != $wgUser->getID() || $wgAllowAnonymousMinor ) { $minoredithtml = - "minoredit?" checked='checked'":""). - " accesskey='".wfMsg('accesskey-minoredit')."' id='wpMinoredit' />". - ""; + "minoredit?" checked='checked'":""). + " accesskey='".wfMsg('accesskey-minoredit')."' id='wpMinoredit' />". + ""; } - $watchhtml = ""; + $watchhtml = ''; if ( 0 != $wgUser->getID() ) { $watchhtml = "watchthis?" checked='checked'":""). - " accesskey='".wfMsg('accesskey-watch')."' id='wpWatchthis' />". - ""; + " accesskey='".wfMsg('accesskey-watch')."' id='wpWatchthis' />". + ""; } - $checkboxhtml = $minoredithtml . $watchhtml . "
"; + $checkboxhtml = $minoredithtml . $watchhtml . '
'; - if ( "preview" == $formtype) { - $previewhead="

" . wfMsg( "preview" ) . "

\n

" . - wfMsg( "note" ) . wfMsg( "previewnote" ) . "

\n"; + if ( 'preview' == $formtype) { + $previewhead='

' . wfMsg( 'preview' ) . "

\n

" . + wfMsg( 'note' ) . wfMsg( 'previewnote' ) . "

\n"; if ( $isConflict ) { - $previewhead.="

" . wfMsg( "previewconflict" ) . - "

\n"; + $previewhead.='

' . wfMsg( 'previewconflict' ) . + "

\n"; } $parserOptions = ParserOptions::newFromUser( $wgUser ); - $parserOptions->setUseCategoryMagic( false ); $parserOptions->setEditSection( false ); $parserOptions->setEditSectionOnRightClick( false ); + # don't parse user css/js, show message about preview # XXX: stupid php bug won't let us use $wgTitle->isCssJsSubpage() here + if ( $isCssJsSubpage ) { if(preg_match("/\\.css$/", $wgTitle->getText() ) ) { $previewtext = wfMsg('usercsspreview'); @@ -380,14 +408,21 @@ class EditPage { $parserOutput = $wgParser->parse( $previewtext , $wgTitle, $parserOptions ); $wgOut->addHTML( $parserOutput->mText ); } else { + # if user want to see preview when he edit an article + if( $wgUser->getOption('previewonfirst') and ($this->textbox1 == '')) { + $this->textbox1 = $this->mArticle->getContent(true); + } + $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $this->textbox1 ) ."\n\n", - $wgTitle, $parserOptions ); + $wgTitle, $parserOptions ); + $previewHTML = $parserOutput->mText; - if($wgUser->getOption("previewontop")) { + if($wgUser->getOption('previewontop')) { $wgOut->addHTML($previewhead); $wgOut->addHTML($previewHTML); } + $wgOut->addCategoryLinks($parserOutput->getCategoryLinks()); $wgOut->addLanguageLinks($parserOutput->getLanguageLinks()); $wgOut->addHTML( "
\n" ); } @@ -396,17 +431,37 @@ class EditPage { # if this is a comment, show a subject line at the top, which is also the edit summary. # Otherwise, show a summary field at the bottom $summarytext = htmlspecialchars( $wgLang->recodeForEdit( $this->summary ) ); # FIXME - if( $this->section == "new" ) { - $commentsubject="{$subject}:
"; - $editsummary = ""; - } else { - $commentsubject = ""; - $editsummary="{$summary}:
"; - } + if( $this->section == 'new' ) { + $commentsubject="{$subject}:
"; + $editsummary = ''; + } else { + $commentsubject = ''; + $editsummary="{$summary}:
"; + } if( !$this->preview ) { - # Don't select the edit box on preview; this interferes with seeing what's going on. - $wgOut->setOnloadHandler( "document.editform.wpTextbox1.focus()" ); + # Don't select the edit box on preview; this interferes with seeing what's going on. + $wgOut->setOnloadHandler( 'document.editform.wpTextbox1.focus()' ); + } + # Prepare a list of templates used by this page + $db =& wfGetDB( DB_SLAVE ); + $cur = $db->tableName( 'cur' ); + $links = $db->tableName( 'links' ); + $id = $this->mTitle->getArticleID(); + $sql = "SELECT cur_namespace,cur_title,cur_id ". + "FROM $cur,$links WHERE l_to=cur_id AND l_from={$id} and cur_namespace=".NS_TEMPLATE; + $res = $db->query( $sql, "EditPage::editform" ); + + if ( $db->numRows( $res ) ) { + $templates = '
'. wfMsg( 'templatesused' ) . '
    '; + while ( $row = $db->fetchObject( $res ) ) { + if ( $titleObj = Title::makeTitle( $row->cur_namespace, $row->cur_title ) ) { + $templates .= '
  • ' . $sk->makeLinkObj( $titleObj ) . '
  • '; + } + } + $templates .= '
'; + } else { + $templates = ''; } $wgOut->addHTML( " {$toolbar} @@ -420,22 +475,24 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
{$editsummary} {$checkboxhtml} - - -{$cancel} | {$edithelp} -

{$copywarn} +{$cancel} | {$edithelp}{$templates}" ); + $wgOut->addWikiText( $copywarn ); + $wgOut->addHTML( " section ) . "\" name=\"wpSection\" /> edittime}\" name=\"wpEdittime\" />\n" ); if ( $isConflict ) { + require_once( "DifferenceEngine.php" ); $wgOut->addHTML( "

" . wfMsg( "yourdiff" ) . "

\n" ); DifferenceEngine::showDiff( $this->textbox2, $this->textbox1, wfMsg( "yourtext" ), wfMsg( "storedversion" ) ); $wgOut->addHTML( "

" . wfMsg( "yourtext" ) . "

-" ); @@ -445,59 +502,70 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) . $wgOut->addHTML($previewhead); $wgOut->addHTML($previewHTML); } - } - function blockedIPpage() - { + /** + * @todo document + */ + function blockedIPpage() { global $wgOut, $wgUser, $wgLang, $wgIP; - $wgOut->setPageTitle( wfMsg( "blockedtitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + $wgOut->setPageTitle( wfMsg( 'blockedtitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); $id = $wgUser->blockedBy(); $reason = $wgUser->blockedFor(); - $ip = $wgIP; + $ip = $wgIP; - $name = User::whoIs( $id ); - $link = "[[" . $wgLang->getNsText( Namespace::getUser() ) . + if ( is_numeric( $id ) ) { + $name = User::whoIs( $id ); + } else { + $name = $id; + } + $link = '[[' . $wgLang->getNsText( Namespace::getUser() ) . ":{$name}|{$name}]]"; - $wgOut->addWikiText( wfMsg( "blockedtext", $link, $reason, $ip, $name ) ); + $wgOut->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name ) ); $wgOut->returnToMain( false ); } - - - function userNotLoggedInPage() - { + /** + * @todo document + */ + function userNotLoggedInPage() { global $wgOut, $wgUser, $wgLang; - $wgOut->setPageTitle( wfMsg( "whitelistedittitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + $wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - $wgOut->addWikiText( wfMsg( "whitelistedittext" ) ); + $wgOut->addWikiText( wfMsg( 'whitelistedittext' ) ); $wgOut->returnToMain( false ); } - function spamPage() + /** + * @todo document + */ + function spamPage ( $matches = array() ) { - global $wgOut, $wgSpamRegex; - $wgOut->setPageTitle( wfMsg( "spamprotectiontitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + global $wgOut; + $wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - $wgOut->addWikiText( wfMsg( "spamprotectiontext" ) ); - $wgOut->addWikiText( "
".$wgSpamRegex."
" ); + $wgOut->addWikiText( wfMsg( 'spamprotectiontext' ) ); + if ( isset ( $matches[0] ) ) { + $wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "{$matches[0]}" ) ); + } $wgOut->returnToMain( false ); } - # Forks processes to scan the originating IP for an open proxy server - # MemCached can be used to skip IPs that have already been scanned - function proxyCheck() - { + /** + * Forks processes to scan the originating IP for an open proxy server + * MemCached can be used to skip IPs that have already been scanned + */ + function proxyCheck() { global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath; global $wgIP, $wgUseMemCached, $wgMemc, $wgDBname, $wgProxyMemcExpiry; @@ -508,7 +576,7 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) . # Get MemCached key $skip = false; if ( $wgUseMemCached ) { - $mcKey = "$wgDBname:proxy:ip:$wgIP"; + $mcKey = $wgDBname.':proxy:ip:'.$wgIP; $mcValue = $wgMemc->get( $mcKey ); if ( $mcValue ) { $skip = true; @@ -517,12 +585,12 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) . # Fork the processes if ( !$skip ) { - $title = Title::makeTitle( NS_SPECIAL, "Blockme" ); + $title = Title::makeTitle( NS_SPECIAL, 'Blockme' ); $iphash = md5( $wgIP . $wgProxyKey ); - $url = $title->getFullURL( "ip=$iphash" ); + $url = $title->getFullURL( 'ip='.$iphash ); foreach ( $wgProxyPorts as $port ) { - $params = implode( " ", array( + $params = implode( ' ', array( escapeshellarg( $wgProxyScriptPath ), escapeshellarg( $wgIP ), escapeshellarg( $port ), @@ -537,18 +605,25 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) . } } - /* private */ function mergeChangesInto( &$text ){ + /** + * @access private + * @todo document + */ + function mergeChangesInto( &$text ){ + $fname = 'EditPage::mergeChangesInto'; $oldDate = $this->edittime; - $res = wfQuery("SELECT cur_text FROM cur WHERE cur_id=" . - $this->mTitle->getArticleID() . " FOR UPDATE", DB_WRITE); - $obj = wfFetchObject($res); + $dbw =& wfGetDB( DB_MASTER ); + $obj = $dbw->getArray( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mTitle->getArticleID() ), + $fname, 'FOR UPDATE' ); $yourtext = $obj->cur_text; $ns = $this->mTitle->getNamespace(); - $title = wfStrencode( $this->mTitle->getDBkey() ); - $res = wfQuery("SELECT old_text,old_flags FROM old WHERE old_namespace = $ns AND ". - "old_title = '{$title}' AND old_timestamp = '{$oldDate}'", DB_WRITE); - $obj = wfFetchObject($res); + $title = $this->mTitle->getDBkey(); + $obj = $dbw->getArray( 'old', + array( 'old_text','old_flags'), + array( 'old_namespace' => $ns, 'old_title' => $title, + 'old_timestamp' => $dbw->timestamp($oldDate)), + $fname ); $oldText = Article::getRevisionText( $obj ); if(wfMerge($oldText, $text, $yourtext, $result)){