From 0856957b9341609bfe114b33548cdd2f4609cba6 Mon Sep 17 00:00:00 2001 From: sebd <> Date: Fri, 13 May 2005 15:22:34 +0000 Subject: [PATCH] my xquery / xpath2 expression gets evaluated. --- src/modules/dbxmldatabases.py | 30 ++++++++++++++++++++++++++++++ vhosts/dbxmltest/xquery.xml | 10 ++++++++++ 2 files changed, 40 insertions(+) create mode 100644 vhosts/dbxmltest/xquery.xml diff --git a/src/modules/dbxmldatabases.py b/src/modules/dbxmldatabases.py index 1666b19..37adcb2 100644 --- a/src/modules/dbxmldatabases.py +++ b/src/modules/dbxmldatabases.py @@ -34,10 +34,13 @@ import bsddb3.db as db import dbxml import libxml2 +import expression.core.elements as elements import expression.core.environs as environs import expression.core.dataholders as dataholders import expression.core.html as html import expression.core.logs as logs +import expression.core.namespaces as namespaces +import expression.core.things as things import expression.modules.dbxmlcontainers as dbxmlcontainers @@ -84,6 +87,33 @@ class DbXmlDatabase(dataholders.DataHolder): return super(DbXmlDatabase, self).walkToItem(uriPathFragments, command, instruction) +class XQuery(things.Thing): + """ Element xquery contains an XQuery expression to be evaluated. + """ + def generateXml(self, layout): + """ Appends "layout" with the result of this query + """ + manager = DbXmlDatabase._manager + queryContext = manager.createQueryContext() + try: + results = manager.query(self.node.content, queryContext) + except RuntimeError, e: + logs.error("Error in query: %s" % e) + layout.append(html.p(_("Error in query: %s") % e)) + else: + output = "\n".join([value.asString() for value in results]) + try: + doc = libxml2.readDoc(output, None, None, 0) + except libxml2.treeError: + # output is not an XML document, considering it as plain text + layout.append(html.html(html.body(html.pre(output)))) + else: + layout.append(doc.getRootElement()) + return True + +elements.registerElement(namespaces.yep.uri, "xquery", XQuery) + + def __init__(): """ Opens a Berkeley DB environment and an XmlManager around it. Then opens all configured containers. diff --git a/vhosts/dbxmltest/xquery.xml b/vhosts/dbxmltest/xquery.xml new file mode 100644 index 0000000..b2a9db8 --- /dev/null +++ b/vhosts/dbxmltest/xquery.xml @@ -0,0 +1,10 @@ + + + + +

+ collection("test.dbxml")//*/text() +

+ + +