#!/usr/bin/env python
# As of Python 2.3, there is a built-in module for Berkeley DB,
# called bsddb. The next uncommented line assumes that module is being used.
# Note the use of XmlException. There are, as of BDB XML 2.3, a number
# of exception classes derived from XmlException. See them defined
# in README.exceptions in dbxml/src/python.
#
from bsddb3.db import *
from dbxml import *
book_content = r"Knowledge Discovery in Databases."
book_content_ns = r"Knowledge Discovery in Databases."
book_name = r"book1"
book_name_ns = r"book1_ns"
def remove_database():
"""Removes the databases so we can start with a fresh environment for
each test."""
import os, glob
databases = ["test", "test1", "test2"]
for database in databases:
files = glob.glob(database + "*.dbxml")
files += glob.glob("__db*")
files += glob.glob("log.*")
for file in files:
os.remove(file)
def example01():
"""Create an XmlManager/XmlContainer, add a document, get the document,
display the content of the document.
>>> remove_database()
>>> example01()
book1 = Knowledge Discovery in Databases.
"""
mgr = XmlManager()
uc = mgr.createUpdateContext()
try:
container = mgr.createContainer("test.dbxml")
container.putDocument(book_name, book_content, uc)
document = container.getDocument(book_name)
s = document.getContent()
print document.getName(), "=", s
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example02():
"""Create an XmlManager/XmlContainer, add a document, query the container
for the document, iterate over the result set displaying the
values returned.
>>> remove_database()
>>> example02()
book1 = Knowledge Discovery in Databases.
"""
mgr = XmlManager()
uc = mgr.createUpdateContext()
try:
container = mgr.createContainer("test.dbxml")
container.putDocument(book_name, book_content, uc)
qc = mgr.createQueryContext()
results = mgr.query("collection('test.dbxml')/book", qc)
results.reset()
for value in results:
document = value.asDocument()
print document.getName(), "=", value.asString()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example03():
"""Create an XmlContainer, add a document that includes a
namespace definition, create a query context, define a
namespace prefix to URI mapping, query the container
for the document within a context, iterate over the
result set displaying the values returned.
>>> remove_database()
>>> example03()
book1_ns = Knowledge Discovery in Databases.
"""
mgr = XmlManager()
uc = mgr.createUpdateContext()
try:
container = mgr.createContainer("test.dbxml")
container.putDocument(book_name_ns, book_content_ns, uc)
qc = mgr.createQueryContext()
qc.setNamespace("books2", "http://foo.bar.com/books.dtd")
results = mgr.query("collection('test.dbxml')/*[books2:title='Knowledge Discovery in Databases.']", qc)
results.reset()
for value in results:
document = value.asDocument()
print document.getName(), "=", value.asString()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example04():
"""Create an XmlContainer, define an equality string index
for booktitle elements, add a document, query the container
for the document, iterate over the result set displaying
the values returned.
Note that this example assumes that the 'test' container
does not already exist. If it does exist then the
addIndex method will throw an exception to complain
that the container isn't empty.
Python note: This exception is not passed on to Python, which
will abort the interpreter.
>>> remove_database()
>>> example04()
book1 = Knowledge Discovery in Databases.
"""
mgr = XmlManager()
uc = mgr.createUpdateContext()
try:
container = mgr.createContainer("test.dbxml")
container.addIndex("", "title", "node-element-equality-string", uc)
container.putDocument(book_name, book_content, uc)
qc = mgr.createQueryContext()
results = mgr.query("collection('test.dbxml')//*[title='Knowledge Discovery in Databases.']", qc)
for value in results:
document = value.asDocument()
print document.getName(), "=", value.asString()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example05():
"""
Create an XmlContainer, define an equality string index
for booktitle elements, add a document, create a query
context, define a variable binding, query the container
for the document within a context referencing the variable
defined, iterate over the result set displaying the values
returned.
Note that this example assumes that the 'test' container
does not already exist. If it does exist then the
addIndex method will throw an exception to complain
that the container isn't empty.
Python note: This exception is not passed on to Python, which
will abort the interpreter.
>>> remove_database()
>>> example05()
book1 = Knowledge Discovery in Databases.
"""
mgr = XmlManager()
uc = mgr.createUpdateContext()
try:
container = mgr.createContainer("test.dbxml")
container.addIndex("", "title", "node-element-equality-string", uc)
container.putDocument(book_name, book_content, uc)
qc = mgr.createQueryContext()
results = mgr.query("collection('test.dbxml')//*[title='Knowledge Discovery in Databases.']", qc)
qc.setVariableValue("title", XmlValue("Knowledge Discovery in Databases."))
results = mgr.query("collection('test.dbxml')//*[title=$title]", qc)
for value in results:
document = value.asDocument()
print document.getName(), "=", value.asString()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example06():
"""Create an XML Container, rename that container, delete the
container, and repeat.
>>> remove_database()
>>> example06()
"""
mgr = XmlManager()
try:
for i in range(2):
container = mgr.createContainer("test1.dbxml")
del container
mgr.renameContainer("test1.dbxml", "test2.dbxml")
container = mgr.openContainer("test2.dbxml")
del container
mgr.removeContainer("test2.dbxml")
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
def example07():
"""Create an use a transactional XML Container:
add a document, get the document, display the content of
the document. Requires using DBEnv.
>>> remove_database()
>>> example07()
book1 = Knowledge Discovery in Databases.
"""
environment = DBEnv()
environment.open(None, DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN, 0)
try:
mgr = XmlManager(environment, 0)
uc = mgr.createUpdateContext()
container = mgr.createContainer("test.dbxml", DBXML_TRANSACTIONAL)
xtxn = mgr.createTransaction()
container.putDocument(xtxn, book_name, book_content, uc)
xtxn.commit()
document = container.getDocument(book_name)
s = document.getContent()
print document.getName(), "=", s
del uc
del document
del container
#container.close()
mgr.removeContainer("test.dbxml")
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
environment.close(0)
def example08():
"""Create an XML Container within a Berkeley DB environment,
add a document, get the document, display the content of
the document.
>>> remove_database()
>>> example08()
book1 = Knowledge Discovery in Databases.
"""
environment = DBEnv()
environment.open(None, DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN, 0)
try:
mgr = XmlManager(environment, 0)
uc = mgr.createUpdateContext()
container = mgr.createContainer("test.dbxml")
container.putDocument(book_name, book_content, uc)
document = container.getDocument(book_name)
s = document.getContent()
print document.getName(), "=", s
del uc
del document
del container
mgr.removeContainer("test.dbxml")
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
environment.close(0)
def example09():
"""Create an XML Container within a Berkeley DB environment,
then within a Berkeley DB transaction, add a document,
get the document, display the content of the document.
Use a Berkeley DB transaction
>>> remove_database()
>>> example09()
book1 = Knowledge Discovery in Databases.
"""
environment = DBEnv()
environment.open(None, DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN, 0)
try:
mgr = XmlManager(environment, 0)
uc = mgr.createUpdateContext()
container = mgr.createContainer("test.dbxml", DBXML_TRANSACTIONAL)
xtxn = mgr.createTransaction();
document = mgr.createDocument()
document.setContent(book_content)
document.setName(book_name)
container.putDocument(xtxn, document, uc)
document = container.getDocument(xtxn, book_name)
s = document.getContent()
print document.getName(), "=", s
xtxn.commit()
del document # holds ref on container
del container # prevents removal
del uc
mgr.removeContainer("test.dbxml")
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
environment.close(0)
def example10():
""" Create two XML Containers within a Berkeley DB environment,
then within a Berkeley DB transaction add a document to
each container.
>>> remove_database()
>>> example10()
"""
environment = DBEnv()
environment.open(None, DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN, 0)
try:
mgr = XmlManager(environment, 0)
uc = mgr.createUpdateContext()
txn = environment.txn_begin()
xtxn = mgr.createTransaction(txn)
container1 = mgr.createContainer(xtxn, "test.dbxml")
container2 = mgr.createContainer(xtxn, "test2.dbxml")
container1.putDocument(xtxn, book_name, book_content, uc)
container2.putDocument(xtxn, book_name, book_content, uc)
txn.commit(0)
del uc
del container1
del container2
del mgr
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
environment.close(0)
def example11():
"""Demonstrate the definition of an index, and the iteration over set set
of indexes specified
>>> remove_database()
>>> example11()
Indexes present:
http://www.sleepycat.com/2002/dbxml:name unique-node-metadata-equality-string
:title node-element-equality-date edge-element-equality-string
"""
mgr = XmlManager()
try:
container = mgr.createContainer("test.dbxml")
uc = mgr.createUpdateContext()
""" addIndex uri, name, indexType updateContext"""
# the following (commented) addIndex call is equivalent to the
# 2 that follow it.
#container.addIndex("", "title", "node-element-equality-date, edge-element-equality-string", uc)
container.addIndex("", "title", XmlIndexSpecification.NODE_ELEMENT|
XmlIndexSpecification.PATH_NODE|
XmlIndexSpecification.KEY_EQUALITY, XmlValue.DATE, uc)
container.addIndex("", "title", XmlIndexSpecification.NODE_ELEMENT|
XmlIndexSpecification.PATH_EDGE|
XmlIndexSpecification.KEY_EQUALITY, XmlValue.STRING, uc)
# this is another way to add indexes..
# ispec = container.getIndexSpecification()
# ispec.addIndex("", "title", XmlIndexSpecification.NODE_ELEMENT|
# XmlIndexSpecification.PATH_NODE|XmlIndexSpecification.KEY_EQUALITY,
# XmlValue.DATE);
# container.setIndexSpecification(ispec, uc)
n = 0
print "Indexes present:"
for index in container.getIndexSpecification():
print " %s:%s %s" % (index.get_uri(), index.get_name(), index.get_index())
container.putDocument("foo", "
1957-11-03", uc)
qc = mgr.createQueryContext()
val = XmlValue(XmlValue.DATE, "1957-11-03")
res = container.lookupIndex(qc, "", "title", "node-element-equality-date",
val)
# Shows how to look at a query plan
#print res.size()
#qe = mgr.prepare("collection('test.dbxml')/title[.>> remove_database()
>>> example12()
document: content's got " dquot
"""
content = r"content's got " dquot"
mgr = XmlManager()
uc = mgr.createUpdateContext()
mgr.setDefaultContainerType(XmlContainer.WholedocContainer)
try:
container = mgr.createContainer("test.dbxml")
container.putDocument(book_name, content, uc)
doc = container.getDocument(book_name)
print "document: ", doc.getContent()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
# Test example of an overloade XmlResolver instance in Python
# Used in example 13
class myResolver(XmlResolver):
def __init__(self):
XmlResolver.__init__(self)
print "XmlResolver constructor"
def resolveDocument(self, txn, mgr, uri, result):
print "In resolveDocument, uri: %s" % (uri)
content=r"yyz"
doc = mgr.createDocument()
doc.setContent(content)
newval = XmlValue(doc)
result.setValue(result, newval)
return 1
def resolveCollection(self, txn, mgr, uri, result):
print "In resolveCollection, uri: %s" % (uri)
return 0
def resolveSchema(self, txn, mgr, location, nameSpace):
print "In resolveSchema, location: %s" % (location)
return 0
def resolveEntity(self, txn, mgr, systemId, publicId):
print "In resolveEntity, systemId: %s" % (systemId)
dtd =r""
dlen = len(dtd)
istr = mgr.createMemBufInputStream(dtd, dlen, "dtd")
return istr
def __del__(self):
XmlResolver.__del__(self)
def example13():
"""Example of creating an XmlResolver instance in Python
>>> remove_database()
>>> example13()
XmlResolver constructor
In resolveEntity, systemId: mydtd.dtd
In resolveDocument, uri: myscheme:/docname
value of result: yyz
"""
resolver = myResolver()
try:
mgr = XmlManager(DBXML_ALLOW_EXTERNAL_ACCESS)
mgr.registerResolver(resolver)
uc = mgr.createUpdateContext()
container = mgr.createContainer("test.dbxml", DBXML_ALLOW_VALIDATION,
XmlContainer.NodeContainer)
container.putDocument("foo0", r"yyz", uc);
container.putDocument("foo", "", uc);
container.putDocument(book_name, book_content, uc)
# query to test the resolver
qc = mgr.createQueryContext()
qc.setBaseURI("myscheme:/")
results = mgr.query("doc('docname')/root/a", qc)
for value in results:
document = value.asDocument()
print "value of result: ", value.asString()
except XmlException, inst:
print "XmlException (", inst.exceptionCode,"): ", inst.what
if inst.exceptionCode == DATABASE_ERROR:
print "Database error code:",inst.dbError
NUMBER_OF_EXAMPLES = 13
def do_example(number):
print "Running example %d." % number
globals()["example%02d" % number]()
if __name__ == "__main__":
import sys
number = sys.argv[-1]
if number == "test":
import doctest, examples
doctest.testmod(examples)
sys.exit()
try:
number = int(number)
except ValueError:
print "Usage: ./examples.py |test"
sys.exit()
if number < 1 or number > NUMBER_OF_EXAMPLES:
print "Usage: ./examples.py |test"
print "Example number out of range (1-%d)" % NUMBER_OF_EXAMPLES
sys.exit()
remove_database()
do_example(number)