From 72e90545454c0e014318fa3c81658e035aac58c1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 10 Jun 2009 13:00:47 +0200 Subject: applying patch to version 1.15.0 --- includes/Export.php | 141 ++++++++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 65 deletions(-) (limited to 'includes/Export.php') diff --git a/includes/Export.php b/includes/Export.php index 5f040b13..909804cf 100644 --- a/includes/Export.php +++ b/includes/Export.php @@ -30,9 +30,10 @@ class WikiExporter { var $dumpUploads = false; - const FULL = 0; - const CURRENT = 1; - const LOGS = 2; + const FULL = 1; + const CURRENT = 2; + const STABLE = 4; // extension defined + const LOGS = 8; const BUFFER = 0; const STREAM = 1; @@ -175,93 +176,103 @@ class WikiExporter { } protected function dumpFrom( $cond = '' ) { - $fname = 'WikiExporter::dumpFrom'; - wfProfileIn( $fname ); - - # For logs dumps... + wfProfileIn( __METHOD__ ); + # For logging dumps... if( $this->history & self::LOGS ) { + if( $this->buffer == WikiExporter::STREAM ) { + $prev = $this->db->bufferResults( false ); + } $where = array( 'user_id = log_user' ); # Hide private logs - $where[] = LogEventsList::getExcludeClause( $this->db ); + $hideLogs = LogEventsList::getExcludeClause( $this->db ); + if( $hideLogs ) $where[] = $hideLogs; + # Add on any caller specified conditions if( $cond ) $where[] = $cond; + # Get logging table name for logging.* clause + $logging = $this->db->tableName('logging'); $result = $this->db->select( array('logging','user'), - '*', + array( "{$logging}.*", 'user_name' ), // grab the user name $where, - $fname, + __METHOD__, array( 'ORDER BY' => 'log_id', 'USE INDEX' => array('logging' => 'PRIMARY') ) ); $wrapper = $this->db->resultObject( $result ); + if( $this->buffer == WikiExporter::STREAM ) { + $this->db->bufferResults( $prev ); + } $this->outputLogStream( $wrapper ); # For page dumps... } else { - list($page,$revision,$text) = $this->db->tableNamesN('page','revision','text'); - - $order = 'ORDER BY page_id'; - $limit = ''; - - if( $this->history == WikiExporter::FULL ) { - $join = 'page_id=rev_page'; - } elseif( $this->history == WikiExporter::CURRENT ) { - if ( $this->list_authors && $cond != '' ) { // List authors, if so desired - $this->do_list_authors ( $page , $revision , $cond ); + $tables = array( 'page', 'revision' ); + $opts = array( 'ORDER BY' => 'page_id ASC' ); + $opts['USE INDEX'] = array(); + $join = array(); + # Full history dumps... + if( $this->history & WikiExporter::FULL ) { + $join['revision'] = array('INNER JOIN','page_id=rev_page'); + # Latest revision dumps... + } elseif( $this->history & WikiExporter::CURRENT ) { + if( $this->list_authors && $cond != '' ) { // List authors, if so desired + list($page,$revision) = $this->db->tableNamesN('page','revision'); + $this->do_list_authors( $page, $revision, $cond ); + } + $join['revision'] = array('INNER JOIN','page_id=rev_page AND page_latest=rev_id'); + # "Stable" revision dumps... + } elseif( $this->history & WikiExporter::STABLE ) { + # Default JOIN, to be overridden... + $join['revision'] = array('INNER JOIN','page_id=rev_page AND page_latest=rev_id'); + # One, and only one hook should set this, and return false + if( wfRunHooks( 'WikiExporter::dumpStableQuery', array(&$tables,&$opts,&$join) ) ) { + wfProfileOut( __METHOD__ ); + return new WikiError( __METHOD__." given invalid history dump type." ); } - $join = 'page_id=rev_page AND page_latest=rev_id'; - } elseif ( is_array( $this->history ) ) { - $join = 'page_id=rev_page'; - if ( $this->history['dir'] == 'asc' ) { + # Time offset/limit for all pages/history... + } elseif( is_array( $this->history ) ) { + $revJoin = 'page_id=rev_page'; + # Set time order + if( $this->history['dir'] == 'asc' ) { $op = '>'; - $order .= ', rev_timestamp'; + $opts['ORDER BY'] = 'rev_timestamp ASC'; } else { $op = '<'; - $order .= ', rev_timestamp DESC'; + $opts['ORDER BY'] = 'rev_timestamp DESC'; } - if ( !empty( $this->history['offset'] ) ) { - $join .= " AND rev_timestamp $op " . $this->db->addQuotes( - $this->db->timestamp( $this->history['offset'] ) ); + # Set offset + if( !empty( $this->history['offset'] ) ) { + $revJoin .= " AND rev_timestamp $op " . + $this->db->addQuotes( $this->db->timestamp( $this->history['offset'] ) ); } - if ( !empty( $this->history['limit'] ) ) { - $limitNum = intval( $this->history['limit'] ); - if ( $limitNum > 0 ) { - $limit = "LIMIT $limitNum"; - } + $join['revision'] = array('INNER JOIN',$revJoin); + # Set query limit + if( !empty( $this->history['limit'] ) ) { + $opts['LIMIT'] = intval( $this->history['limit'] ); } + # Uknown history specification parameter? } else { - wfProfileOut( $fname ); - return new WikiError( "$fname given invalid history dump type." ); + wfProfileOut( __METHOD__ ); + return new WikiError( __METHOD__." given invalid history dump type." ); + } + # Query optimization hacks + if( $cond == '' ) { + $opts[] = 'STRAIGHT_JOIN'; + $opts['USE INDEX']['page'] = 'PRIMARY'; + } + # Build text join options + if( $this->text != WikiExporter::STUB ) { // 1-pass + $tables[] = 'text'; + $join['text'] = array('INNER JOIN','rev_text_id=old_id'); } - $where = ( $cond == '' ) ? '' : "$cond AND"; if( $this->buffer == WikiExporter::STREAM ) { $prev = $this->db->bufferResults( false ); } - if( $cond == '' ) { - // Optimization hack for full-database dump - $revindex = $pageindex = $this->db->useIndexClause("PRIMARY"); - $straight = ' /*! STRAIGHT_JOIN */ '; - } else { - $pageindex = ''; - $revindex = ''; - $straight = ''; - } - if( $this->text == WikiExporter::STUB ) { - $sql = "SELECT $straight * FROM - $page $pageindex, - $revision $revindex - WHERE $where $join - $order $limit"; - } else { - $sql = "SELECT $straight * FROM - $page $pageindex, - $revision $revindex, - $text - WHERE $where $join AND rev_text_id=old_id - $order $limit"; - } - $result = $this->db->query( $sql, $fname ); + + # Do the query! + $result = $this->db->select( $tables, '*', $cond, __METHOD__, $opts, $join ); $wrapper = $this->db->resultObject( $result ); + # Output dump results $this->outputPageStream( $wrapper ); - - if ( $this->list_authors ) { + if( $this->list_authors ) { $this->outputPageStream( $wrapper ); } @@ -269,7 +280,7 @@ class WikiExporter { $this->db->bufferResults( $prev ); } } - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); } /** @@ -399,7 +410,7 @@ class XmlDumpWriter { function namespaces() { global $wgContLang; - $spaces = " \n"; + $spaces = "\n"; foreach( $wgContLang->getFormattedNamespaces() as $ns => $title ) { $spaces .= ' ' . Xml::element( 'namespace', array( 'key' => $ns ), $title ) . "\n"; } -- cgit v1.2.2