[storm] Zope - Storm Container Implementation

Christian Klinger cklinger at novareto.de
Mon Nov 26 15:09:34 GMT 2007


Hi,

i have now checked the source temporary in a subversion.
You can look here:

http://stormcontainer.googlecode.com/svn/trunk/src/megrok/storm/

Additionally i have a doctest which is heavily based on yours
from strom.zope.



> Hey Christian,
> 
>> i played the last days a bit with storm.zope.
>> Unfortunatly there is no Container for zope.storm,
>>
>> I´ve looked at the nice z3c.zalchemy [2],
>> espacially the container implementation.
>>
>> I have taken the container.py from z3c.zalchemy as
>> a base for the stormcontainer.py attached to this post.
> 
> Very nice! Thanks for publishing it.
> 
>> As i´m using grok[1]. I subclass the container from
>> grok.Container. But i think this should work in a pure Z3
>> Environment too. Maybe subclass from zope.container?
>>
>> I´m waiting for your comments.
> 
> A few things to perhaps look after:
> 
> - store.delete() is actually store.remove()

Yes you are right. I have *replaced* the remove statement.

> 
> - The way that commit() is being done in delitem and
>   setitem seems dangerous.  It means that as a side-effect
>   of removing an item from the container, all the changes
>   in the current transaction are persisted.

I use now transaction.commit(). But i don´t exactly
know if i need this?

> 
> - You shouldn't have to do flush().  Storm does it
>   automatically when needed.

I don´t use flush() anymore.

> 
> - for id in obj.__storm_object_info__.get('primary_vars'):
>       ident += str(id._value)

Now i use this statement.
But i convert the result to an string type.
You can see an example in the doctests.

     def _getInstanceKey(self, obj):
         """ Get an unique id form obj """
         obj_info = get_obj_info(obj)
         id = tuple(obj_info.variables[column].get() for column in 
obj_info.cls_info.primary_key)
         return id



> 
>   You're using private data here, which is not part of the
>   exposed API, meaning that it may change without warnings. Also,
>   this internal value may not be available by the time you access
>   it directly, unlike the actual property.
> 
>   Besides these points, this isn't a very good way to extract the
>   key, since (1, 23) will yield the same key as (12, 3), for
>   instance.
> 
>

I try to experiment with store.get for this issue. But i have no 
solution at this moment.

> - 	for obj in store.find(self._class):
> 	    if self._getInstanceKey(obj) == str(id):
> 		return obj
> 
>   That is a *very* expensive way to get an object out of the
>   database.  It will walk through all the objects, potentially.
>   It should somehow look for the specific key instead.
> 

Christian




More information about the storm mailing list