[Zope-dev] AdaptableStorage status update
Shane Hathaway
shane@zope.com
Tue, 10 Dec 2002 19:02:52 -0500
I've been holding off status updates on the AdaptableStorage project
until I could say I'm confident that the approach will work and it's
easy enough to write your own serialization components. After numerous
refactorings, I'm pleased to say that it actually works and does
everything I hoped!
AdaptableStorage lets you store ZODB objects in your own database and in
your format, *without* using special content classes. You can use a
filesystem directory, a relational database, or whatever kind of
database you might have as a ZODB.
This is very different from all previous solutions. LocalFS, ExtFile,
CMF directory views, and other similar products require you to use
special content classes that store themselves outside the ZODB.
OracleStorage and CVSFile store all objects as pickles. Other solutions
have similar issues. AdaptableStorage, however, reuses as much of ZODB
as possible to achieve orthogonal persistence to arbitrary databases and
formats.
This is only a status report, not an announcement that it's finished, so
the documentation is not done yet. But there are interfaces, unit
tests, and a basic diagram. You can use DBTab to mount an
AdaptableStorage instance. As a test, I have successfully used
AdaptableStorage to create a CMF site on both the filesystem and in a
Postgres database.
Here's a way to get a preview. (It may not work in MS Windows yet.)
Get a very recent version of Zope 2.6 (or perhaps even the HEAD). Then
check out AdaptableStorage and DBTab from CVS:
cvs -d :pserver:anonymous@cvs.zope.org:/cvs-repository co
Products/AdaptableStorage
cvs -d :pserver:anonymous@cvs.zope.org:/cvs-repository co Products/DBTab
Move the two products to the Products directory of your Zope instance.
Create a dbtab.conf file in your <Zope> directory with the following:
[Storage: FS]
type=Zope2FSStorage
basepath=%(CLIENT_HOME)s/myfs
volatile=1
[Database: FS]
class=Zope2FSDatabase
mount_paths=/fs
auto_create=1
Don't forget to create the directory "myfs" like this:
mkdir var/myfs
Start Zope and choose "Add DBTab Mount Point" in the management UI. You
should get a checkbox next to the "/fs" mount. Create that mount point.
Now visit /fs and add stuff. Watch var/myfs/fs, which will contain
all the objects you create.
You can't yet copy/paste, import, or export, but you can add just about
any kind of object. The files under var/myfs/fs currently contain
pickles, but that's only because AdaptableStorage doesn't have a mapper
registered for most kinds of objects and it falls back to the default
mappers. But AdaptableStorage does know about Folders and it creates a
directory for them. It also works the other way around: if you create a
directory on the filesystem, you'll see it in Zope as a Folder.
If you're adventurous, you can also set up a SQL connection using
psycopg and the following dbtab.conf entries:
[Storage: Postgres]
type=Zope2SQLStorage
params=
table_prefix=zodb
volatile=1
[Database: Postgres]
class=Zope2SQLDatabase
mount_paths=/sql
auto_create=1
You might observe that it's a little less responsive than regular ZODB.
Edit dbtab.conf, changing "volatile=1" to "volatile=0", to get the
full benefits of the ZODB cache. The downside is that changes you make
on the filesystem won't be reflected immediately, but in a lot of
environments, that is acceptable.
The AdaptableStorage I presented at the O'Reilly Open Source conference
was specific to Zope 2. This version is not. In fact, most of it isn't
even specific to ZODB. Its core is a general serialization framework
with pattern names drawn from Martin Fowler's book.
Let me know if you run into troubles. I've been testing it with the
Zope HEAD on Python 2.2.2. This is the product of many months of
inspiration and perspiration. :-) It's not perfect, but the basic
concepts and interfaces are in good shape. Comments welcome.
Shane