* @package ARC2
* @version 2010-11-16
*/
ARC2::inc('Store');
class ARC2_StoreEndpoint extends ARC2_Store {
function __construct($a, &$caller) {
parent::__construct($a, $caller);
}
function __init() {
parent::__init();
$this->headers = array('http' => 'HTTP/1.1 200 OK', 'vary' => 'Vary: Accept');
$this->read_key = $this->v('endpoint_read_key', '', $this->a);
$this->write_key = $this->v('endpoint_write_key', '', $this->a);
$this->timeout = $this->v('endpoint_timeout', 0, $this->a);
$this->a['store_allow_extension_functions'] = $this->v('store_allow_extension_functions', 0, $this->a);
$this->allow_sql = $this->v('endpoint_enable_sql_output', 0, $this->a);
$this->result = '';
}
/* */
function getQueryString($mthd = 'post') {
$r = '';
if (!$mthd || ($mthd == 'post')) {
$r = @file_get_contents('php://input');
}
$r = !$r ?$this->v1('QUERY_STRING', '', $_SERVER) : $r;
return $r;
}
function p($name='', $mthd = '', $multi = '', $default = '') {
$mthd = strtolower($mthd);
if($multi){
$qs = $this->getQueryString($mthd);
if (preg_match_all('/\&' . $name . '=([^\&]+)/', $qs, $m)){
foreach ($m[1] as $i => $val) {
$m[1][$i] = stripslashes($val);
}
return $m[1];
}
return $default ? $default : array();
}
$args = array_merge($_GET, $_POST);
$r = isset($args[$name]) ? $args[$name] : $default;
return is_array($r) ? $r : stripslashes($r);
}
/* */
function getFeatures() {
return $this->v1('endpoint_features', array(), $this->a);
}
function setHeader($k, $v) {
$this->headers[$k] = $v;
}
function sendHeaders() {
if (!isset($this->is_dump) || !$this->is_dump) {
$this->setHeader('content-length', 'Content-Length: ' . strlen($this->getResult()));
foreach ($this->headers as $k => $v) {
header($v);
}
}
}
function getResult() {
return $this->result;
}
/* */
function handleRequest($auto_setup = 0) {
if (!$this->isSetUp()) {
if ($auto_setup) {
$this->setUp();
return $this->handleRequest(0);
}
else {
$this->setHeader('http', 'HTTP/1.1 400 Bad Request');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Missing configuration or the endpoint store was not set up yet.';
}
}
elseif (($img = $this->p('img'))) {
$this->handleImgRequest($img);
}
elseif (($q = $this->p('query'))) {
$this->checkProcesses();
$this->handleQueryRequest($q);
if ($this->p('show_inline')) {
$this->query_result = '
' . ($this->p('output') != 'htmltab' ? '
' . htmlspecialchars($this->getResult()) . '
' : $this->getResult()) . '
';
$this->handleEmptyRequest(1);
}
}
else {
$this->handleEmptyRequest();
}
}
function go($auto_setup = 0) {
$this->handleRequest($auto_setup);
$this->sendHeaders();
echo $this->getResult();
}
/* */
function handleImgRequest($img) {
$this->setHeader('content-type', 'Content-type: image/gif');
$imgs = array(
'bg_body' => base64_decode('R0lGODlhAQBkAMQAAPf39/Hx8erq6vPz8/Ly8u/v7+np6fT09Ovr6/b29u3t7ejo6Pz8/Pv7+/39/fr6+vj4+P7+/vn5+f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAGQAAAUp4GIIiFIExHAkAAC9cAxJdG3TT67vTe//jKBQ6Cgaj5GkcpmcOJ/QZwgAOw=='),
);
$this->result = isset($imgs[$img]) ? $imgs[$img] : '';
$this->sendHeaders();
echo $this->getResult();
exit;
}
/* */
function handleEmptyRequest($force = 0) {
/* service description */
$formats = array(
'rdfxml' => 'RDFXML', 'rdf+xml' => 'RDFXML', 'html' => 'HTML'
);
if (!$force && $this->getResultFormat($formats, 'html') != 'HTML') {
$this->handleServiceDescriptionRequest();
}
else {
$this->setHeader('content-type', 'Content-type: text/html; charset=utf-8');
$this->result = $this->getHTMLFormDoc();
}
}
/* */
function handleServiceDescriptionRequest() {
$q = '
PREFIX void:
CONSTRUCT {
<> void:sparqlEndpoint <> .
}
WHERE {
?s ?p ?o .
} LIMIT 1
';
$this->handleQueryRequest($q);
}
/* */
function checkProcesses() {
if (method_exists($this->caller, 'checkSPARQLEndpointProcesses')) {
$sub_r = $this->caller->checkSPARQLEndpointProcesses();
}
elseif ($this->timeout) {
$this->killDBProcesses('', $this->timeout);
}
}
/* */
function handleQueryRequest($q) {
if (preg_match('/^dump/i', $q)) {
$infos = array('query' => array('type' => 'dump'));
$this->is_dump = 1;
}
else {
ARC2::inc('SPARQLPlusParser');
$p = new ARC2_SPARQLPlusParser($this->a, $this);
$p->parse($q);
$infos = $p->getQueryInfos();
}
/* errors? */
if ($errors = $this->getErrors()) {
$this->setHeader('http', 'HTTP/1.1 400 Bad Request');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = htmlspecialchars(join("\n", $errors));
return true;
}
$qt = $infos['query']['type'];
/* wrong read key? */
if ($this->read_key && ($this->p('key') != $this->read_key) && preg_match('/^(select|ask|construct|describe|dump)$/', $qt)) {
$this->setHeader('http', 'HTTP/1.1 401 Access denied');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Access denied. Missing or wrong "key" parameter.';
return true;
}
/* wrong write key? */
if ($this->write_key && ($this->p('key') != $this->write_key) && preg_match('/^(load|insert|delete|update)$/', $qt)) {
$this->setHeader('http', 'HTTP/1.1 401 Access denied');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Access denied. Missing or wrong "key" parameter.';
return true;
}
/* non-allowed query type? */
if (!in_array($qt, $this->getFeatures())) {
$this->setHeader('http', 'HTTP/1.1 401 Access denied');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Access denied for "' .$qt. '" query';
return true;
}
/* load/insert/delete via GET */
if (in_array($qt, array('load', 'insert', 'delete')) && isset($_GET['query'])) {
$this->setHeader('http', 'HTTP/1.1 501 Not Implemented');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Query type "' .$qt. '" not supported via GET';
return true;
}
/* unsupported query type */
if (!in_array($qt, array('select', 'ask', 'describe', 'construct', 'load', 'insert', 'delete', 'dump'))) {
$this->setHeader('http', 'HTTP/1.1 501 Not Implemented');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Unsupported query type "' .$qt. '"';
return true;
}
/* adjust infos */
$infos = $this->adjustQueryInfos($infos);
$t1 = ARC2::mtime();
$r = array('result' => $this->runQuery($infos, $qt));
$t2 = ARC2::mtime();
$r['query_time'] = $t2 - $t1;
/* query errors? */
if ($errors = $this->getErrors()) {
$this->setHeader('http', 'HTTP/1.1 400 Bad Request');
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Error: ' . join("\n", $errors);
return true;
}
/* result */
$m = 'get' . ucfirst($qt) . 'ResultDoc';
if (method_exists($this, $m)) {
$this->result = $this->$m($r);
}
else {
$this->setHeader('content-type', 'Content-type: text/plain; charset=utf-8');
$this->result = 'Result serializer not available, dumping raw data:' . "\n" . print_r($r, 1);
}
}
/* */
function adjustQueryInfos($infos) {
/* limit */
if ($max_l = $this->v('endpoint_max_limit', 0, $this->a)) {
if ($this->v('limit', $max_l + 1, $infos['query']) > $max_l) {
$infos['query']['limit'] = $max_l;
}
}
/* default-graph-uri / named-graph-uri */
$dgs = $this->p('default-graph-uri', '', 1);
$ngs = $this->p('named-graph-uri', '', 1);
if (count(array_merge($dgs, $ngs))) {
$ds = array();
foreach ($dgs as $g) {
$ds[] = array('graph' => $this->calcURI($g), 'named' => 0);
}
foreach ($ngs as $g) {
$ds[] = array('graph' => $this->calcURI($g), 'named' => 1);
}
$infos['query']['dataset'] = $ds;
}
/* infos result format */
if (($this->p('format') == 'infos') || ($this->p('output') == 'infos')) {
$infos['result_format'] = 'structure';
}
/* sql result format */
if (($this->p('format') == 'sql') || ($this->p('output') == 'sql')) {
$infos['result_format'] = 'sql';
}
return $infos;
}
/* */
function getResultFormat($formats, $default) {
$prefs = array();
/* arg */
if (($v = $this->p('format')) || ($v = $this->p('output'))) {
$prefs[] = $v;
}
/* accept header */
$vals = explode(',', $_SERVER['HTTP_ACCEPT']);
if ($vals) {
$o_vals = array();
foreach ($vals as $val) {
if (preg_match('/(rdf\+n3|x\-turtle|rdf\+xml|sparql\-results\+xml|sparql\-results\+json|json)/', $val, $m)) {
$o_vals[$m[1]] = 1;
if (preg_match('/\;q\=([0-9\.]+)/', $val, $sub_m)) {
$o_vals[$m[1]] = 1 * $sub_m[1];
}
}
}
arsort($o_vals);
foreach ($o_vals as $val => $prio) {
$prefs[] = $val;
}
}
/* default */
$prefs[] = $default;
foreach ($prefs as $pref) {
if (isset($formats[$pref])) {
return $formats[$pref];
}
}
}
/* SELECT */
function getSelectResultDoc($r) {
$formats = array(
'xml' => 'SPARQLXML', 'sparql-results+xml' => 'SPARQLXML',
'json' => 'SPARQLJSON', 'sparql-results+json' => 'SPARQLJSON',
'php_ser' => 'PHPSER', 'plain' => 'Plain',
'sql' => ($this->allow_sql ? 'Plain' : 'xSQL'),
'infos' => 'Plain',
'htmltab' => 'HTMLTable',
'tsv' => 'TSV',
);
if ($f = $this->getResultFormat($formats, 'xml')) {
$m = 'get' . $f . 'SelectResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getSPARQLXMLSelectResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+xml');
$vars = $r['result']['variables'];
$rows = $r['result']['rows'];
$dur = $r['query_time'];
$nl = "\n";
/* doc */
$r = '' .
'' .
$nl . '' .
'';
/* head */
$r .= $nl . ' ';
$r .= $nl . ' ';
if (is_array($vars)) {
foreach ($vars as $var) {
$r .= $nl . ' ';
}
}
$r .= $nl . ' ';
/* results */
$r .= $nl . ' ';
if (is_array($rows)) {
foreach ($rows as $row) {
$r .= $nl . ' ';
foreach ($vars as $var) {
if (isset($row[$var])) {
$r .= $nl . ' ';
if ($row[$var . ' type'] == 'uri') {
$r .= $nl . ' ' .htmlspecialchars($row[$var]). '';
}
elseif ($row[$var . ' type'] == 'bnode') {
$r .= $nl . ' ' .substr($row[$var], 2). '';
}
else {
$dt = isset($row[$var . ' datatype']) ? ' datatype="' .htmlspecialchars($row[$var . ' datatype']). '"' : '';
$lang = isset($row[$var . ' lang']) ? ' xml:lang="' .htmlspecialchars($row[$var . ' lang']). '"' : '';
$r .= $nl . ' ' .htmlspecialchars($row[$var]). '';
}
$r .= $nl . ' ';
}
}
$r .= $nl . ' ';
}
}
$r .= $nl . ' ';
/* /doc */
$r .= $nl . '';
return $r;
}
function getSPARQLJSONSelectResultDoc($r) {
$con = $this->getDBCon();
$this->setHeader('content-type', 'Content-Type: application/sparql-results+json');
$vars = $r['result']['variables'];
$rows = $r['result']['rows'];
$dur = $r['query_time'];
$nl = "\n";
/* doc */
$r = '{';
/* head */
$r .= $nl . ' "head": {';
$r .= $nl . ' "vars": [';
$first_var = 1;
foreach ($vars as $var) {
$r .= $first_var ? $nl : ',' . $nl;
$r .= ' "' .$var. '"';
$first_var = 0;
}
$r .= $nl . ' ]';
$r .= $nl . ' },';
/* results */
$r .= $nl . ' "results": {';
$r .= $nl . ' "bindings": [';
$first_row = 1;
foreach ($rows as $row) {
$r .= $first_row ? $nl : ',' . $nl;
$r .= ' {';
$first_var = 1;
foreach ($vars as $var) {
if (isset($row[$var])) {
$r .= $first_var ? $nl : ',' . $nl . $nl;
$r .= ' "' .$var. '": {';
if ($row[$var . ' type'] == 'uri') {
$r .= $nl . ' "type": "uri",';
$r .= $nl . ' "value": "' .mysqli_real_escape_string( $con, $row[$var]). '"';
}
elseif ($row[$var . ' type'] == 'bnode') {
$r .= $nl . ' "type": "bnode",';
$r .= $nl . ' "value": "' . substr($row[$var], 2) . '"';
}
else {
$dt = isset($row[$var . ' datatype']) ? ',' . $nl .' "datatype": "' .mysqli_real_escape_string( $con, $row[$var . ' datatype']). '"' : '';
$lang = isset($row[$var . ' lang']) ? ',' . $nl .' "xml:lang": "' .mysqli_real_escape_string( $con, $row[$var . ' lang']). '"' : '';
$type = $dt ? 'typed-literal' : 'literal';
$r .= $nl . ' "type": "' . $type . '",';
$r .= $nl . ' "value": "' . $this->jsonEscape($row[$var]) . '"';
$r .= $dt . $lang;
}
$r .= $nl . ' }';
$first_var = 0;
}
}
$r .= $nl . ' }';
$first_row = 0;
}
$r .= $nl . ' ]';
$r .= $nl . ' }';
/* /doc */
$r .= $nl . '}';
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERSelectResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainSelectResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
function getHTMLTableSelectResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/html; charset=utf-8');
$vars = $r['result']['variables'];
$rows = $r['result']['rows'];
$dur = $r['query_time'];
if ($this->p('show_inline')) return '' . $this->getHTMLTableRows($rows, $vars) . '
';
return '
' .$this->getHTMLDocHead() . '
' . $this->getHTMLTableRows($rows, $vars) . '
';
}
function getHTMLTableRows($rows, $vars) {
$r = '';
foreach ($rows as $row) {
$hr = '';
$rr = '';
foreach ($vars as $var) {
$hr .= $r ? '' : '' . htmlspecialchars($var) . ' | ';
$rr .= '' . @htmlspecialchars($row[$var]) . ' | ';
}
$r .= $hr ? '' . $hr . '
' : '';
$r .= '' . $rr . '
';
}
return $r ? $r : 'No results found';
}
function getTSVSelectResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain; charset=utf-8');
$vars = $r['result']['variables'];
$rows = $r['result']['rows'];
$dur = $r['query_time'];
return $this->getTSVRows($rows, $vars);
}
function getTSVRows($rows, $vars) {
$r = '';
$delim = "\t";
$esc_delim = "\\t";
foreach ($rows as $row) {
$hr = '';
$rr = '';
foreach ($vars as $var) {
$hr .= $r ? '' : ($hr ? $delim . $var : $var);
$val = isset($row[$var]) ? str_replace($delim, $esc_delim, $row[$var]) : '';
$rr .= $rr ? $delim . $val : $val;
}
$r .= $hr . "\n" . $rr;
}
return $r ? $r : 'No results found';
}
/* ASK */
function getAskResultDoc($r) {
$formats = array(
'xml' => 'SPARQLXML', 'sparql-results+xml' => 'SPARQLXML',
'json' => 'SPARQLJSON', 'sparql-results+json' => 'SPARQLJSON',
'plain' => 'Plain',
'php_ser' => 'PHPSER',
'sql' => ($this->allow_sql ? 'Plain' : 'xSQL'),
'infos' => 'Plain',
);
if ($f = $this->getResultFormat($formats, 'xml')) {
$m = 'get' . $f . 'AskResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getSPARQLXMLAskResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+xml');
$r_val = $r['result'] ? 'true' : 'false';
$dur = $r['query_time'];
$nl = "\n";
return '' .
'' .
$nl . '' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .$r_val. '' .
$nl . '' .
'';
}
function getSPARQLJSONAskResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+json');
$r_val = $r['result'] ? 'true' : 'false';
$dur = $r['query_time'];
$nl = "\n";
$r = '' .
$nl . '{' .
$nl . ' "head": {' .
$nl . ' },' .
$nl . ' "boolean" : ' . $r_val .
$nl . '}' .
'';
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERAskResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainAskResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return $r['result'] ? 'true' : 'false';
}
/* CONSTRUCT */
function getConstructResultDoc($r) {
$formats = array(
'rdfxml' => 'RDFXML', 'rdf+xml' => 'RDFXML',
'json' => 'RDFJSON', 'rdf+json' => 'RDFJSON',
'turtle' => 'Turtle', 'x-turtle' => 'Turtle', 'rdf+n3' => 'Turtle',
'php_ser' => 'PHPSER',
'sql' => ($this->allow_sql ? 'Plain' : 'xSQL'),
'infos' => 'Plain',
);
if ($f = $this->getResultFormat($formats, 'rdfxml')) {
$m = 'get' . $f . 'ConstructResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getRDFXMLConstructResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/rdf+xml');
$index = $r['result'];
$ser = ARC2::getRDFXMLSerializer($this->a);
$dur = $r['query_time'];
return $ser->getSerializedIndex($index) . "\n" . '';
}
function getTurtleConstructResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/x-turtle');
$index = $r['result'];
$ser = ARC2::getTurtleSerializer($this->a);
$dur = $r['query_time'];
return '# query time: ' . $dur . "\n" . $ser->getSerializedIndex($index);
}
function getRDFJSONConstructResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/json');
$index = $r['result'];
$ser = ARC2::getRDFJSONSerializer($this->a);
$dur = $r['query_time'];
$r = $ser->getSerializedIndex($index);
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERConstructResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainConstructResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
/* DESCRIBE */
function getDescribeResultDoc($r) {
$formats = array(
'rdfxml' => 'RDFXML', 'rdf+xml' => 'RDFXML',
'json' => 'RDFJSON', 'rdf+json' => 'RDFJSON',
'turtle' => 'Turtle', 'x-turtle' => 'Turtle', 'rdf+n3' => 'Turtle',
'php_ser' => 'PHPSER',
'sql' => ($this->allow_sql ? 'Plain' : 'xSQL'),
'infos' => 'Plain'
);
if ($f = $this->getResultFormat($formats, 'rdfxml')) {
$m = 'get' . $f . 'DescribeResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getRDFXMLDescribeResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/rdf+xml');
$index = $r['result'];
$ser = ARC2::getRDFXMLSerializer($this->a);
$dur = $r['query_time'];
return $ser->getSerializedIndex($index) . "\n" . '';
}
function getTurtleDescribeResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/x-turtle');
$index = $r['result'];
$ser = ARC2::getTurtleSerializer($this->a);
$dur = $r['query_time'];
return '# query time: ' . $dur . "\n" . $ser->getSerializedIndex($index);
}
function getRDFJSONDescribeResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/json');
$index = $r['result'];
$ser = ARC2::getRDFJSONSerializer($this->a);
$dur = $r['query_time'];
$r = $ser->getSerializedIndex($index);
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERDescribeResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainDescribeResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
/* DUMP */
function getDumpResultDoc() {
$this->headers = array();
return '';
}
/* LOAD */
function getLoadResultDoc($r) {
$formats = array(
'xml' => 'SPARQLXML', 'sparql-results+xml' => 'SPARQLXML',
'json' => 'SPARQLJSON', 'sparql-results+json' => 'SPARQLJSON',
'plain' => 'Plain',
'php_ser' => 'PHPSER',
'sql' => ($this->allow_sql ? 'Plain' : 'xSQL'),
'infos' => 'Plain',
);
if ($f = $this->getResultFormat($formats, 'xml')) {
$m = 'get' . $f . 'LoadResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getSPARQLXMLLoadResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+xml');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
return '' .
'' .
$nl . '' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .$r_val. '' .
$nl . '' .
'';
}
function getSPARQLJSONLoadResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+json');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
$r = '' .
$nl . '{' .
$nl . ' "head": {' .
$nl . ' },' .
$nl . ' "inserted" : ' . $r_val .
$nl . '}' .
'';
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERLoadResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainLoadResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
/* DELETE */
function getDeleteResultDoc($r) {
$formats = array(
'xml' => 'SPARQLXML', 'sparql-results+xml' => 'SPARQLXML',
'json' => 'SPARQLJSON', 'sparql-results+json' => 'SPARQLJSON',
'plain' => 'Plain',
'php_ser' => 'PHPSER'
);
if ($f = $this->getResultFormat($formats, 'xml')) {
$m = 'get' . $f . 'DeleteResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getSPARQLXMLDeleteResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+xml');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
return '' .
'' .
$nl . '' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .$r_val. '' .
$nl . '' .
'';
}
function getSPARQLJSONDeleteResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+json');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
$r = '' .
$nl . '{' .
$nl . ' "head": {' .
$nl . ' },' .
$nl . ' "deleted" : ' . $r_val .
$nl . '}' .
'';
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERDeleteResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainDeleteResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
/* INSERT */
function getInsertResultDoc($r) {
$formats = array(
'xml' => 'SPARQLXML', 'sparql-results+xml' => 'SPARQLXML',
'json' => 'SPARQLJSON', 'sparql-results+json' => 'SPARQLJSON',
'plain' => 'Plain',
'php_ser' => 'PHPSER'
);
if ($f = $this->getResultFormat($formats, 'xml')) {
$m = 'get' . $f . 'InsertResultDoc';
return method_exists($this, $m) ? $this->$m($r) : 'not implemented';
}
return '';
}
function getSPARQLXMLInsertResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+xml');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
return '' .
'' .
$nl . '' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .
$nl . ' ' .$r_val. '' .
$nl . '' .
'';
}
function getSPARQLJSONInsertResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: application/sparql-results+json');
$r_val = $r['result']['t_count'];
$dur = $r['query_time'];
$nl = "\n";
$r = '' .
$nl . '{' .
$nl . ' "head": {' .
$nl . ' },' .
$nl . ' "inserted" : ' . $r_val .
$nl . '}' .
'';
if (($v = $this->p('jsonp')) || ($v = $this->p('callback'))) {
$r = $v . '(' . $r . ')';
}
return $r;
}
function getPHPSERInsertResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return serialize($r);
}
function getPlainInsertResultDoc($r) {
$this->setHeader('content-type', 'Content-Type: text/plain');
return print_r($r['result'], 1);
}
/* */
function jsonEscape($v) {
if (function_exists('json_encode')) return trim(json_encode($v), '"');
$from = array("\\", "\r", "\t", "\n", '"', "\b", "\f", "/");
$to = array('\\\\', '\r', '\t', '\n', '\"', '\b', '\f', '\/');
return str_replace($from, $to, $v);
}
/* */
function getHTMLFormDoc() {
return '
' . $this->getHTMLDocHead() . '
' . $this->getHTMLDocBody() . '
';
}
function getHTMLDocHead() {
return '
' . $this->getHTMLDocTitle() . '
';
}
function getHTMLDocTitle() {
return $this->v('endpoint_title', 'ARC SPARQL+ Endpoint', $this->a);
}
function getHTMLDocHeading() {
return $this->v('endpoint_heading', 'ARC SPARQL+ Endpoint (v' . ARC2::getVersion() . ')', $this->a);
}
function getHTMLDocCSS() {
$default = '
body {
font-size: 14px;
font-family: Trebuchet MS, Verdana, Geneva, sans-serif;
background: #fff url(?img=bg_body) top center repeat-x;
padding: 5px 20px 20px 20px;
color: #666;
}
h1 { font-size: 1.6em; font-weight: normal; }
a { color: #c00000; }
th, td {
border: 1px dotted #eee;
padding: 2px 4px;
}
#sparql-form {
margin-bottom: 30px;
}
#query {
float: left;
width: 60%;
display: block;
height: 265px;
margin-bottom: 10px;
}
.options {
float: right;
font-size: 0.9em;
width: 35%;
border-top: 1px solid #ccc;
}
.options h3 {
margin: 5px;
}
.options dl{
margin: 0px;
padding: 0px 10px 5px 20px;
}
.options dl dt {
border-top: 1px dotted #ddd;
padding-top: 10px;
}
.options dl dt.first {
border: none;
}
.options dl dd {
padding: 5px 0px 7px 0px;
}
.options-2 {
clear: both;
margin: 10px 0px;
}
.form-buttons {
}
.results {
border: 1px solid #eee;
padding: 5px;
background-color: #fcfcfc;
}
';
return $this->v('endpoint_css', $default, $this->a);
}
function getHTMLDocBody() {
return '
' . $this->getHTMLDocHeading() . '
This interface implements
SPARQL and
SPARQL+ via HTTP Bindings.
Enabled operations: ' . join(', ', $this->getFeatures()) . '
Max. number of results : ' . $this->v('endpoint_max_limit', 'unrestricted', $this->a) . '
' . $this->getHTMLDocForm() .'
' . ($this->p('show_inline') ? $this->query_result : '') . '
';
}
function getHTMLDocForm() {
$q = $this->p('query') ? htmlspecialchars($this->p('query')) : "SELECT * WHERE {\n GRAPH ?g { ?s ?p ?o . }\n}\nLIMIT 10";
return '
';
}
function getHTMLDocOptions() {
$sel = $this->p('output');
$sel_code = ' selected="selected"';
return '
';
}
/* */
}