Merge "Vector: Update comments in vector.js"
[lhc/web/wiklou.git] / includes / api / ApiQueryUserContributions.php
index b58a951..568ccb5 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryContributions extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'uc' );
        }
 
@@ -108,22 +108,14 @@ class ApiQueryContributions extends ApiQueryBase {
                        if ( ++$count > $limit ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               if ( $this->multiUserMode ) {
-                                       $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
-                               } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
-                               }
+                               $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
                                break;
                        }
 
                        $vals = $this->extractRowInfo( $row );
                        $fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                        if ( !$fit ) {
-                               if ( $this->multiUserMode ) {
-                                       $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
-                               } else {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rev_timestamp ) );
-                               }
+                               $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
                                break;
                        }
                }
@@ -138,7 +130,7 @@ class ApiQueryContributions extends ApiQueryBase {
         * Validate the 'user' parameter and set the value to compare
         * against `revision`.`rev_user_text`
         *
-        * @param $user string
+        * @param string $user
         */
        private function prepareUsername( $user ) {
                if ( !is_null( $user ) && $user !== '' ) {
@@ -167,18 +159,34 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addWhere( 'page_id=rev_page' );
 
                // Handle continue parameter
-               if ( $this->multiUserMode && !is_null( $this->params['continue'] ) ) {
+               if ( !is_null( $this->params['continue'] ) ) {
                        $continue = explode( '|', $this->params['continue'] );
-                       $this->dieContinueUsageIf( count( $continue ) != 2 );
                        $db = $this->getDB();
-                       $encUser = $db->addQuotes( $continue[0] );
-                       $encTS = $db->addQuotes( $db->timestamp( $continue[1] ) );
+                       if ( $this->multiUserMode ) {
+                               $this->dieContinueUsageIf( count( $continue ) != 3 );
+                               $encUser = $db->addQuotes( array_shift( $continue ) );
+                       } else {
+                               $this->dieContinueUsageIf( count( $continue ) != 2 );
+                       }
+                       $encTS = $db->addQuotes( $db->timestamp( $continue[0] ) );
+                       $encId = (int)$continue[1];
+                       $this->dieContinueUsageIf( $encId != $continue[1] );
                        $op = ( $this->params['dir'] == 'older' ? '<' : '>' );
-                       $this->addWhere(
-                               "rev_user_text $op $encUser OR " .
-                               "(rev_user_text = $encUser AND " .
-                               "rev_timestamp $op= $encTS)"
-                       );
+                       if ( $this->multiUserMode ) {
+                               $this->addWhere(
+                                       "rev_user_text $op $encUser OR " .
+                                       "(rev_user_text = $encUser AND " .
+                                       "(rev_timestamp $op $encTS OR " .
+                                       "(rev_timestamp = $encTS AND " .
+                                       "rev_id $op= $encId)))"
+                               );
+                       } else {
+                               $this->addWhere(
+                                       "rev_timestamp $op $encTS OR " .
+                                       "(rev_timestamp = $encTS AND " .
+                                       "rev_id $op= $encId)"
+                               );
+                       }
                }
 
                // Don't include any revisions where we're not supposed to be able to
@@ -209,6 +217,9 @@ class ApiQueryContributions extends ApiQueryBase {
                }
                $this->addTimestampWhereRange( 'rev_timestamp',
                        $this->params['dir'], $this->params['start'], $this->params['end'] );
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'rev_id', $this->params['dir'], null, null );
+
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                $show = $this->params['show'];
@@ -242,6 +253,7 @@ class ApiQueryContributions extends ApiQueryBase {
                // ns+title checks if the user has access rights for this page
                // user_text is necessary if multiple users were specified
                $this->addFields( array(
+                       'rev_id',
                        'rev_timestamp',
                        'page_namespace',
                        'page_title',
@@ -284,7 +296,6 @@ class ApiQueryContributions extends ApiQueryBase {
 
                $this->addTables( $tables );
                $this->addFieldsIf( 'rev_page', $this->fld_ids );
-               $this->addFieldsIf( 'rev_id', $this->fld_ids || $this->fld_flags );
                $this->addFieldsIf( 'page_latest', $this->fld_flags );
                // $this->addFieldsIf( 'rev_text_id', $this->fld_ids ); // Should this field be exposed?
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
@@ -315,7 +326,7 @@ class ApiQueryContributions extends ApiQueryBase {
        /**
         * Extract fields from the database row and append them to a result array
         *
-        * @param $row
+        * @param mixed $row
         * @return array
         */
        private function extractRowInfo( $row ) {
@@ -424,8 +435,11 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        private function continueStr( $row ) {
-               return $row->rev_user_text . '|' .
-                       wfTimestamp( TS_ISO_8601, $row->rev_timestamp );
+               if ( $this->multiUserMode ) {
+                       return "$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+               } else {
+                       return "$row->rev_timestamp|$row->rev_id";
+               }
        }
 
        public function getCacheMode( $params ) {