-----Original Message----- From: Adam Feuer [mailto:adamf@pobox.com] Sent: Monday, September 20, 1999 12:54 PM To: zope-dev@zope.org Subject: [Zope-dev] using persistent storage inside Zope
zope folks, if this has already been covered somewhere, let me know-- i just couldn't find information about it on the Zope site!
i'm building a Zope product that needs to store some persistent information in the Zope object database. the information needs to be accessible to all instances of that product.
I would suggest not making this data a class attribute, and instead make it an instance of an object that provides a service to your instances via a protocol you define yourself. For example, a user folder provides an authentication server to other zope objects.
my approach was: write a class that derives from Persistence.Persistent that will store the data and mediate access to it. then, in the product's __init__.py file, instantiate this class and put the instance into the Zope object database, then call get_transaction().commit() to commit it. theoretically, once my instance is in the Zope object database, other objects can access it-- adding or subtracting data. and the instance will handle committing its own changes, so it won't forget anything between restarts of Zope.
Your sorta halfway there, but I would make your 'storage' a full fledged Zope object, not some sort of product class attribute, if this is what you mean. Maybe I'm the one confused.
my question: how do actually do this?? :-) i found a kludgy way to store a class instance in the Zope object database from the product's __init__.py file, but i can't figure out how to connect to this object from a random instance of my product.
amy i going about this all wrong? is there a better way of storing and accessing persistent objects from inside of Zope? or if my approach is correct, how do actually implement it?
here's what i am doing in the product's __init__.py file:
# get the ZODB root-- kludge! root=context._ProductContext__app._p_jar.root() # now make the object instance if we need to if root.has_key('FooObject'): print "FooObject already in DB" else: print "made new FooObject." root['FooObject'] = Foo.Foo() get_transaction().commit()
the problem seems to be, i don't know how to get access to the Zope object database's root object from inside an instance of my product. what i want to do inside the product base class, during an add or delete of an instance of the product, is something like:
# somehow get the root of the Zope ZODB :-) root=Somehow.get.ZODB.root()
self._p_jar.root()
root['FooObject'].remove_item(someitem) get_transaction().commit()
All persistence objects have an _p_jar attribute which represents the current database 'connection'. _p_jar.root() will give you the root object. But what it looks like your doing is stuffing something in the object database that Zope is not aware about? Why not just make it a Zope object? This smells like a hack. -Michel