[Luis N]
I'm having troubles opening and closing the standalone ZODB with an OOBTree.
def opendb(): path = os.path.expanduser('~/zodb/zodb.fs') try: storage = FileStorage.FileStorage(path) db = DB(storage) conn = db.open() dbroot = conn.root() if not dbroot.has_key('authors'): dbroot['authors'] = OOBTree()
Note that since you never commit this transaction, the database is never changed.
dbroot = conn.root()
Note that there's no need for this (you already set dbroot to conn.root() earlier).
return (dbroot, conn, db, storage) except: return False
def closedb(database): try: get_transaction.abort() database[0].close() database[1].close() database[2].close() return True except: return False
db = opendb() db[0] {'authors': <BTrees._OOBTree.OOBTree object at 0x82e1dac>} db[1] <Connection at 082f6d6c> db[2] <ZODB.DB.DB object at 0x81dd34c> closedb(db) False db[0].close Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: 'PersistentMapping' object has no attribute 'close'
Yes, it doesn't make sense to try to "close" the root object, or to "close" the OOBTree later. Those are like trying to close a string, or a dictionary. The only thing you need to close (and it is good practice to close it explicitly) is the database object (db[2] here).
db[1].close <bound method Connection.close of <Connection at 082f6d6c>>
You can close that if you want to, but it's not necessary.
db[2].close <bound method DB.close of <ZODB.DB.DB object at 0x81dd34c>>
That's the important one. You can also the close the storage (which you didn't try to do here), but closing the DB also closes the storage passed originally to the DB constructor.
How should the OOBTree closed?
Loudly <wink>. Seriously, closing isn't a concept that applies to persistent objects. BTW, note that you'll probably get better answers about ZODB quicker on the zodb-dev mailing list.