Develop and Download Open Source Software

Browse CVS Repository

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

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


Revision 1.1.1.1 - (show annotations) (download) (as text) (vendor branch)
Mon Nov 6 01:29:26 2006 UTC (17 years, 5 months ago) by yamaji
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
File MIME type: application/x-httpd-php
initial import into CVS

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