Beispiel #1
0
 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);
     }
 }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
 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);
     }
 }
Beispiel #4
0
 function get($args)
 {
     $this->validate($args);
     return vars::apply_assoc($this->expression, $args, true);
 }
Beispiel #5
0
 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;
 }