Special:Export can now return a list of contributors per article, without having to
authorMagnus Manske <magnusmanske@users.mediawiki.org>
Wed, 22 Mar 2006 13:17:44 +0000 (13:17 +0000)
committerMagnus Manske <magnusmanske@users.mediawiki.org>
Wed, 22 Mar 2006 13:17:44 +0000 (13:17 +0000)
 dump the entire history. It will not alter or slow exports unless specifically requested.
Note that export-0.3.xsd was slightly expanded for this; maybe we should move to 0.4?

docs/export-0.3.xsd
includes/Export.php
includes/SpecialExport.php

index 1e0b7c8..aa021fa 100644 (file)
                                <element name="revision" type="mw:RevisionType" />
                                <element name="upload" type="mw:UploadType" />
                        </choice>
+                       
+                       <choice minOccurs="0" maxOccurs="1">
+                               <element name="contributors" type="mw:ContributorsType"/>
+                       </choice>
                </sequence>
        </complexType>
        
                        <element name="text" type="mw:TextType" />
                </sequence>
        </complexType>
+
+       <!-- Contributors. Note the plural. For list of contributors when not dumping full article history. -->
+       <complexType name="ContributorsType">
+               <sequence>
+                       <choice minOccurs="0" maxOccurs="unbounded">
+                               <element name="contributor" type="mw:ContributorType"/>
+                       </choice>
+               </sequence>
+       </complexType>
        
        <complexType name="TextType">
                <simpleContent>
index dee2e04..1e2ad7f 100644 (file)
@@ -40,6 +40,10 @@ define( 'MW_EXPORT_STUB',     1 );
  * @subpackage SpecialPage
  */
 class WikiExporter {
+       
+       var $list_authors = false ; # Return distinct author list (when not returning full history)
+       var $author_list = "" ;
+       
        /**
         * If using MW_EXPORT_STREAM to stream a large amount of data,
         * provide a database connection which is not managed by
@@ -133,6 +137,30 @@ class WikiExporter {
 
        // -------------------- private implementation below --------------------
 
+       # Generates the distinct list of authors of an article
+       # Not called by default (depends on $this->list_authors)
+       # Can be set by Special:Export when not exporting whole history
+       function do_list_authors ( $page , $revision , $cond ) {
+               $fname = "do_list_authors" ;
+               wfProfileIn( $fname );
+               $this->author_list = "<contributors>";
+               $sql = "SELECT DISTINCT rev_user_text,rev_user FROM {$page},{$revision} WHERE page_id=rev_page AND " . $cond ;
+               $result = $this->db->query( $sql, $fname );
+               $resultset = $this->db->resultObject( $result );
+               while( $row = $resultset->fetchObject() ) {
+                       $this->author_list .= "<contributor>" . 
+                               "<username>" . 
+                               htmlentities( $row->rev_user_text )  . 
+                               "</username>" . 
+                               "<id>" . 
+                               $row->rev_user .
+                               "</id>" . 
+                               "</contributor>";
+               }
+               wfProfileOut( $fname );
+               $this->author_list .= "</contributors>";
+       }
+
        function dumpFrom( $cond = '' ) {
                $fname = 'WikiExporter::dumpFrom';
                wfProfileIn( $fname );
@@ -140,10 +168,13 @@ class WikiExporter {
                $page     = $this->db->tableName( 'page' );
                $revision = $this->db->tableName( 'revision' );
                $text     = $this->db->tableName( 'text' );
-
+               
                if( $this->history == MW_EXPORT_FULL ) {
                        $join = 'page_id=rev_page';
                } elseif( $this->history == MW_EXPORT_CURRENT ) {
+                       if ( $this->list_authors && $cond != '' )  { // List authors, if so desired
+                               $this->do_list_authors ( $page , $revision , $cond );
+                       }
                        $join = 'page_id=rev_page AND page_latest=rev_id';
                } else {
                        wfProfileOut( $fname );
@@ -179,6 +210,10 @@ class WikiExporter {
                $result = $this->db->query( $sql, $fname );
                $wrapper = $this->db->resultObject( $result );
                $this->outputStream( $wrapper );
+               
+               if ( $this->list_authors ) {
+                       $this->outputStream( $wrapper );
+               }
 
                if( $this->buffer == MW_EXPORT_STREAM ) {
                        $this->db->bufferResults( $prev );
@@ -218,7 +253,7 @@ class WikiExporter {
                        $this->sink->writeRevision( $row, $output );
                }
                if( isset( $last ) ) {
-                       $output = $this->writer->closePage();
+                       $output = $this->author_list . $this->writer->closePage();
                        $this->sink->writeClosePage( $output );
                }
                $resultset->free();
index fe9a1e3..acbb836 100644 (file)
@@ -44,6 +44,9 @@ function wfSpecialExport( $page = '' ) {
                # Pre-check the 'current version only' box in the UI
                $curonly = true;
        }
+       
+       $list_authors = $wgRequest->getCheck( 'listauthors' );
+       if ( !$curonly ) $list_authors = false ;
 
        if( $page != '' ) {
                $wgOut->disable();
@@ -53,6 +56,7 @@ function wfSpecialExport( $page = '' ) {
                $db =& wfGetDB( DB_SLAVE );
                $history = $curonly ? MW_EXPORT_CURRENT : MW_EXPORT_FULL;
                $exporter = new WikiExporter( $db, $history );
+               $exporter->list_authors = $list_authors ;
                $exporter->openStream();
                $exporter->pagesByName( $pages );
                $exporter->closeStream();