* (bug 1970) Don't show move tab for immobile pages
[lhc/web/wiklou.git] / includes / Revision.php
index fc9e8d3..67eb4be 100644 (file)
@@ -165,11 +165,13 @@ class Revision {
                               'page_latest',
                               'rev_id',
                               'rev_page',
+                              'rev_text_id',
                               'rev_comment',
                               'rev_user_text',
                               'rev_user',
                               'rev_minor_edit',
-                              'rev_timestamp' ),
+                              'rev_timestamp',
+                              'rev_deleted' ),
                        $conditions,
                        'Revision::fetchRow' );
                return $db->resultObject( $res );
@@ -183,11 +185,13 @@ class Revision {
                if( is_object( $row ) ) {
                        $this->mId        = IntVal( $row->rev_id );
                        $this->mPage      = IntVal( $row->rev_page );
+                       $this->mTextId    = IntVal( $row->rev_text_id );
                        $this->mComment   =         $row->rev_comment;
                        $this->mUserText  =         $row->rev_user_text;
                        $this->mUser      = IntVal( $row->rev_user );
                        $this->mMinorEdit = IntVal( $row->rev_minor_edit );
                        $this->mTimestamp =         $row->rev_timestamp;
+                       $this->mDeleted   = IntVal( $row->rev_deleted );
                
                        $this->mCurrent   = ( $row->rev_id == $row->page_latest );
                        $this->mTitle     = Title::makeTitle( $row->page_namespace,
@@ -204,11 +208,13 @@ class Revision {
                        
                        $this->mId        = isset( $row['id']         ) ? IntVal( $row['id']         ) : null;
                        $this->mPage      = isset( $row['page']       ) ? IntVal( $row['page']       ) : null;
+                       $this->mTextId    = isset( $row['text_id']    ) ? IntVal( $row['text_id']    ) : null;
                        $this->mComment   = isset( $row['comment']    ) ? StrVal( $row['comment']    ) : null;
                        $this->mUserText  = isset( $row['user_text']  ) ? StrVal( $row['user_text']  ) : $wgUser->getName();
                        $this->mUser      = isset( $row['user']       ) ? IntVal( $row['user']       ) : $wgUser->getId();
                        $this->mMinorEdit = isset( $row['minor_edit'] ) ? IntVal( $row['minor_edit'] ) : 0;
                        $this->mTimestamp = isset( $row['timestamp']  ) ? StrVal( $row['timestamp']  ) : wfTimestamp( TS_MW );
+                       $this->mDeleted   = isset( $row['deleted']    ) ? IntVal( $row['deleted']    ) : 0;
                        $this->mText      = isset( $row['text']       ) ? StrVal( $row['text']       ) : null;
                        
                        $this->mTitle     = null; # Load on demand if needed
@@ -229,6 +235,13 @@ class Revision {
                return $this->mId;
        }
        
+       /**
+        * @return int
+        */
+       function getTextId() {
+               return $this->mTextId;
+       }
+       
        /**
         * Returns the title of the page associated with this entry.
         * @return Title
@@ -286,6 +299,13 @@ class Revision {
                return (bool)$this->mMinorEdit;
        }
        
+       /**
+        * @return bool
+        */
+       function isDeleted() {
+               return (bool)$this->mDeleted;
+       }
+       
        /**
         * @return string
         */
@@ -358,6 +378,18 @@ class Revision {
                        return false;
                }
 
+               # Use external methods for external objects, text in table is URL-only then
+               if ( in_array( 'external', $flags ) ) {
+                       $url=$text;
+                       @list($proto,$path)=explode('://',$url,2);
+                       if ($path=="") {
+                               wfProfileOut( $fname );
+                               return false;
+                       }
+                       require_once('ExternalStore.php');
+                       $text=ExternalStore::fetchFromURL($url);
+               }
+
                if( in_array( 'gzip', $flags ) ) {
                        # Deal with optional compression of archived pages.
                        # This can be done periodically via maintenance/compressOld.php, and
@@ -400,13 +432,13 @@ class Revision {
         * @return string
         */
        function compressRevisionText( &$text ) {
-               global $wgCompressRevisions, $wgUseLatin1;
+               global $wgCompressRevisions;
                $flags = array();
-               if( !$wgUseLatin1 ) {
-                       # Revisions not marked this way will be converted
-                       # on load if $wgLegacyCharset is set in the future.
-                       $flags[] = 'utf-8';
-               }
+               
+               # Revisions not marked this way will be converted
+               # on load if $wgLegacyCharset is set in the future.
+               $flags[] = 'utf-8';
+               
                if( $wgCompressRevisions ) {
                        if( function_exists( 'gzdeflate' ) ) {
                                $text = gzdeflate( $text );
@@ -433,35 +465,40 @@ class Revision {
                $flags = Revision::compressRevisionText( $mungedText );
                
                # Record the text to the text table
-               $old_id = isset( $this->mId )
-                       ? $this->mId
-                       : $dbw->nextSequenceValue( 'text_old_id_val' );
-               $dbw->insert( 'text',
-                       array(
-                               'old_id'    => $old_id,
-                               'old_text'  => $mungedText,
-                               'old_flags' => $flags,
-                       ), $fname
-               );
-               $revisionId = $dbw->insertId();
+               if( !isset( $this->mTextId ) ) {
+                       $old_id = $dbw->nextSequenceValue( 'text_old_id_val' );
+                       $dbw->insert( 'text',
+                               array(
+                                       'old_id'    => $old_id,
+                                       'old_text'  => $mungedText,
+                                       'old_flags' => $flags,
+                               ), $fname
+                       );
+                       $this->mTextId = $dbw->insertId();
+               }
                
                # Record the edit in revisions
+               $rev_id = isset( $this->mId )
+                       ? $this->mId
+                       : $dbw->nextSequenceValue( 'rev_rev_id_val' );
                $dbw->insert( 'revision',
                        array(
-                               'rev_id'         => $revisionId,
+                               'rev_id'         => $rev_id,
                                'rev_page'       => $this->mPage,
+                               'rev_text_id'    => $this->mTextId,
                                'rev_comment'    => $this->mComment,
                                'rev_minor_edit' => $this->mMinorEdit ? 1 : 0,
                                'rev_user'       => $this->mUser,
                                'rev_user_text'  => $this->mUserText,
                                'rev_timestamp'  => $dbw->timestamp( $this->mTimestamp ),
+                               'rev_deleted'    => $this->mDeleted,
                        ), $fname
                );
                
-               $this->mId = $revisionId;
+               $this->mId = $dbw->insertId();
                
                wfProfileOut( $fname );
-               return $revisionId;
+               return $this->mId;
        }
        
        /**
@@ -478,7 +515,7 @@ class Revision {
                $dbr =& wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow( 'text',
                        array( 'old_text', 'old_flags' ),
-                       array( 'old_id' => $this->getId() ),
+                       array( 'old_id' => $this->getTextId() ),
                        $fname);
                
                $text = Revision::getRevisionText( $row );
@@ -486,5 +523,48 @@ class Revision {
                
                return $text;
        }
+
+       /**
+        * Create a new null-revision for insertion into a page's
+        * history. This will not re-save the text, but simply refer
+        * to the text from the previous version.
+        *
+        * Such revisions can for instance identify page rename
+        * operations and other such meta-modifications.
+        *
+        * @param Database $dbw
+        * @param int      $pageId ID number of the page to read from
+        * @param string   $summary
+        * @param bool     $minor
+        * @return Revision
+        */
+       function &newNullRevision( &$dbw, $pageId, $summary, $minor ) {
+               $fname = 'Revision::newNullRevision';
+               wfProfileIn( $fname );
+               
+               $current = $dbw->selectRow(
+                       array( 'page', 'revision' ),
+                       array( 'page_latest', 'rev_text_id' ),
+                       array(
+                               'page_id' => $pageId,
+                               'page_latest=rev_id',
+                               ),
+                       $fname );
+               
+               if( $current ) {
+                       $revision = new Revision( array(
+                               'page'       => $pageId,
+                               'comment'    => $summary,
+                               'minor_edit' => $minor,
+                               'text_id'    => $current->rev_text_id,
+                               ) );
+               } else {
+                       $revision = null;
+               }
+               
+               wfProfileOut( $fname );
+               return $revision;
+       }
+       
 }
-?>
\ No newline at end of file
+?>