* @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
// -------------------- 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 );
$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 );
$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 );
$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();
*
*/
function wfSpecialExport( $page = '' ) {
- global $wgOut, $wgRequest;
+ global $wgOut, $wgRequest, $wgExportAllowListContributors;
global $wgExportAllowHistory;
if( $wgRequest->getVal( 'action' ) == 'submit') {
# Pre-check the 'current version only' box in the UI
$curonly = true;
}
+
+ $list_authors = $wgRequest->getCheck( 'listauthors' );
+ if ( !$curonly || !$wgExportAllowListContributors ) $list_authors = false ;
if( $page != '' ) {
$wgOut->disable();
$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();