New hook getOtherBlockLogLink, called in Special:IPBlockList to show links to block...
[lhc/web/wiklou.git] / includes / Export.php
index 4d4f39b..61847ac 100644 (file)
@@ -55,6 +55,7 @@ class WikiExporter {
         *                   limit: maximum number of rows to return
         *                   dir: "asc" or "desc" timestamp order
         * @param $buffer Int: one of WikiExporter::BUFFER or WikiExporter::STREAM
+        * @param $text Int: one of WikiExporter::TEXT or WikiExporter::STUB
         */
        function __construct( &$db, $history = WikiExporter::CURRENT,
                        $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
@@ -207,27 +208,8 @@ class WikiExporter {
                        $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." );
-                               }
-                       # Time offset/limit for all pages/history...
-                       } elseif( is_array( $this->history ) ) {
+                       if( is_array( $this->history ) ) {
+                               # Time offset/limit for all pages/history...
                                $revJoin = 'page_id=rev_page';
                                # Set time order
                                if( $this->history['dir'] == 'asc' ) {
@@ -247,8 +229,27 @@ class WikiExporter {
                                if( !empty( $this->history['limit'] ) ) {
                                        $opts['LIMIT'] = intval( $this->history['limit'] );
                                }
-                       # Uknown history specification parameter?
+                       } elseif( $this->history & WikiExporter::FULL ) {
+                               # Full history dumps...
+                               $join['revision'] = array('INNER JOIN','page_id=rev_page');
+                       } elseif( $this->history & WikiExporter::CURRENT ) {
+                               # Latest revision dumps...
+                               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');
+                       } elseif( $this->history & WikiExporter::STABLE ) {
+                               # "Stable" revision dumps...
+                               # 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." );
+                               }
                        } else {
+                               # Uknown history specification parameter?
                                wfProfileOut( __METHOD__ );
                                return new WikiError( __METHOD__." given invalid history dump type." );
                        }
@@ -266,6 +267,9 @@ class WikiExporter {
                        if( $this->buffer == WikiExporter::STREAM ) {
                                $prev = $this->db->bufferResults( false );
                        }
+                       
+                       wfRunHooks( 'ModifyExportQuery',
+                                               array( $this->db, &$tables, &$cond, &$opts, &$join ) );
 
                        # Do the query!
                        $result = $this->db->select( $tables, '*', $cond, __METHOD__, $opts, $join );
@@ -345,7 +349,7 @@ class XmlDumpWriter {
         * @return string
         */
        function schemaVersion() {
-               return "0.3"; // FIXME: upgrade to 0.4 when updated XSD is ready, for the revision deletion bits
+               return "0.4";
        }
 
        /**
@@ -410,7 +414,11 @@ class XmlDumpWriter {
                global $wgContLang;
                $spaces = "<namespaces>\n";
                foreach( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
-                       $spaces .= '      ' . Xml::element( 'namespace', array( 'key' => $ns ), $title ) . "\n";
+                       $spaces .= '      ' . 
+                               Xml::element( 'namespace', 
+                                       array(  'key' => $ns,
+                                                       'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+                                       ), $title ) . "\n";
                }
                $spaces .= "    </namespaces>";
                return $spaces;
@@ -438,10 +446,16 @@ class XmlDumpWriter {
                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                $out .= '    ' . Xml::elementClean( 'title', array(), $title->getPrefixedText() ) . "\n";
                $out .= '    ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
+               if( $row->page_is_redirect ) {
+                       $out .= '    ' . Xml::element( 'redirect', array() ) . "\n";
+               }
                if( '' != $row->page_restrictions ) {
                        $out .= '    ' . Xml::element( 'restrictions', array(),
                                strval( $row->page_restrictions ) ) . "\n";
                }
+               
+               wfRunHooks( 'XmlDumpWriterOpenPage', array( $this, &$out, $row, $title ) );
+               
                return $out;
        }
 
@@ -486,6 +500,7 @@ class XmlDumpWriter {
                        $out .= "      " . Xml::elementClean( 'comment', null, strval( $row->rev_comment ) ) . "\n";
                }
 
+               $text = '';
                if( $row->rev_deleted & Revision::DELETED_TEXT ) {
                        $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif( isset( $row->old_text ) ) {
@@ -501,6 +516,8 @@ class XmlDumpWriter {
                                "" ) . "\n";
                }
 
+               wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
+
                $out .= "    </revision>\n";
 
                wfProfileOut( $fname );