Dieter Maurer schrieb:
Joachim Schmitz wrote at 2007-7-20 10:40 +0200:
Obviously, you got the wrong mainling list.
This is not a ZODB problem...
my mistake it should have gone to the zope-dev list.
...
I found in Catalog.py updateMetadata around line 306
else:
if data.get(index, 0) != newDataRecord:
data[index] = newDataRecord
the if condition evaluates always to false, cause the data.get(index,0)
accesses the data of the index and not of the metadata field as long as
Zope was not restarted that worked fine.
The code above should prevent a write (which would grow the storage)
when in fact nothing changed. And it looks correct.
Yes, but it does not work as exspected.
Here is a more detailed description of our usecase:
In our catalog we have a keyword index "registered_courses" and a
metadata field "registered_courses". If a student registers a new course
an event is triggered, which adds the new course to the index. In our
event-handler we have:
res = students_catalog(id = student_id)
if not res:
return
student_rec = res[0]
registered_courses = getattr(student_rec,'registered_courses',None)
if not registered_courses:
registered_courses = []
#import pdb;pdb.set_trace()
if event_type == "sys_add_object":
if course_id not in registered_courses:
registered_courses.append(course_id)
else:
return
elif registered_courses and event_type == "sys_del_object":
removed = False
while course_id in registered_courses:
removed = True
registered_courses.remove(course_id)
if not removed:
return
record_data = {}
for field in self.schema() + self.indexes():
record_data[field] = getattr(student_rec, field)
# Add the updated data:
record_data.update(data)
self.catalog_object(dict2ob(record_data), student_id)
where dict2obj does just that.
That updates the meta_data only on index_creation, and after a zope
restart the meta_data for registered_courses only contained the first
added course. That was because (i asume)
data.get(index, 0) always got the data from the index, and not from the
meta_data. I could veryfy this by looking at the catalog-record in the
ZMI. So it neve got to update the meta_data, so the "real" cause for
this problem is that data.get(index, 0), returns the value of the index
here and not that of the meta_data.
--
Gruß Joachim
_______________________________________________
Zope-Dev maillist - Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )