diff --git a/product/ERP5/Tool/IdTool.py b/product/ERP5/Tool/IdTool.py index d72d52f0dc559dad86b2337875234cf1ccd215bc..0856056dd3c79429ba3042cf686f6e8e5a1ccc76 100644 --- a/product/ERP5/Tool/IdTool.py +++ b/product/ERP5/Tool/IdTool.py @@ -148,6 +148,32 @@ class IdTool(BaseTool): self.dict_length_ids = PersistentMapping() return self.dict_length_ids.items() + security.declarePrivate('dumpDictLengthIdsItems') + def dumpDictLengthIdsItems(self): + """ + Store persistently data from SQL table portal_ids. + """ + portal_catalog = getToolByName(self, 'portal_catalog').getSQLCatalog() + query = getattr(portal_catalog, 'z_portal_ids_dump') + dict_length_ids = getattr(self, 'dict_length_ids', None) + if dict_length_ids is None: + dict_length_ids = self.dict_length_ids = PersistentMapping() + for line in query().dictionaries(): + id_group = line['id_group'] + last_id = line['last_id'] + stored_last_id = self.dict_length_ids.get(id_group) + if stored_last_id is None: + self.dict_length_ids[id_group] = Length(last_id) + else: + stored_last_id_value = stored_last_id() + if stored_last_id_value < last_id: + stored_last_id.set(last_id) + else: + if stored_last_id_value > last_id: + LOG('IdTool', WARNING, 'ZODB value (%r) for group %r is higher ' \ + 'than SQL value (%r). Keeping ZODB value untouched.' % \ + (stored_last_id, id_group, last_id)) + security.declareProtected(Permissions.AccessContentsInformation, 'getLastLengthGeneratedId') def getLastLengthGeneratedId(self, id_group, default=None): diff --git a/product/ERP5Catalog/CatalogTool.py b/product/ERP5Catalog/CatalogTool.py index 3523afbea2005b650be0501a161069c7a8845ca7..5cd571b31cbdf6ee9da76a609a21f2bb44d1e445 100644 --- a/product/ERP5Catalog/CatalogTool.py +++ b/product/ERP5Catalog/CatalogTool.py @@ -632,10 +632,7 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool, ActiveObject): """ id_tool = self.getPortalObject().portal_ids try: - # Call generate new id in order to store the last id into - # the zodb - id_tool.generateNewLengthId(id_group='portal_activity') - id_tool.generateNewLengthId(id_group='portal_activity_queue') + id_tool.dumpDictLengthIdsItems() except ConflictError: raise except: