thomas, this error message is raised when the zope instance that contains the ZODB you're trying to work with is already running (and thereby put its own lock on the ZODB). are you trying to execute this script while zope is running? you need to shut it down first. jens
-----Original Message----- From: zope-dev-admin@zope.org [mailto:zope-dev-admin@zope.org]On Behalf Of Thomas Weholt Sent: Tuesday, July 25, 2000 06:34 To: 'Zope-Dev@zope.org' Subject: [Zope-dev] Now; - problems using ZODB/ZCatalog in Python
I understand the error message, just don't why it is raised. If I should call some form of commit() or close(), where should this be done?
And, by the way, does Catalog support different kinds of searches, like matching all the search-words, some, does the order count ? Can this options be set, if any exists?
Anyway, thanks for your patience and bandwidth. Thomas
import sys sys.path.append('d:\\progra~1\\website\\lib\\python\\') import ZODB import Persistence from Persistence import Persistent from ZODB.FileStorage import FileStorage from Products.ZCatalog.Catalog import Catalog
### create some classes to be persistent class Nobody( Persistent ): def identify( self ): print "I am Nobody!"
class Person( Persistent ): def __init__( self, first, name, email, friend=Nobody() ): self.first = first self.name = name self.email = email self.friend= friend def identify( self ): print "I am " + self.first + " " + self.name print "and my Email is " + self.email
### OK, the ZODB-API together with a Catalog-Class class Application: def __init__( self, file='test.fs' ): self.file= file self.db = ZODB.DB( FileStorage( file ) ) self.co = self.db.open() self.root= self.co.root() if self.root.has_key( 'cat' ): self.cat= self.root['cat'] else: self.cat = Catalog() ### This is, how I get it to work self.cat.aq_parent= self.root
self.root['cat']= self.cat
### Add indexes to the Catalog-Class ### The names must match the fields of the Person-Class! self.cat.addIndex('first','FieldIndex' ) self.cat.addIndex('name' ,'FieldIndex' ) self.cat.addIndex('email','FieldIndex' ) get_transaction().commit()
def storePerson( self, person ): uid= id( person ) print "stored as " + str( uid ) self.root[uid]= person
### Let the Catalog know from this object self.cat.catalogObject( person, uid ) get_transaction().commit()
def searchPerson( self, **kw ): r= self.cat.searchResults( kw ) paths= self.cat.paths root = self.root k= [] for i in r: id= i.data_record_id_ k.append( root[paths[id]] ) return k
if __name__ == '__main__': a= Application() p1= Person( 'marian','kelc','marian.kelc@ruhr-uni-bochum.de' ) p2= Person( 'tanja', 'kreierhoff','tanja.kreierhoff@web.de', p1 ) p1.friend= p2 a.storePerson( p1 ) a.storePerson( p2 )
### test2.py a= Application()
### perform searches with keyword-arguments ids= a.searchPerson( name='kelc' )
for i in ids: i.identify() print "Friend is:" i.friend.identify() i.friend.friend.identify() print str( id( i ) ) print str( id( i.friend.friend ) )
stored as 24111488 stored as 16520248 Traceback (innermost last): File "D:\Program Files\Python\Pythonwin\pywin\framework\scriptutils.py", line 307, in RunScript debugger.run(codeObject, __main__.__dict__, start_stepping=0) File "D:\Program Files\Python\Pythonwin\pywin\debugger\__init__.py", line 71, in run _GetCurrentDebugger().run(cmd, globals,locals, start_stepping) File "D:\Program Files\Python\Pythonwin\pywin\debugger\debugger.py", line 533, in run _doexec(cmd, globals, locals) File "D:\Program Files\Python\Pythonwin\pywin\debugger\debugger.py", line 868, in _doexec exec cmd in globals, locals File "D:\python\life\zodb_zcatalog.py", line 84, in ? a= Application() File "D:\python\life\zodb_zcatalog.py", line 28, in __init__ self.db = ZODB.DB( FileStorage( file ) ) File "D:\PROGRA~1\WebSite\lib\python\ZODB\FileStorage.py", line 262, in __init__ lock_file(f) File "D:\PROGRA~1\WebSite\lib\python\ZODB\lock_file.py", line 115, in lock_file raise error, ( StorageSystemError: Could not lock the database file. There must be another process that has opened the file. <p>