[Zope-dev] Now; - problems using ZODB/ZCatalog in Python

Thomas Weholt thomas@cintra.no
Tue, 25 Jul 2000 12:33:53 +0200


First off, sorry for posting a huge, stinkin' post like this, but instead of
posting ten times trying to explain what I do, I post this once and hope
somebody can point out what's wrong and I'll leave you all alone, at least
for a while. 

The example is from the Catalog outside Zope-tutorial available at Zope.org.
I'm using Zope 2.2.0. This might have been written for Zope 2.1.6. I dunno.

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>