2013-05-12 01:06:17 +02:00
|
|
|
<?php
|
2013-05-14 05:54:50 +02:00
|
|
|
|
|
|
|
require_once('oai2exception.php');
|
|
|
|
require_once('oai2xml.php');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The content-type the WWW-server delivers back. For debug-puposes, "text/plain"
|
|
|
|
* is easier to view. On a production site you should use "text/xml".
|
2013-05-12 02:18:36 +02:00
|
|
|
*/
|
2013-05-14 05:54:50 +02:00
|
|
|
define('CONTENT_TYPE', 'Content-Type: text/xml');
|
|
|
|
|
|
|
|
/** After 24 hours resumptionTokens become invalid. Unit is second. */
|
|
|
|
define('TOKEN_VALID',24*3600);
|
|
|
|
|
|
|
|
/** Where token is saved and path is included */
|
|
|
|
define('TOKEN_PREFIX','/tmp/oai_pmh-');
|
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
class OAI2Server {
|
|
|
|
|
2013-05-12 02:18:36 +02:00
|
|
|
public $errors = array();
|
2013-05-14 21:46:15 +02:00
|
|
|
private $args = array();
|
|
|
|
private $verb = '';
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
function __construct($uri, $args, $identifyResponse, $callbacks) {
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (!isset($args['verb']) || empty($args['verb'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('noVerb');
|
|
|
|
$this->errorResponse();
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->verb = $args['verb'];
|
|
|
|
unset($args['verb']);
|
2013-05-12 01:06:17 +02:00
|
|
|
$this->args = $args;
|
2013-05-14 21:46:15 +02:00
|
|
|
|
|
|
|
$this->uri = $uri;
|
|
|
|
|
2013-05-12 02:18:36 +02:00
|
|
|
$this->identifyResponse = $identifyResponse;
|
2013-05-14 21:46:15 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->listMetadataFormatsCallback = $callbacks['ListMetadataFormats'];
|
|
|
|
$this->listSetsCallback = $callbacks['ListSets'];
|
|
|
|
$this->listRecordsCallback = $callbacks['ListRecords'];
|
|
|
|
$this->getRecordCallback = $callbacks['GetRecord'];
|
2013-05-14 21:46:15 +02:00
|
|
|
|
|
|
|
$this->response = new OAI2XMLResponse($this->uri, $this->verb, $this->args);
|
|
|
|
|
2013-05-12 02:18:36 +02:00
|
|
|
$this->respond();
|
|
|
|
}
|
|
|
|
|
|
|
|
private function respond() {
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
switch ($this->verb) {
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
case 'Identify': $this->identify(); break;
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
case 'ListMetadataFormats': $this->listMetadataFormats(); break;
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
case 'ListSets': $this->listSets(); break;
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
case 'ListIdentifiers':
|
|
|
|
case 'ListRecords': $this->listRecords(); break;
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
case 'GetRecord': $this->getRecord(); break;
|
|
|
|
|
|
|
|
default: $this->errors[] = new OAI2Exception('badVerb', $this->args['verb']);
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (empty($this->errors)) {
|
|
|
|
header(CONTENT_TYPE);
|
|
|
|
$this->response->display();
|
2013-05-12 02:18:36 +02:00
|
|
|
} else {
|
|
|
|
$this->errorResponse();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
private function errorResponse() {
|
2013-05-14 21:46:15 +02:00
|
|
|
$errorResponse = new OAI2XMLResponse($this->uri, $this->verb, $this->args);
|
|
|
|
$oai_node = $errorResponse->doc->documentElement;
|
|
|
|
foreach($this->errors as $e) {
|
|
|
|
$node = $errorResponse->addChild($oai_node,"error",$e->getMessage());
|
|
|
|
$node->setAttribute("code",$e->getOAI2Code());
|
|
|
|
}
|
2013-05-12 02:18:36 +02:00
|
|
|
header(CONTENT_TYPE);
|
2013-05-14 21:46:15 +02:00
|
|
|
$errorResponse->display();
|
2013-05-12 02:18:36 +02:00
|
|
|
exit();
|
|
|
|
}
|
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
/**
|
|
|
|
* Response to Verb Identify
|
|
|
|
*
|
|
|
|
* Tell the world what the data provider is. Usually it is static once the provider has been set up.
|
|
|
|
*
|
|
|
|
* http://www.openarchives.org/OAI/2.0/guidelines-oai-identifier.htm for details
|
|
|
|
*/
|
2013-05-14 05:54:50 +02:00
|
|
|
public function identify() {
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (count($this->args) > 0) {
|
2013-05-12 02:18:36 +02:00
|
|
|
foreach($args as $key => $val) {
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->errors[] = new OAI2Exception('badArgument', $key, $val);
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->errorResponse();
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-12 02:18:36 +02:00
|
|
|
foreach($this->identifyResponse as $key => $val) {
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->response->addToVerbNode($key, $val);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Response to Verb ListMetadataFormats
|
|
|
|
*
|
2013-05-14 05:54:50 +02:00
|
|
|
* The information of supported metadata formats
|
2013-05-12 01:06:17 +02:00
|
|
|
*/
|
|
|
|
public function listMetadataFormats() {
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
foreach ($this->args as $argument => $value) {
|
|
|
|
if ($argument != 'identifier') {
|
|
|
|
$this->errors[] = new OAI2Exception('badArgument', $argument, $value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!empty($this->errors)) {
|
|
|
|
$this->errorResponse();
|
|
|
|
}
|
2013-05-12 02:18:36 +02:00
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
try {
|
2013-05-14 05:54:50 +02:00
|
|
|
if ($formats = call_user_func($this->listMetadataFormatsCallback, $this->args['identifier'])) {
|
|
|
|
foreach($formats as $key => $val) {
|
2013-05-14 21:46:15 +02:00
|
|
|
$cmf = $this->response->addToVerbNode("metadataFormat");
|
|
|
|
$this->response->addChild($cmf,'metadataPrefix',$key);
|
|
|
|
$this->response->addChild($cmf,'schema',$val['schema']);
|
|
|
|
$this->response->addChild($cmf,'metadataNamespace',$val['metadataNamespace']);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
2013-05-14 21:46:15 +02:00
|
|
|
} else {
|
|
|
|
$this->errors[] = new OAI2Exception('noMetadataFormats');
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
} catch (OAI2Exception $e) {
|
|
|
|
$this->errors[] = $e;
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Response to Verb ListSets
|
|
|
|
*
|
|
|
|
* Lists what sets are available to records in the system.
|
|
|
|
* This variable is filled in config-sets.php
|
|
|
|
*/
|
2013-05-12 02:18:36 +02:00
|
|
|
public function listSets() {
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (isset($this->args['resumptionToken'])) {
|
|
|
|
if (count($this->args) > 1) {
|
|
|
|
$this->errors[] = new OAI2Exception('exclusiveArgument');
|
|
|
|
} else {
|
|
|
|
if ((int)$val+TOKEN_VALID < time()) {
|
|
|
|
$this->errors[] = new OAI2Exception('badResumptionToken');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!empty($this->errors)) {
|
|
|
|
$this->errorResponse();
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
if ($sets = call_user_func($this->listSetsCallback)) {
|
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
foreach($sets as $set) {
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$setNode = $this->response->addToVerbNode("set");
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
foreach($set as $key => $val) {
|
|
|
|
if($key=='setDescription') {
|
2013-05-14 21:46:15 +02:00
|
|
|
$desNode = $this->response->addChild($setNode,$key);
|
|
|
|
$des = $this->response->doc->createDocumentFragment();
|
2013-05-12 01:06:17 +02:00
|
|
|
$des->appendXML($val);
|
|
|
|
$desNode->appendChild($des);
|
|
|
|
} else {
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->response->addChild($setNode,$key,$val);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->errors[] = new OAI2Exception('noSetHierarchy');
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Response to Verb GetRecord
|
|
|
|
*
|
|
|
|
* Retrieve a record based its identifier.
|
|
|
|
*
|
|
|
|
* Local variables <B>$metadataPrefix</B> and <B>$identifier</B> need to be provided through global array variable <B>$args</B>
|
|
|
|
* by their indexes 'metadataPrefix' and 'identifier'.
|
|
|
|
* The reset of information will be extracted from database based those two parameters.
|
|
|
|
*/
|
|
|
|
public function getRecord() {
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (!isset($this->args['metadataPrefix'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('missingArgument', 'metadataPrefix');
|
|
|
|
} else {
|
|
|
|
$metadataFormats = call_user_func($this->listMetadataFormatsCallback);
|
|
|
|
if (!isset($metadataFormats[$this->args['metadataPrefix']])) {
|
|
|
|
$this->errors[] = new OAI2Exception('cannotDisseminateFormat', 'metadataPrefix', $this->args['metadataPrefix']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!isset($this->args['identifier'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('missingArgument', 'identifier');
|
|
|
|
}
|
|
|
|
if (!empty($this->errors)) {
|
|
|
|
$this->errorResponse();
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2013-05-14 21:46:15 +02:00
|
|
|
if ($record = call_user_func($this->getRecordCallback, $this->args['identifier'], $this->args['metadataPrefix'])) {
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$identifier = $record['identifier'];
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$datestamp = formatDatestamp($record['datestamp']);
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$set = $record['set'];
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$status_deleted = (isset($record['deleted']) && ($record['deleted'] == 'true') &&
|
|
|
|
(($this->identifyResponse['deletedRecord'] == 'transient') ||
|
|
|
|
($this->identifyResponse['deletedRecord'] == 'persistent')));
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$cur_record = $this->response->addToVerbNode('record');
|
|
|
|
$cur_header = $this->response->createHeader($identifier, $datestamp, $set, $cur_record);
|
2013-05-14 05:54:50 +02:00
|
|
|
if ($status_deleted) {
|
|
|
|
$cur_header->setAttribute("status","deleted");
|
|
|
|
} else {
|
|
|
|
$this->add_metadata($cur_record, $record);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (OAI2Exception $e) {
|
|
|
|
$this->errors[] = $e;
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2013-05-12 02:18:36 +02:00
|
|
|
public function listRecords() {
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
if (isset($this->args['resumptionToken'])) {
|
2013-05-14 21:46:15 +02:00
|
|
|
if (count($this->args) > 1) {
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->errors[] = new OAI2Exception('exclusiveArgument');
|
2013-05-14 21:46:15 +02:00
|
|
|
} else {
|
|
|
|
if ((int)$val+TOKEN_VALID < time()) {
|
|
|
|
$this->errors[] = new OAI2Exception('badResumptionToken');
|
|
|
|
}
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
|
|
|
} else {
|
2013-05-14 21:46:15 +02:00
|
|
|
if (!isset($this->args['metadataPrefix'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('missingArgument', 'metadataPrefix');
|
|
|
|
} else {
|
|
|
|
$metadataFormats = call_user_func($this->listMetadataFormatsCallback);
|
|
|
|
if (!isset($metadataFormats[$this->args['metadataPrefix']])) {
|
|
|
|
$this->errors[] = new OAI2Exception('cannotDisseminateFormat', 'metadataPrefix', $this->args['metadataPrefix']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (isset($this->args['from'])) {
|
|
|
|
if(!checkDateFormat($this->args['from'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('badGranularity', 'from', $this->args['from']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (isset($this->args['until'])) {
|
|
|
|
if(!checkDateFormat($this->args['until'])) {
|
|
|
|
$this->errors[] = new OAI2Exception('badGranularity', 'until', $this->args['until']);
|
|
|
|
}
|
|
|
|
}
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (!empty($this->errors)) {
|
|
|
|
$this->errorResponse();
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
// Resume previous session?
|
|
|
|
if (isset($this->args['resumptionToken'])) {
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
if (!file_exists(TOKEN_PREFIX.$this->args['resumptionToken'])) {
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->errors[] = new OAI2Exception('badResumptionToken', '', $this->args['resumptionToken']);
|
2013-05-12 01:06:17 +02:00
|
|
|
} else {
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
if ($readings = $this->readResumptionToken(TOKEN_PREFIX.$this->args['resumptionToken'])) {
|
|
|
|
list($deliveredRecords, $metadataPrefix, $from, $until, $set) = $readings;
|
2013-05-12 01:06:17 +02:00
|
|
|
} else {
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->errors[] = new OAI2Exception('badResumptionToken', '', $this->args['resumptionToken']);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
if (!empty($this->errors)) {
|
|
|
|
$this->errorResponse();
|
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
} else {
|
|
|
|
$deliveredRecords = 0;
|
|
|
|
$metadataPrefix = $this->args['metadataPrefix'];
|
|
|
|
$from = isset($this->args['from']) ? $this->args['from'] : '';
|
|
|
|
$until = isset($this->args['until']) ? $this->args['until'] : '';
|
|
|
|
$set = isset($this->args['set']) ? $this->args['set'] : '';
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$maxItems = 1000;
|
2013-05-12 02:18:36 +02:00
|
|
|
try {
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$records_count = call_user_func($this->listRecordsCallback, $metadataPrefix, $from, $until, $set, true);
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$records = call_user_func($this->listRecordsCallback, $metadataPrefix, $from, $until, $set, false, $deliveredRecords, $maxItems);
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
foreach ($records as $record) {
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$identifier = $record['identifier'];
|
|
|
|
$datestamp = formatDatestamp($record['datestamp']);
|
2013-05-14 21:46:15 +02:00
|
|
|
$setspec = $record['set'];
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$status_deleted = (isset($record['deleted']) && ($record['deleted'] === true) &&
|
|
|
|
(($this->identifyResponse['deletedRecord'] == 'transient') ||
|
|
|
|
($this->identifyResponse['deletedRecord'] == 'persistent')));
|
|
|
|
|
|
|
|
if($this->args['verb'] == 'ListRecords') {
|
2013-05-14 21:46:15 +02:00
|
|
|
$cur_record = $this->response->createToVerNode('record');
|
|
|
|
$cur_header = $this->response->createHeader($identifier, $datestamp,$setspec,$cur_record);
|
2013-05-14 05:54:50 +02:00
|
|
|
if (!$status_deleted) {
|
|
|
|
$this->add_metadata($cur_record, $record);
|
|
|
|
}
|
|
|
|
} else { // for ListIdentifiers, only identifiers will be returned.
|
2013-05-14 21:46:15 +02:00
|
|
|
$cur_header = $this->response->createHeader($identifier, $datestamp,$setspec);
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|
|
|
|
if ($status_deleted) {
|
|
|
|
$cur_header->setAttribute("status","deleted");
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
// Will we need a new ResumptionToken?
|
|
|
|
if ($records_count - $deliveredRecords > $maxItems) {
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$deliveredRecords += $maxItems;
|
|
|
|
$restoken = $this->createResumptionToken($deliveredRecords);
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
$expirationDatetime = gmstrftime('%Y-%m-%dT%TZ', time()+TOKEN_VALID);
|
|
|
|
|
|
|
|
} elseif (isset($args['resumptionToken'])) {
|
|
|
|
// Last delivery, return empty ResumptionToken
|
|
|
|
$restoken = null;
|
|
|
|
$expirationDatetime = null;
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
|
|
|
|
if (isset($restoken)) {
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->response->createResumptionToken($restoken,$expirationDatetime,$records_count,$deliveredRecords);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
} catch (OAI2Exception $e) {
|
|
|
|
$this->errors[] = $e;
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-14 05:54:50 +02:00
|
|
|
private function add_metadata($cur_record, $record) {
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$meta_node = $this->response->addChild($cur_record ,"metadata");
|
2013-05-12 01:06:17 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$schema_node = $this->response->addChild($meta_node, $record['metadata']['container_name']);
|
2013-05-14 05:54:50 +02:00
|
|
|
foreach ($record['metadata']['container_attributes'] as $name => $value) {
|
|
|
|
$schema_node->setAttribute($name, $value);
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
foreach ($record['metadata']['fields'] as $name => $value) {
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->response->addChild($schema_node, $name, $value);
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private function createResumptionToken($delivered_records) {
|
|
|
|
|
|
|
|
list($usec, $sec) = explode(" ", microtime());
|
|
|
|
$token = ((int)($usec*1000) + (int)($sec*1000));
|
|
|
|
|
|
|
|
$fp = fopen (TOKEN_PREFIX.$token, 'w');
|
|
|
|
if($fp==false) {
|
|
|
|
exit("Cannot write. Writer permission needs to be changed.");
|
|
|
|
}
|
|
|
|
fputs($fp, "$delivered_records#");
|
|
|
|
fputs($fp, "$metadataPrefix#");
|
|
|
|
fputs($fp, "{$this->args['from']}#");
|
|
|
|
fputs($fp, "{$this->args['until']}#");
|
|
|
|
fputs($fp, "{$this->args['set']}#");
|
|
|
|
fclose($fp);
|
|
|
|
return $token;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function readResumptionToken($resumptionToken) {
|
|
|
|
$rtVal = false;
|
|
|
|
$fp = fopen($resumptionToken, 'r');
|
|
|
|
if ($fp != false) {
|
|
|
|
$filetext = fgets($fp, 255);
|
|
|
|
$textparts = explode('#', $filetext);
|
|
|
|
fclose($fp);
|
|
|
|
unlink($resumptionToken);
|
|
|
|
$rtVal = array_values($textparts);
|
|
|
|
}
|
|
|
|
return $rtVal;
|
2013-05-12 02:18:36 +02:00
|
|
|
}
|
2013-05-12 01:06:17 +02:00
|
|
|
}
|