Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips-library/IRview/oaiclass.php

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download) (as text)
Mon Nov 6 01:29:26 2006 UTC (17 years, 5 months ago) by yamaji
Branch point for: MAIN
File MIME type: application/x-httpd-php
Initial revision

1 yamaji 1.1 <?php
2     // $Revision: 1.8 $ //
3     // ------------------------------------------------------------------------ //
4     // //
5     // OAI-PMH based Institutional Repository Introduction Module //
6     // Copyright (C) 2005 Kazutsuna YAMAJI. All rights reserved. //
7     // //
8     // ------------------------------------------------------------------------ //
9     // This program is free software; you can redistribute it and/or modify //
10     // it under the terms of the GNU General Public License as published by //
11     // the Free Software Foundation; either version 2 of the License, or //
12     // (at your option) any later version. //
13     // //
14     // You may not change or alter any portion of this comment or credits //
15     // of supporting developers from this source code or any supporting //
16     // source code which is considered copyrighted (c) material of the //
17     // original comment or credit authors. //
18     // //
19     // This program is distributed in the hope that it will be useful, //
20     // but WITHOUT ANY WARRANTY; without even the implied warranty of //
21     // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
22     // GNU General Public License for more details. //
23     // //
24     // You should have received a copy of the GNU General Public License //
25     // along with this program; if not, write to the Free Software //
26     // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
27     // ------------------------------------------------------------------------ //
28    
29     class OAIPMHHarvester {
30     var $dateformat;
31     var $earliestDatestamp;
32     var $baseURL;
33     var $metadataPrefix;
34     var $metadataFormats;
35     var $lastError;
36     var $lastStatus;
37     var $repositoryName;
38    
39     //public
40     function OAIPMHHarvester( $_baseURL ) {
41     $this->baseURL = $_baseURL;
42     $this->lastError = null;
43     $this->lastStatus = null;
44     $this->metadataPrefix = null;
45     $this->metadataFormats = array( );
46     $this->dateformat = null;
47     $this->earliestDatestamp = null;
48     $this->repositoryName = null;
49     } function __construct( $_baseURL ) {
50     /* constructer for PHP5 */
51     $this->OAIPMHHarvester( $_baseURL );
52     }
53     function harvest( ) {
54     global $xoopsDB;
55    
56     //update repositories table
57     $tbl_repositories = $xoopsDB->prefix( 'irview_repositories' );
58     $sql = "UPDATE ${tbl_repositories} SET last_access_date=".gmdate( "U", time( ) ).", last_access_result=NULL WHERE URL='".addslashes( $this->baseURL )."'";
59     $result = $xoopsDB->queryF( $sql );
60     if( $result ) {
61     //////////////////
62     // 1st Identify //
63     //////////////////
64     if( $this->Identify( ) ) {
65     // update (or set) repository name
66     $sql = "UPDATE ${tbl_repositories} SET repository_name='".addslashes( $this->repositoryName)."' WHERE URL='".addslashes( $this->baseURL )."'";
67     $result = $xoopsDB->queryF( $sql );
68     /////////////////////////////
69     // 2nd ListMetadataFormats //
70     /////////////////////////////
71     if( $result && $this->ListMetadataFormats( ) ) {
72     $args = array( 'metadataPrefix' => $this->metadataPrefix );
73     $sql = "SELECT last_success_date FROM ${tbl_repositories} WHERE URL='".addslashes( $this->baseURL )."'";
74     $result = $xoopsDB->query( $sql );
75     if( $result && $xoopsDB->getRowsNum( $result ) > 0 ) {
76     list( $from_timestamp ) = $xoopsDB->fetchRow( $result );
77     if( $from_timestamp == NULL && !is_null( $this->earliestDatestamp ) ){
78     $from_timestamp = $this->earliestDatestamp;
79     }
80     $args['from'] = gmdate( $this->dateformat, $from_timestamp );
81     //$to_timestamp = ISO8601toUTC( ( string )( gmdate( "Y", $from_timestamp )+1 )."-01-01" );
82     //$args['until']= date( $this->dateformat, $to_timestamp );
83     }
84     $sql = "UPDATE ${tbl_repositories} SET metadata_formats='".addslashes(implode($this->metadataFormats, ', '))."' WHERE URL='".addslashes( $this->baseURL )."'";
85     $result = $xoopsDB->queryF( $sql );
86     /////////////////////
87     // 3rd ListRecords //
88     /////////////////////
89     if( $result && $this->ListRecords( $args ) ) {
90     //update repositories table
91     $tbl_repositories = $xoopsDB->prefix( 'irview_repositories' );
92     //$success_date = min( (int)ISO8601toUTC($args['until']), (int)gmdate( "U", time( ) ) );
93     $success_date = (int)gmdate( "U", time( ) );
94     $sql = "UPDATE ${tbl_repositories} SET last_success_date=".$success_date.", last_access_result='".addslashes( $this->lastStatus )."' WHERE URL='".addslashes( $this->baseURL )."'";
95     $result = $xoopsDB->queryF( $sql );
96     if( $result )
97     return true;
98     else
99     $this->lastError = $xoopsDB->error( );
100     }
101     }
102     }
103     } else
104     $this->lastError = $xoopsDB->error( );
105    
106     //update repositories table(last_access_result)
107     $tbl_repositories = $xoopsDB->prefix( 'irview_repositories' );
108     $sql = "UPDATE ${tbl_repositories} SET last_access_result='".addslashes( $this->lastError )."' WHERE URL='".addslashes( $this->baseURL )."'";
109     $result = $xoopsDB->queryF( $sql );
110     return false;
111     }
112     function last_error( ) {
113     return $this->lastError;
114     }
115    
116     //private
117     function Identify( ) {
118     $data = parse_url($this->baseURL."?verb=Identify");
119     $host = $data["host"];
120     $path = $data["path"];
121     $query= $data["query"];
122     $sock = fsockopen($host, 80, $errno, $errmsg, 100);
123     $request = "GET {$path}?{$query} HTTP/1.0\r\n"
124     . "Accept-Charset: UTF-8\r\n"
125     . "Connetction: Keep-Alive\r\n"
126     . "Host: {$host}\r\n"
127     . "\r\n";
128     fwrite($sock, $request);
129    
130     if( !$sock ) {
131     $this->lastError = "can't retrieve ".$this->baseURL."verb=Identify";
132     return false;
133     }
134     $metadata = "";
135     $this->lastError = $http_status = fgets($sock);
136     do{
137     $data = fgets($sock);
138     $metadata .= $data;
139     }while($data != "\r\n");
140    
141     $this->parser = xml_parser_create( 'UTF-8' );
142     if( !$this->parser ) {
143     fclose( $sock );
144     $this->lastError = "can't create XML parser";
145     return false;
146     }
147     $handler = new IdentifyHandler( $this->parser );
148    
149     $result = $this->parse( $sock );
150     xml_parser_free( $this->parser );
151     fclose( $sock );
152     if( !$result )
153     return false; //some error has occured in parse( $sock );
154    
155     $this->dateformat = $handler->getDateFormat( );
156     if( !$this->dateformat ) {
157     $this->lastError = "value of <granularity> is wrong";
158     return false;
159     }
160    
161     $this->earliestDatestamp = $handler->getEarliestDatestamp( );
162     $this->repositoryName = $handler->getRepositoryName( );
163    
164     return true;
165     }
166    
167     function ListMetadataFormats( ) {
168     $data = parse_url($this->baseURL."?verb=ListMetadataFormats");
169     $host = $data["host"];
170     $path = $data["path"];
171     $query= $data["query"];
172     $sock = fsockopen($host, 80, $errno, $errmsg, 100);
173     $request = "GET {$path}?{$query} HTTP/1.0\r\n"
174     . "Accept-Charset: UTF-8\r\n"
175     . "Connetction: Keep-Alive\r\n"
176     . "Host: {$host}\r\n"
177     . "\r\n";
178     fwrite($sock, $request);
179    
180     if( !$sock ) {
181     $this->lastError = "can't retrieve ".$this->baseURL."verb=ListMetadataFormats";
182     return false;
183     }
184     $metadata = "";
185     $this->lastError = $http_status = fgets($sock);
186     do{
187     $data = fgets($sock);
188     $metadata .= $data;
189     }while($data != "\r\n");
190    
191     $this->parser = xml_parser_create( 'UTF-8' );
192     if( !$this->parser ) {
193     fclose( $sock );
194     $this->lastError = "can't create XML parser";
195     return false;
196     }
197     $handler = new ListMetadataFormatsHandler( $this->parser );
198    
199     $result = $this->parse( $sock );
200     xml_parser_free( $this->parser );
201     fclose( $sock );
202     if( !$result )
203     return false; //some error has occured in parse( $sock );
204    
205     $this->metadataPrefix = $handler->getMetadataPrefix( );
206     $this->metadataFormats = $handler->getMetadataFormats( );
207     if( !$this->metadataPrefix && !$this->metadataFormats) {
208     $this->metadataPrefix = null;
209     $this->lastError = "can't retrieve <metadataPrefix>";
210     return false;
211     }
212     return true;
213     }
214    
215     function ListRecords( $args ) {
216     global $xoopsDB;
217     if( !isset( $args['metadataPrefix'] ) ) {
218     $this->lastError = "'metadataPrefix' is not specified.";
219     return false;
220     }
221     $resumptionToken = null;
222     $resumptionToken_num = 0;
223     do {
224     $url = $this->baseURL."?verb=ListRecords";
225     if( $resumptionToken == null ){
226     foreach( array( 'metadataPrefix', 'from', 'until', 'set' ) as $k ) {
227     if( isset( $args[$k] ) ) {
228     $url .= "&".urlencode( $k )."=".urlencode( $args[$k] );
229     }
230     }
231     } else {
232     $url .= "&resumptionToken=".htmlspecialchars( $resumptionToken );
233     }
234    
235     $data = parse_url($url);
236     $host = $data["host"];
237     $path = $data["path"];
238     $query= $data["query"];
239     $sock = fsockopen( $host, 80, $errno, $errmsg, 100 );
240     $request = "GET {$path}?{$query} HTTP/1.0\r\n"
241     . "Accept-Charset: UTF-8\r\n"
242     . "Connetction: Keep-Alive\r\n"
243     . "Host: {$host}\r\n"
244     . "\r\n";
245     fwrite($sock, $request);
246    
247     if( !$sock ) {
248     $this->lastError = "can't retrieve ${url}";
249     $xoopsDB -> setLogger( XoopsLogger::instance() );
250     return false;
251     }
252     $metadata = "";
253     $this->lastError = $this->lastStatus = fgets($sock);
254     do{
255     $data = fgets($sock);
256     $metadata .= $data;
257     }while($data != "\r\n");
258    
259     $this->parser = xml_parser_create( 'UTF-8' );
260     if( !$this->parser ) {
261     fclose( $sock );
262     $this->lastError = "can't create XML parser";
263     $xoopsDB -> setLogger( XoopsLogger::instance() );
264     return false;
265     }
266    
267     $handler = "${resumptionToken}_handler";
268     $${'handler'} = new ListRecordsHandler( $this->parser, $this->baseURL, $args['metadataPrefix'] );
269    
270     $result = $this->parse( $sock );
271     xml_parser_free( $this->parser );
272     fclose( $sock );
273     if( !$result ) {
274     //some erorr has occured
275     if( $${'handler'}->getIdentifier( ) != null )
276     $this->lastError .= "[identifier]".$${'handler'}->getIdentifier( );
277     $xoopsDB -> setLogger( XoopsLogger::instance() );
278     return false; //some error has occured in parse( $sock );
279     }
280     $resumptionToken = $${'handler'}->getResumptionToken( );
281     $resumptionToken_num ++;
282     } while( $resumptionToken != null );
283     if( $resumptionToken_num-1 < 2 ){
284     echo "resumptionToken\t".($resumptionToken_num-1)." time issued<br>\n";
285     }else{
286     echo "resumptionToken\t".($resumptionToken_num-1)." times issued<br>\n";
287     }
288     $xoopsDB -> setLogger( XoopsLogger::instance() );
289     return true;
290     }
291    
292     function parse( $sock ) {
293     while( !feof( $sock ) ) {
294     $data = fread( $sock, 8192 );
295    
296     if( !xml_parse( $this->parser, $data ) ) {
297     $this->lastError = "[XMLParser]".xml_error_string( xml_get_error_code( $this->parser ) )." at line ".xml_get_current_line_number( $this->parser ).", column ".xml_get_current_column_number( $this->parser );
298    
299     fclose( $sock );
300     xml_parser_free( $this->parser );
301     return false;
302     }
303     }
304     return true;
305     }
306     }
307    
308     class HarvesterHandler {
309     var $parser;
310     var $lastError;
311    
312     function HarvesterHandler( $_parser ) {
313     $this->lastError = null;
314     $this->parser = $_parser;
315     xml_set_object( $this->parser, &$this );
316     xml_set_element_handler( $this->parser, 'startElementHandler', 'endElementHandler' );
317     xml_set_character_data_handler( $this->parser, 'characterDataHandler' );
318     } function __construct( $_parser ) {
319     $this->HarvesterHandler( $_parser );
320     }
321     function startElementHandler( $parser, $name, $attribs ) {
322     }
323     function endElementHandler( $parser, $name ) {
324     }
325     function characterDataHandler( $parser, $data ) {
326     }
327    
328     function last_error( ) {
329     return $this->lastError;
330     }
331     }
332    
333     class IdentifyHandler extends HarvesterHandler {
334     var $dateformat;
335     var $earliestDatestamp;
336     var $tagstack;
337     var $repositoryName;
338     function IdentifyHandler( $_parser ) {
339     parent::HarvesterHandler( $_parser );
340     $this->earliestDatestamp = null;
341     $this->dateformat = null;
342     $this->tagstack = array( );
343     $this->repositoryName = null;
344     } function __construct( $_parser ) {
345     $this->IdentifyHandler( $_parser );
346     }
347    
348     function startElementHandler( $parser, $name, $attribs ) {
349     array_push( $this->tagstack, $name );
350     }
351    
352     function endElementHandler( $parser, $name ) {
353     array_pop( $this->tagstack );
354     }
355    
356     function characterDataHandler( $parser, $data ) {
357     if( end( $this->tagstack ) == 'GRANULARITY' ) {
358     if( $data == "YYYY-MM-DDThh:mm:ssZ" )
359     $this->dateformat = "Y-m-d\TH:i:s\Z";
360     else if( $data == "YYYY-MM-DD" )
361     $this->dateformat = "Y-m-d";
362     else
363     $this->dateformat = false;
364     } else if( end( $this->tagstack ) == 'EARLIESTDATESTAMP' ) {
365     $this->earliestDatestamp = ISO8601toUTC($data);
366     } else if( end( $this->tagstack ) == 'REPOSITORYNAME' ) {
367     // Set repository name to reponame
368     $this->repositoryName = $data;
369     }
370     }
371    
372     function getDateFormat( ) {
373     return $this->dateformat;
374     }
375     function getEarliestDatestamp( ) {
376     return $this->earliestDatestamp;
377     }
378     function getRepositoryName( ) {
379     return $this->repositoryName;
380     }
381     }
382    
383     class ListMetadataFormatsHandler extends HarvesterHandler {
384     var $metadataPrefix;
385     var $tagstack;
386     var $metadataFormats;
387    
388     function ListMetadataFormatsHandler( $_parser ) {
389     parent::HarvesterHandler( $_parser );
390    
391     $this->metadataPrefix = "oai_dc";
392     $this->tagstack = array( );
393     $this->metadataFormats = array( );
394     } function __construct( $_parser ) {
395     $this->ListMetadataFormatsHandler( $_parser );
396     }
397    
398     function startElementHandler( $parser, $name, $attribs ) {
399     array_push( $this->tagstack, $name );
400     }
401    
402     function endElementHandler( $parser, $name ) {
403     array_pop( $this->tagstack );
404     }
405    
406     function characterDataHandler( $parser, $data ) {
407     if( end( $this->tagstack ) == 'METADATAPREFIX' ) {
408     $this->metadataFormats[] = $data;
409     if( $data == "junii" ) {
410     $this->metadataPrefix = $data;
411     }
412     }
413     }
414    
415     function getMetadataPrefix( ) {
416     return $this->metadataPrefix;
417     }
418     function getMetadataFormats( ) {
419     return $this->metadataFormats;
420     }
421     }
422    
423     class ListRecordsHandler extends HarvesterHandler {
424     var $resumptionToken;
425     var $identifier;
426     var $title;
427     var $metadata;
428     var $metadataPrefix;
429     var $search_text;
430     var $datastamp;
431     var $baseURL;
432     var $delete_flag;
433    
434     function ListRecordsHandler( $_parser, $_baseURL, $_metadataPrefix ) {
435     parent::HarvesterHandler( $_parser );
436    
437     $this->resumptionToken = null;
438     $this->identifier = null;
439     $this->title = null;
440     $this->metadata = array( );
441     $this->metadataPrefix = $_metadataPrefix;
442     $this->search_text = array( );
443     $this->datestamp = array( );
444     $this->tagstack = array( );
445     $this->baseURL = $_baseURL;
446     $this->delete_flag = false;
447     } function __construct( $_parser, $_baseURL, $_metadataPrefix ) {
448     $this->ListRecordsHandler( $_parser, $_baseURL, $_metadataPrefix );
449     }
450    
451     function startElementHandler( $parser, $name, $attribs ) {
452     array_push( $this->tagstack, $name );
453     if( $name == 'RECORD' ){
454     global $xoopsDB;
455     $xoopsDB -> setLogger( new XoopsLogger() );
456    
457     // initialize following value for each records
458     $this->title = null;
459     $this->metadata = array( );
460     $this->search_text = array( );
461     $this->datestamp = null;
462     }
463     if( $name == 'HEADER' ) {
464     if( isset( $attribs['STATUS'] )
465     && $attribs['STATUS'] == 'deleted' ) {
466     $this->delete_flag = true;
467     } else {
468     $this->delete_flag = false;
469     }
470     }
471     if( !isset( $this->tagstack[2] ) || $this->tagstack[2] != 'RECORD' )
472     return;
473    
474     array_push( $this->metadata, "<".strtolower( $name )."" );
475     foreach( $attribs as $k => $v ) {
476     array_push( $this->metadata, " ".strtolower($k)."='${v}'" );
477     }
478     array_push( $this->metadata, ">" );
479     }
480    
481     function endElementHandler( $parser, $name ) {
482     array_push( $this->search_text, ' ' );
483     if( isset( $this->tagstack[2] ) && $this->tagstack[2] == 'RECORD' )
484     array_push( $this->metadata, "</".strtolower( $name ).">" );
485     if( $name == 'RECORD' ) {
486     global $xoopsDB;
487    
488     $tbl_repositories = $xoopsDB->prefix( 'irview_repositories' );
489     $tbl_metadata = $xoopsDB->prefix( 'irview_metadata' );
490    
491     if( $this->delete_flag ) {
492     //delete a metadata
493     $sql = "DELETE FROM ${tbl_metadata} WHERE identifier='".addslashes( $this->identifier )."'";
494     $result = $xoopsDB->queryF( $sql );
495     } else {
496     //retrieve a repository id
497     $sql = "SELECT repository_id FROM ${tbl_repositories} WHERE URL='".addslashes( $this->baseURL )."'";
498     $result = $xoopsDB->query( $sql );
499     list( $id ) = $xoopsDB->fetchRow( $result );
500     if( $id ) {
501     $this->search_text = array_unique( $this->search_text );
502     array_walk( $this -> search_text, 'array_walk_bin2hex' );
503     //insert data into metadata table
504     $values = array( addslashes( $this->identifier ),
505     $id,
506     addslashes( $this->metadataPrefix ),
507     addslashes( $this->title ),
508     addslashes( implode( '', $this->metadata ) ),
509     addslashes( implode( ' ', $this->search_text ) ),
510     addslashes( $this->datestamp ) );
511     $sql = "INSERT DELAYED INTO ${tbl_metadata} (identifier, repository_id, format, title, metadata, search_text, datestamp) VALUES ('".implode( "', '", $values )."')";
512     $result = $xoopsDB->queryF( $sql );
513     if( !$result && $xoopsDB->errno( ) == 1062 ) { //1062: Can't write; duplicate key in table '%s'
514     $update = array( 'title' => addslashes( $this->title ),
515     'format' => addslashes( $this->metadataPrefix ),
516     'metadata' => addslashes( implode( '', $this->metadata ) ),
517     'search_text' => addslashes( implode( ' ', $this->search_text ) ),
518     'datestamp' => addslashes( $this->datestamp ) );
519     $sql = "UPDATE ${tbl_metadata} SET ";
520     $update2 = array( );
521     foreach( $update as $k => $v ) $update2[] = "${k}='${v}'";
522     $sql .= implode( ', ', $update2 );
523     $sql .= " WHERE identifier='".addslashes( $this->identifier )."'";
524     $result = $xoopsDB->queryF( $sql );
525     }
526     }
527     }
528     $this->metadata = array( );
529     $this->search_text = array( );
530     }
531     array_pop( $this->tagstack );
532     }
533    
534     function characterDataHandler( $parser, $data ) {
535     if( end( $this->tagstack ) == 'RESUMPTIONTOKEN' ) {
536     $this->resumptionToken = $data;
537     return;
538     }
539     if( end( $this->tagstack ) == 'IDENTIFIER' && prev( $this->tagstack ) == 'HEADER' ) {
540     $this->identifier = $data;
541     echo "${data}<br>\n";
542     }
543    
544     //<xxx:title> -> <title>
545     $tmp = split( ':', end( $this->tagstack ) );
546     if( end( $tmp ) == 'TITLE' ) {
547     $this->title .= $data;
548     }
549    
550     if( !isset( $this->tagstack[2] ) || $this->tagstack[2] != 'RECORD' )
551     return;
552     array_push( $this->metadata, $data );
553     array_push( $this->search_text, $data );
554     $this->search_text = array_merge( $this->search_text, $this -> word_separation( $data ) );
555    
556     // Extracting the datestamp data from the XML
557     if( end( $this->tagstack ) == 'DATESTAMP' && prev( $this->tagstack ) == 'HEADER' ) {
558     $this->datestamp = ISO8601toUTC($data);
559     }
560     }
561    
562     function getResumptionToken( ) {
563     return $this->resumptionToken;
564     }
565     function getIdentifier( ) {
566     return $this->identifier;
567     }
568    
569     //private
570     function utf8bytes( $c1 ){
571     if( ( $c1 & 0x80 ) == 0 ) return 1;
572     if( ( $c1 & 0xe0 ) == 0xc0 ) return 2;
573     if( ( $c1 & 0xe0 ) == 0xe0 ) return 3;
574     if( ( $c1 & 0xf8 ) == 0xf0 ) return 4;
575     return 0;
576     }
577    
578     function window( $bytes ){
579     $length = 8;
580     $ret = array();
581     $word = array();
582     $len = 0;
583    
584     for( $len = 0; $len < $length && count( $bytes ) > 0 ; $len++ ){
585     $c1 = reset( $bytes );
586     for( $i = 0; $i < $this -> utf8bytes( $c1 ); $i++ ){
587     array_push( $word, pack( "C", array_shift( $bytes ) ) );
588     }
589     }
590     while( true ){
591     array_push( $ret, implode( '', $word ) );
592     if( count( $bytes ) > 0 && $len >= $length || $len >= 3 ){
593     $tmp = unpack( "C", reset( $word ) );
594     $c1 = reset( $tmp );
595     for( $i = 0; $i < $this -> utf8bytes( $c1 ); $i++ ){
596     array_shift( $word );
597     }
598     $len--;
599     }else break;
600     if( count( $bytes ) > 0 ){
601     $c1 = reset( $bytes );
602     for( $i = 0; $i < $this -> utf8bytes( $c1 ); $i++ ){
603     array_push( $word, pack( "C", array_shift( $bytes ) ) );
604     }
605     $len++;
606     }
607     }
608     return $ret;
609     }
610    
611     /**
612     *
613     * ��������������������������
614     * ��������������������������������8��������������������������������
615     * 1��������������������������
616     *
617     */
618     function word_separation( $text ){
619     $multi = array();
620     $bytes = unpack( "C*", $text );
621     $c1 = 0;
622     $words = array();
623     while( count( $bytes ) >= 0 ){
624     $tmp = array();
625     if( count( $multi ) > 0 && ( $c1 & 0x80 ) != 0 && ( reset( $bytes ) & 0x80 ) == 0 ){
626     $words = array_merge( $words, $this -> window( $multi ) );
627     $multi = array();
628     }else if( count( $multi ) > 0 && ( $c1 & 0x80 ) == 0 && ( reset( $bytes ) & 0x80 ) != 0 ){
629     $tmp = array();
630     while( count( $multi ) > 0 ) array_push( $tmp, pack( "C", array_shift( $multi ) ) );
631     $words = array_merge( $words, explode( ' ', implode( '', $tmp ) ) );
632     $multi = array();
633     }
634     if( count( $bytes ) == 0 ) break;
635     $c1 = reset( $bytes );
636     if( $this -> utf8bytes( $c1 ) == 1 ){
637     array_push( $multi, array_shift( $bytes ) );
638     }else{
639     for( $i = 0; $i < $this -> utf8bytes( $c1 ); $i++ ){
640     array_push( $multi, array_shift( $bytes ) );
641     }
642     }
643     }
644     if( count( $multi ) > 0 ){
645     $tmp = array();
646     while( count( $multi ) > 0 ) array_push( $tmp, pack( "C", array_shift( $multi ) ) );
647     $words = array_merge( $words, explode( ' ', implode( '', $tmp ) ) );
648     }
649    
650     return $words;
651     }
652    
653     }
654    
655     function array_walk_bin2hex( &$item1, $key ){
656     if ($item1 == '') return;
657     $tmp = unpack( "C", $item1 );
658     if( ( reset( $tmp ) & 0x80 ) == 0 || $item1 == ' ' || $item1 == "\n" ) return;
659     $item1 = bin2hex( $item1 );
660     }
661    
662    
663     /**
664     *
665     * resumptionToken������������������������
666     *
667     * @param resumption_token
668     * @param metadata_prefix
669     * @param verb
670     * @param args verb��������������������������
671     * @param last_item_id ����������������������������ID��������
672     * @param limit_row ����resumptionToken��������������������������������
673     * @param expire_date ����resumptionToken����������
674     * @param publish_date ����resumptionToken����������(������)
675     * @return ����
676     *
677     */
678     function
679     setResumptionToken( $resumption_token, $metadata_prefix, $verb, $args, $last_item_id, $limit_row, $expire_date, $publish_date = null )
680     {
681     global $xoopsDB;
682    
683     if( $publish_date == null )
684     $publish_date = time( );
685     $table = $xoopsDB->prefix( "irview_resumption_token" );
686     $sql = "INSERT INTO ${table} VALUES ('".addslashes( $resumption_token )
687     ."', '${metadata_prefix}', '${verb}', '".addslashes( serialize( $args ) )
688     ."', ${last_item_id}, ${limit_row}, ${publish_date}, ${expire_date} )";
689     return $xoopsDB->queryF( $sql );
690     }
691    
692     /**
693     *
694     * resumptionToken������������������
695     *
696     * @param resumption_token
697     * @return array(
698     * 'metadata_prefix ' => metadataPrefix,
699     * 'verb ' => verb,
700     * 'args' => verb��������������������������,
701     * 'last_item_id' => ����������������������������ID��������,
702     * 'limit_row' => ����resumptionToken�������������������������������� ,
703     * 'expire_date' => ����resumptionToken���������� ,
704     * 'publish_date' => ����resumptionToken���������� )
705     * @return false resumptionToken��������������
706     *
707     */
708     function
709     getResumptionToken( $resumption_token )
710     {
711     global $xoopsDB;
712    
713     $table = $xoopsDB->prefix( "irview_resumption_token" );
714     $sql = "SELECT resumption_token, metadata_prefix, args, last_item_id, publish_date, expire_date, verb FROM ${table} WHERE resumption_token=\"".stripslashes( $resumption_token )
715     .'"';
716     $result = $xoopsDB->query( $sql );
717     $ret = $xoopsDB->fetchArray( $result );
718     $ret['args'] = unserialize( $ret['args'] );
719     return $ret;
720     }
721    
722     /**
723     *
724     * resumptionToken������������
725     * ��������������������������������������������
726     *
727     * @param resumption_token ������������������
728     *
729     */
730     function
731     expireResumptionToken( $resumptionToken )
732     {
733     global $xoopsDB;
734    
735     $table = $xoopsDB->prefix( "irview_resumption_token" );
736     $sql = "DELETE FROM ${table} WHERE resumption_token=\"".stripslashes( $resumptionToken )
737     .'" OR expire_date < UNIX_TIMESTAMP( NOW() )';
738     $result = $xoopsDB->queryF( $sql );
739     }
740    
741     /**
742     *
743     * ISO8601������UTC����������. ������������������false������
744     * Usage: ISO8601toUTC( "2005-08-01T12:00:00Z" );
745     * Usage: ISO8601toUTC( "2005-08-01" );
746     *
747     */
748     function
749     ISO8601toUTC( $str )
750     {
751     if( preg_match( "/([0-9]{4})-([0-9]{2})-([0-9]{2})(T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)?/", $str, $match ) == 0 )
752     return 0;
753     if( !isset( $match[5] ) )
754     $match[5] = 0;
755     if( !isset( $match[6] ) )
756     $match[6] = 0;
757     if( !isset( $match[7] ) )
758     $match[7] = 0;
759     return gmmktime( $match[5], $match[6], $match[7], $match[2], $match[3], $match[1] );
760     }
761    
762    
763     ?>

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26