177 lines
5.8 KiB
PHP
177 lines
5.8 KiB
PHP
<?php
|
|
/**
|
|
* \file
|
|
* \brief Response to Verb ListRecords
|
|
*
|
|
* Lists records according to conditions. If there are too many, a resumptionToken is generated.
|
|
* - If a request comes with a resumptionToken and is still valid, read it and send back records.
|
|
* - Otherwise, set up a query with conditions such as: 'metadataPrefix', 'from', 'until', 'set'.
|
|
* Only 'metadataPrefix' is compulsory. All conditions are accessible through global array variable <B>$args</B> by keywords.
|
|
*/
|
|
|
|
debug_message("\nI am debuging". __FILE__) ;
|
|
|
|
// Resume previous session?
|
|
if (isset($args['resumptionToken'])) {
|
|
if (!file_exists(TOKEN_PREFIX.$args['resumptionToken'])) {
|
|
$errors[] = oai_error('badResumptionToken', '', $args['resumptionToken']);
|
|
} else {
|
|
$readings = readResumToken(TOKEN_PREFIX.$args['resumptionToken']);
|
|
if ($readings == false) {
|
|
$errors[] = oai_error('badResumptionToken', '', $args['resumptionToken']);
|
|
} else {
|
|
debug_var_dump('readings',$readings);
|
|
list($deliveredrecords, $extquery, $metadataPrefix) = $readings;
|
|
}
|
|
}
|
|
} else { // no, we start a new session
|
|
$deliveredrecords = 0;
|
|
$extquery = '';
|
|
|
|
$metadataPrefix = $args['metadataPrefix'];
|
|
|
|
if (isset($args['from'])) {
|
|
$from = checkDateFormat($args['from']);
|
|
$extquery .= fromQuery($from);
|
|
}
|
|
|
|
if (isset($args['until'])) {
|
|
$until = checkDateFormat($args['until']);
|
|
$extquery .= untilQuery($until);
|
|
}
|
|
|
|
if (isset($args['set'])) {
|
|
if (is_array($SETS)) {
|
|
$extquery .= setQuery($args['set']);
|
|
} else {
|
|
$errors[] = oai_error('noSetHierarchy');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($errors)) {
|
|
oai_exit();
|
|
}
|
|
|
|
// Load the handler
|
|
if (is_array($METADATAFORMATS[$metadataPrefix]) && isset($METADATAFORMATS[$metadataPrefix]['myhandler'])) {
|
|
$inc_record = $METADATAFORMATS[$metadataPrefix]['myhandler'];
|
|
include($inc_record);
|
|
} else {
|
|
$errors[] = oai_error('cannotDisseminateFormat', 'metadataPrefix', $metadataPrefix);
|
|
}
|
|
|
|
if (!empty($errors)) {
|
|
oai_exit();
|
|
}
|
|
|
|
if (empty($errors)) {
|
|
$query = selectallQuery($metadataPrefix) . $extquery;
|
|
debug_message("Query: $query") ;
|
|
|
|
$res = $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
|
|
$r = $res->execute();
|
|
if (($r===false) ) {
|
|
if ( (SHOW_QUERY_ERROR)) {
|
|
echo __FILE__.','.__LINE__."<br />";
|
|
echo "Query: $query<br />\n";
|
|
print_r($db->errorInfo());
|
|
exit();
|
|
} else {
|
|
$errors[] = oai_error('noRecordsMatch');
|
|
}
|
|
} else {
|
|
$r = $res->setFetchMode(PDO::FETCH_ASSOC);
|
|
if ($r===false) {
|
|
exit("FetchMode is not supported");
|
|
}
|
|
$num_rows = rowCount($metadataPrefix, $extquery, $db);
|
|
if ($num_rows==0) {
|
|
if (SHOW_QUERY_ERROR) {
|
|
echo "Cannot find records: $query\n";
|
|
}
|
|
$errors[] = oai_error('noRecordsMatch');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($errors)) {
|
|
oai_exit();
|
|
}
|
|
|
|
// Will we need a new ResumptionToken?
|
|
if($args['verb']=='ListRecords') {
|
|
$maxItems = MAXRECORDS;
|
|
} elseif($args['verb']=='ListIdentifiers') {
|
|
$maxItems = MAXIDS;
|
|
} else {
|
|
exit("Check ".__FILE__." ".__LINE__.", there is something wrong.");
|
|
}
|
|
$maxrec = min($num_rows - $deliveredrecords, $maxItems);
|
|
|
|
if ($num_rows - $deliveredrecords > $maxItems) {
|
|
$cursor = (int)$deliveredrecords + $maxItems;
|
|
$restoken = createResumToken($cursor, $extquery, $metadataPrefix);
|
|
$expirationdatetime = gmstrftime('%Y-%m-%dT%TZ', time()+TOKEN_VALID);
|
|
} elseif (isset($args['resumptionToken'])) {
|
|
// Last delivery, return empty ResumptionToken
|
|
$restoken = $args['resumptionToken']; // just used as an indicator
|
|
unset($expirationdatetime);
|
|
}
|
|
|
|
if (isset($args['resumptionToken'])) {
|
|
debug_message("Try to resume because a resumptionToken supplied.") ;
|
|
$record = $res->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $deliveredrecords);
|
|
}
|
|
// Record counter
|
|
$countrec = 0;
|
|
|
|
// Publish a batch to $maxrec number of records
|
|
$outputObj = new ANDS_Response_XML($args);
|
|
while ($countrec++ < $maxrec) {
|
|
$record = $res->fetch(PDO::FETCH_ASSOC);
|
|
if ($record===false) {
|
|
if (SHOW_QUERY_ERROR) {
|
|
echo __FILE__.",". __LINE__."<br />";
|
|
print_r($db->errorInfo());
|
|
exit();
|
|
}
|
|
}
|
|
|
|
$identifier = $oaiprefix.$record[$SQL['identifier']];
|
|
$datestamp = formatDatestamp($record[$SQL['datestamp']]);
|
|
$setspec = $record[$SQL['set']];
|
|
|
|
// debug_var_dump('record', $record);
|
|
$status_deleted = (isset($record[$SQL['deleted']]) && ($record[$SQL['deleted']] === true) &&
|
|
($deletedRecord == 'transient' || $deletedRecord == 'persistent'));
|
|
|
|
//debug_var_dump('status_deleted', $status_deleted);
|
|
if($args['verb']=='ListRecords') {
|
|
$cur_record = $outputObj->create_record();
|
|
$cur_header = $outputObj->create_header($identifier, $datestamp,$setspec,$cur_record);
|
|
// return the metadata record itself
|
|
if (!$status_deleted) {
|
|
debug_var_dump('inc_record',$inc_record);
|
|
create_metadata($outputObj, $cur_record, $identifier, $setspec, $db);
|
|
}
|
|
} else { // for ListIdentifiers, only identifiers will be returned.
|
|
$cur_header = $outputObj->create_header($identifier, $datestamp,$setspec);
|
|
}
|
|
if ($status_deleted) {
|
|
$cur_header->setAttribute("status","deleted");
|
|
}
|
|
}
|
|
|
|
// ResumptionToken
|
|
if (isset($restoken)) {
|
|
if(isset($expirationdatetime)) {
|
|
$outputObj->create_resumpToken($restoken,$expirationdatetime,$num_rows,$cursor);
|
|
} else {
|
|
$outputObj->create_resumpToken('',null,$num_rows,$deliveredrecords);
|
|
}
|
|
}
|
|
|
|
// end ListRecords
|
|
if (SHOW_QUERY_ERROR) {echo "Debug listrecord.php reached to the end.\n\n";}
|