[ZODB-Dev] ZODB tools for possible contribution
Greg Ward
gward@mems-exchange.org
Thu, 16 Aug 2001 14:10:39 -0400
Hi all --
in the course of using and learning about ZODB and ZEO over the past
year or so, we have written a handful of useful and nifty tools that I
think could be useful to everyone using ZODB. Andrew thinks so too,
which is why you'll find out-of-date versions of some of them in the
contrib/ directory of his SourceForge "zodb' project. Perhaps the right
thing to do is add these to StandaloneZODB... assuming, that is, that
StandaloneZODB is poised to take over from Andrew's SF project. Jeremy,
Andrew, any opinions on that?
Anyways, here are the tools we have:
class ObjectDatabase:
* wrapper around the ZODB database/storage/connection troika
* "owner" of the database root object (which for us is a
PersistentMapping of a handful of one-below-the-root-objects,
which we refer to as "database roots")
* knows how to open a ZODB in various formats (currently only
FileStorage and ClientStorage, but adding more storages just
requires adding more '_init_foo()' methods)
* the storage type and location (eg. filename or (host, port)) is
determined by an environment variable, because we have lots of
little scripts that access the database, and we don't want to
have to write the same command-line parsing code for every
one of them
* keeps a list of database roots and the classes that implement them,
so if you ask for (eg.) the "user_db" database root, it digs up
the UserDatabase instance from the dictionary or instantiates
UserDatabase, puts the new root in the database, and returns it
* to use it, you subclass and define the _database_roots class
attribute -- list of (root_name, root_class) pairs
class PersistentList:
* the obvious analog to PersistentMapping -- it's just a list-like
object that sets _p_changed when the list is updated
* already included in Andrew's zodb project, just needs to be
added to the zope.org CVS
isinstance(), issubclass()
* implementations of these built-ins that work with ExtensionClass
with Python < 2.1
* these will probably be released with Oscar, a type-checking system
I wrote last winter, one of these weeks
pack_zodb script:
* open a FileStorage and pack it
* somewhere, we have code that packs a ClientStorage synchronously --
ie. it idle-loops until the ".old" file appears, at which point
the pack is presumably completed. This could/should be folded
into this script.
zodb_iterate module/script:
* provides an interface to iterate over every OID in a ZODB, calling
a callback function for each one that has an object behind it
* also provides some functions for manipulating OIDs: pack/unpack/
format/parse (these probably belong elsewhere, but they live
in zodb_iterate for now)
* when run as a script, iterates over a database and prints the
OID and repr() of every object, in order by OID
zodb_census script:
* uses zodb_iterate to count the number of instances of every class
in the database
* has been posted to this list before
zodb_index script/module:
* tool to build/query low-level indeces of a ZODB
* current builds 3:
- OID -> list of OIDs referenced by it
- OID -> list of OIDs that reference it
- class_name -> list of OIDs of instances of that class
* can do simple reference queries ("show me the list of all objects
that reference object 0000000000040fa1") or recursive ("show me
the list of all objects referenced by 000000000040fa1, and all
objects referenced from them, etc. ad infinitum")
* eg. to list all objects reachable from the root:
zodb_index.py -fR 0
(-f = forward refs, -R = recursive, 0 = OID of the root)
* can be used as a module -- provides an API to open and query the
indeces
* indeces are stored in a separate Berkeley DB file (which can get
big -- our 45 MB database has a 20 MB index)
Do any of these tools sound useful to you? Do you think they should be
part of StandaloneZODB? Turning them into something publicly releasable
would be several days of work; if there's interest, I'd like to get
these tools out into the wider world.
Greg
--
Greg Ward - software developer gward@mems-exchange.org
MEMS Exchange http://www.mems-exchange.org