ODB (a.k.a. "spugdb" due to a name clash on code.google.com) is a
pure-python key-value style database system. It supports nested transactions,
object schemas, cursors and a simple, X-Path like query language.

ODB is a good fit for situations where you have relatively small storage
requirements, low throughput and need a lightweight pure-python database. In
simple benchmarking scenarios on modern CPUs and local filesystems, it can
handle on the order of 1000 general operations per second, or 300 insertions per
seecond. Tables larger than 100 megabytes have not been tested.

ODB started out as a front-end to BDB (Berkeley DB). After the author
encountered problems with BDB, two additional pure-python storage engines were
written. At this time, the primary interface has been rewritten and the older
BDB-style interface (while still available) is deprecated.

At this point, ODB is fairly mature. It is being used in a number of
projects (several personal projects by the author and two systems at Google).

Fixed several cases where a b-tree wasn't demand loading a node before
performing some action on it.

Differentiated between a key of None and an empty key (""), allowing empty
keys to be used.

Fixed the use of the key's reference count (it wasn't getting incremented
when the key was reused)

When replacing a node, the original node wasn't getting marked deleted.
Fixed this.

The full back-end wasn't building the dictionary of all of the tables during
initialization, causing exceptions while processing the transaction log if the
last log didn't also create the table. Fixed this.

Added numerous test cases to exercise all of these fixes, including an
"update" action in the test of 1000 random actions.