Index: trunk/extensions/OAI/OAIRepo_body.php |
— | — | @@ -35,44 +35,6 @@ |
36 | 36 | # FIXME: Replace the DB error handler |
37 | 37 | header( 'Content-type: text/xml; charset=utf-8' ); |
38 | 38 | |
39 | | - require_once( 'includes/SpecialExport.php' ); |
40 | | - |
41 | | - if( !function_exists( 'revision2xml' ) ) { |
42 | | - // Quick hack for 1.5 compatibility. |
43 | | - // We'll improve this later to use the new |
44 | | - // native interface... |
45 | | - function revision2xml( $s, $full, $cur ) { |
46 | | - $fname = 'revision2xml'; |
47 | | - wfProfileIn( $fname ); |
48 | | - |
49 | | - $ts = wfTimestamp2ISO8601( $s->timestamp ); |
50 | | - $xml = " <revision>\n"; |
51 | | - if($full && !$cur) |
52 | | - $xml .= " <id>$s->id</id>\n"; |
53 | | - $xml .= " <timestamp>$ts</timestamp>\n"; |
54 | | - if($s->user) { |
55 | | - $u = "<username>" . xmlsafe( $s->user_text ) . "</username>"; |
56 | | - if($full) |
57 | | - $u .= "<id>$s->user</id>"; |
58 | | - } else { |
59 | | - $u = "<ip>" . xmlsafe( $s->user_text ) . "</ip>"; |
60 | | - } |
61 | | - $xml .= " <contributor>$u</contributor>\n"; |
62 | | - if( $s->minor_edit ) { |
63 | | - $xml .= " <minor/>\n"; |
64 | | - } |
65 | | - if($s->comment != "") { |
66 | | - $c = xmlsafe( $s->comment ); |
67 | | - $xml .= " <comment>$c</comment>\n"; |
68 | | - } |
69 | | - $t = xmlsafe( Revision::getRevisionText( $s, "" ) ); |
70 | | - $xml .= " <text>$t</text>\n"; |
71 | | - $xml .= " </revision>\n"; |
72 | | - wfProfileOut( $fname ); |
73 | | - return $xml; |
74 | | - } |
75 | | - } |
76 | | - |
77 | 39 | $repo = new OAIRepo( $wgRequest ); |
78 | 40 | $repo->respond(); |
79 | 41 | } |
— | — | @@ -600,25 +562,27 @@ |
601 | 563 | function fetchRecord( $pageid ) { |
602 | 564 | extract( $this->_db->tableNames( 'updates', 'cur', 'page', 'revision', 'text' ) ); |
603 | 565 | if( $this->newSchema() ) { |
604 | | - $sql = "SELECT up_page,up_timestamp,up_action,up_sequence, |
605 | | - page_namespace AS namespace, |
606 | | - page_title AS title, |
607 | | - old_text AS text, |
608 | | - old_flags AS flags, |
609 | | - rev_comment AS comment, |
610 | | - rev_user AS user, |
611 | | - rev_user_text AS user_text, |
612 | | - rev_timestamp AS timestamp, |
613 | | - page_restrictions AS restrictions, |
614 | | - rev_minor_edit AS minor_edit |
| 566 | + $sql = "SELECT page_id,up_timestamp,up_action,up_sequence, |
| 567 | + page_namespace, |
| 568 | + page_title, |
| 569 | + old_text, |
| 570 | + old_flags, |
| 571 | + rev_id, |
| 572 | + rev_delete, |
| 573 | + rev_comment, |
| 574 | + rev_user, |
| 575 | + rev_user_text, |
| 576 | + rev_timestamp, |
| 577 | + page_restrictions, |
| 578 | + rev_minor_edit |
615 | 579 | FROM $updates,$page,$revision,$text |
616 | 580 | WHERE up_page=" . IntVal( $pageid ) . ' |
617 | 581 | AND page_id=up_page |
618 | 582 | AND page_latest=rev_id |
619 | 583 | AND rev_text_id=old_id |
620 | 584 | LIMIT 1'; |
621 | | - } else { |
622 | | - $sql = "SELECT up_page,up_timestamp,up_action,up_sequence, |
| 585 | + } else { // FIXME: this will work only with dublin core? |
| 586 | + $sql = "SELECT page_id,up_timestamp,up_action,up_sequence, |
623 | 587 | cur_namespace AS namespace, |
624 | 588 | cur_title AS title, |
625 | 589 | cur_text AS text, |
— | — | @@ -642,23 +606,25 @@ |
643 | 607 | $chunk = IntVal( $chunk ); |
644 | 608 | |
645 | 609 | if( $this->newSchema() ) { |
646 | | - $sql = "SELECT up_page,up_timestamp,up_action,up_sequence, |
647 | | - page_namespace AS namespace, |
648 | | - page_title AS title, |
649 | | - old_text AS text, |
650 | | - old_flags AS flags, |
651 | | - rev_comment AS comment, |
652 | | - rev_user AS user, |
653 | | - rev_user_text AS user_text, |
654 | | - rev_timestamp AS timestamp, |
655 | | - page_restrictions AS restrictions, |
656 | | - rev_minor_edit AS minor_edit |
| 610 | + $sql = "SELECT page_id,up_timestamp,up_action,up_sequence, |
| 611 | + page_namespace, |
| 612 | + page_title, |
| 613 | + old_text, |
| 614 | + old_flags, |
| 615 | + rev_id, |
| 616 | + rev_deleted, |
| 617 | + rev_comment, |
| 618 | + rev_user, |
| 619 | + rev_user_text, |
| 620 | + rev_timestamp, |
| 621 | + page_restrictions, |
| 622 | + rev_minor_edit |
657 | 623 | FROM $updates |
658 | 624 | LEFT JOIN $page ON page_id=up_page |
659 | 625 | LEFT JOIN $revision ON page_latest=rev_id |
660 | 626 | LEFT JOIN $text ON rev_text_id=old_id "; |
661 | | - } else { |
662 | | - $sql = "SELECT up_page,up_timestamp,up_action,up_sequence, |
| 627 | + } else { // FIXME: this will only work with dublin core? |
| 628 | + $sql = "SELECT page_id,up_timestamp,up_action,up_sequence, |
663 | 629 | cur_namespace AS namespace, |
664 | 630 | cur_title AS title, |
665 | 631 | cur_text AS text, |
— | — | @@ -795,9 +761,9 @@ |
796 | 762 | * @param object $row database row |
797 | 763 | */ |
798 | 764 | function WikiOAIRecord( $row ) { |
799 | | - $this->_id = $row->up_page; |
| 765 | + $this->_id = $row->page_id; |
800 | 766 | $this->_timestamp = $row->up_timestamp; |
801 | | - $this->_deleted = is_null( $row->title ); |
| 767 | + $this->_deleted = is_null( $row->page_title ); |
802 | 768 | $this->_row = $row; |
803 | 769 | } |
804 | 770 | |
— | — | @@ -828,8 +794,9 @@ |
829 | 795 | return "<metadata>\n$data</metadata>\n"; |
830 | 796 | } |
831 | 797 | |
| 798 | + /** FIXME: seems to be completely broken (at least on MW 1.5+) */ |
832 | 799 | function renderDublinCore() { |
833 | | - $title = Title::makeTitle( $this->_row->namespace, $this->_row->title ); |
| 800 | + $title = Title::makeTitle( $this->_row->page_namespace, $this->_row->page_title ); |
834 | 801 | global $wgMimeType, $wgContLanguageCode; |
835 | 802 | |
836 | 803 | $out = oaiTag( 'oai_dc:dc', array( |
— | — | @@ -851,72 +818,34 @@ |
852 | 819 | } |
853 | 820 | |
854 | 821 | function renderMediaWiki() { |
855 | | - global $wgContLanguageCode; |
856 | | - $title = Title::makeTitle( $this->_row->namespace, $this->_row->title ); |
857 | | - $out = oaiTag( 'mediawiki', array( |
858 | | - 'xmlns' => 'http://www.mediawiki.org/xml/export-0.2/', |
859 | | - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', |
860 | | - 'xsi:schemaLocation' => 'http://www.mediawiki.org/xml/export-0.2/ ' . |
861 | | - 'http://www.mediawiki.org/xml/export-0.2.xsd', |
862 | | - 'version' => '0.2', |
863 | | - 'xml:lang' => $wgContLanguageCode ) ) . "\n"; |
864 | | - $out .= "<page>\n"; |
865 | | - $out .= oaiTag( 'title', array(), $title->getPrefixedText() ) . "\n"; |
866 | | - $out .= oaiTag( 'id', array(), $this->_id ) . "\n"; |
867 | | - if( $this->_row->restrictions ) { |
868 | | - $out .= oaiTag( 'restrictions', array(), $this->_row->restrictions ) . "\n"; |
869 | | - } |
870 | | - $out .= revision2xml( $this->_row, true, true ); |
871 | | - if( $title->getNamespace() == NS_IMAGE ) { |
872 | | - $out .= $this->renderUpload(); |
873 | | - } |
874 | | - $out .= "</page>\n"; |
875 | | - $out .= "</mediawiki>\n"; |
876 | | - return $out; |
| 822 | + $writer = new OAIDumpWriter(); |
| 823 | + |
| 824 | + return $writer->openStream().$writer->openPage($this->_row). |
| 825 | + $writer->writeRevision($this->_row).$writer->closePage().$writer->closeStream(); |
| 826 | + } |
| 827 | +} |
| 828 | + |
| 829 | +/** For the very first page output siteinfo, else same sa XmlDumpWriter */ |
| 830 | +class OAIDumpWriter extends XmlDumpWriter { |
| 831 | + static $isFirst = true; |
| 832 | + |
| 833 | + function siteInfo() { |
| 834 | + if(OAIDumpWriter::$isFirst){ |
| 835 | + $info = array( |
| 836 | + $this->sitename(), |
| 837 | + $this->homelink(), |
| 838 | + $this->generator(), |
| 839 | + $this->caseSetting(), |
| 840 | + $this->namespaces() ); |
| 841 | + OAIDumpWriter::$isFirst = false; |
| 842 | + |
| 843 | + return " <siteinfo>\n " . |
| 844 | + implode( "\n ", $info ) . |
| 845 | + "\n </siteinfo>\n"; |
| 846 | + } else |
| 847 | + return ""; |
877 | 848 | } |
878 | | - |
879 | | - function renderUpload() { |
880 | | - $fname = 'WikiOAIRecord::renderUpload'; |
881 | | - $db =& wfGetDB( DB_SLAVE ); |
882 | | - $imageRow = $db->selectRow( 'image', |
883 | | - array( 'img_name', 'img_size', 'img_description', |
884 | | - 'img_user', 'img_user_text', 'img_timestamp' ), |
885 | | - array( 'img_name' => $this->_row->title ), |
886 | | - $fname ); |
887 | | - if( $imageRow ) { |
888 | | - if( OAIRepo::newSchema() ) { |
889 | | - $url = Image::imageUrl( $imageRow->img_name ); |
890 | | - } else { |
891 | | - $url = Image::wfImageUrl( $imageRow->img_name ); |
892 | | - } |
893 | | - if( $url{0} == '/' ) { |
894 | | - global $wgServer; |
895 | | - $url = $wgServer . $url; |
896 | | - } |
897 | | - return implode( "\n", array( |
898 | | - "<upload>", |
899 | | - oaiTag( 'timestamp', array(), wfTimestamp2ISO8601( $imageRow->img_timestamp ) ), |
900 | | - $this->renderContributor( $imageRow->img_user, $imageRow->img_user_text ), |
901 | | - oaiTag( 'comment', array(), $imageRow->img_description ), |
902 | | - oaiTag( 'filename', array(), $imageRow->img_name ), |
903 | | - oaiTag( 'src', array(), $url ), |
904 | | - oaiTag( 'size', array(), $imageRow->img_size ), |
905 | | - "</upload>\n" ) ); |
906 | | - } else { |
907 | | - return ''; |
908 | | - } |
909 | | - } |
910 | | - |
911 | | - function renderContributor( $id, $text ) { |
912 | | - if( $id ) { |
913 | | - $tag = oaiTag( 'username', array(), $text ) . |
914 | | - oaiTag( 'id', array(), $id ); |
915 | | - } else { |
916 | | - $tag = oaiTag( 'ip', array(), $text ); |
917 | | - } |
918 | | - return '<contributor>' . $tag . '</contributor>'; |
919 | | - } |
920 | | - |
| 849 | + |
921 | 850 | } |
922 | 851 | |
923 | 852 | ?> |