function query($name, $args, $document) { $procedure = $this->get($name, $args); if ($permission = $procedure->permission()) { $this->access->query(vars::apply_assoc($permission, $args, true)) or runtime_error('Procedure ' . $name . ' doesn\'t meet permission ' . $permission); } if ($procedure->cache()) { $mangled = procedure::mangle_values($name, $args); if (!isset($this->cache[$mangled])) { $this->cache[$mangled] = $procedure->query($args, $document); } return $this->cache[$mangled]; } else { return $procedure->query($args, $document); } }
function query($args, $document) { $this->validate($args); $xml = new xml(); $get = []; foreach ($this->get as $name => $value) { $get[$name] = vars::apply_assoc($value, $args); } switch ($this->method) { case 'get': return self::to_xml(http::get($this->url, $get, $this->datasource['username'], $this->datasource['password'])); case 'post': $post = []; foreach ($this->post as $name => $value) { $post[$name] = vars::apply_assoc($value, $args); } return self::to_xml(http::post($this->url, $post, $get, $this->datasource['username'], $this->datasource['password'])); default: runtime_error('Unknown HTTP procedure method: ' . $this->method); } }
private function replace_www($template, $document, $args = array()) { foreach ($document->query('//www:*') as $node) { $nested = null; switch ($node->name()) { case 'www:template': $nested = $this->render_template($template->get($node['@name'])); break; case 'www:xslt': $args = $node->attribute('args'); if ($node->attribute('cache') !== 'true') { $nested = $this->render_xslt($template, $node['@xsl'], $node['@xml'], $args ? args::decode($args) : array()); } else { $cache_args = $node->attribute('cache-args') ? $node->attribute('cache-args') : array(); $cache_lifetime = $node->attribute('cache-lifetime'); is_null($cache_lifetime) or is_numeric($cache_lifetime) or runtime_error('Cache lifetime should be numeric: ' . $cache_lifetime); $cache_args = args::decode($cache_args); $filename = cache_location . md5($node['@xsl'] . $node['@xml'] . ($args ? $args : '')) . '.xml'; if (!fs::exists($filename) || $cache_lifetime && $cache_lifetime > time() - fs::modification($filename)) { fs::write($filename, $this->render_xslt($template, $node['@xsl'], $node['@xml'], $args ? args::decode($args) : array())->render(false)); } $fragment = fs::checked_read($filename); if (!empty($cache_args)) { $fragment = vars::apply_assoc($fragment, $cache_args); } $nested = $document->fragment($fragment); } break; case 'www:xquery': require_once www_root . 'thirdparty/xquerylite/class_xquery_lite.php'; $xq = new XqueryLite(); $fragment = $xq->evaluate_xqueryl(fs::checked_read($node['@src'])); $nested = $document->fragment($fragment); break; case 'www:style': $src = $node['@src']; $nested = $document->element('link'); $nested['@rel'] = 'stylesheet'; $nested['@href'] = $src . '?' . fs::crc32($src); break; case 'www:script': $src = $node['@src']; $nested = $document->element('script', ''); $nested['@type'] = 'text/javascript'; $nested['@src'] = $src . '?' . fs::crc32($src); break; case 'www:img': $src = $node['@src']; $nested = $document->element('img'); $nested['@src'] = $src . '?' . crc32(fs::modification($src)); foreach ($node->attributes() as $name => $value) { if ($name != 'src') { $nested['@' . $name] = $value; } } break; case 'www:bbcode': $allow = $node->attribute('allow'); $deny = $node->attribute('deny'); $nested = bbcode::parse($node, $allow ? preg_split('/, */', $allow) : null, $deny ? preg_split('/, */', $deny) : null); break; default: runtime_error('Unknown extension element: ' . $node->name()); } self::replace_node($document, $node, $nested); } }
function get($args) { $this->validate($args); return vars::apply_assoc($this->expression, $args, true); }
function query($args, $document) { $this->validate($args); $xml = new xml(); $solr = $this->datasource->get($this->core); switch ($this->method) { case 'add': !empty($args) or runtime_error('Solr add method should accept parameters'); if (is_array(reset($args))) { $docs = array(); foreach (reset($args) as $document) { $doc = new SolrInputDocument(); foreach ($document as $name => $value) { if (is_array($value)) { foreach ($value as $element) { $doc->addField($name, $element); } } else { $doc->addField($name, $value); } } $docs[] = $doc; } $solr->addDocuments($docs); } else { $doc = new SolrInputDocument(); foreach ($args as $name => $value) { $doc->addField($name, $value); } $solr->addDocument($doc); } $solr->request("<commit/>"); break; case 'delete': $solr->deleteByQuery(vars::apply_assoc($this->body, $args)); $solr->request("<commit/>"); break; case 'query': $root = $xml->element($this->root[0]); $xml->append($root); $query = new SolrQuery(vars::apply_assoc($this->body, $args)); foreach ($this->order_by as $name => $order) { $query->addSortField($name, $order == 'desc' ? SolrQuery::ORDER_DESC : SolrQuery::ORDER_ASC); } if (!is_null($this->offset)) { $query->setStart(vars::apply_assoc($this->offset, $args)); } is_null($this->count) or $query->setRows(vars::apply_assoc($this->count, $args)); $response = $solr->query($query); $object = $response->getResponse(); if (is_array($object['response']['docs'])) { $root['@matched'] = $object['response']['numFound']; foreach ($object['response']['docs'] as $doc) { $item = $xml->element($this->item[0]); $root->append($item); foreach ($doc as $name => $value) { if (is_array($value)) { $array = $xml->element($name); $item->append($array); foreach ($value as $element) { $element = $xml->element('element', $element); $array->append($element); } } else { $node = $this->transform($xml, $name, $value); $item->append($node); } } } } else { $this->empty or runtime_error('Procedure returned an empty result: ' . $this->mangled()); } break; default: runtime_error('Unknown Solr method: ' . $this->method); } return $xml; }