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 )

Reply via email to