server/session.py
changeset 3589 a5432f99f2d9
parent 3379 9192ba07890d
parent 3553 76b4a177a018
child 3998 94cc7cad3d2d
equal deleted inserted replaced
3536:f6c9a5df80fb 3589:a5432f99f2d9
   145         if symetric:
   145         if symetric:
   146             self._update_entity_rel_cache_del(object, rtype, 'object', object)
   146             self._update_entity_rel_cache_del(object, rtype, 'object', object)
   147         else:
   147         else:
   148             self._update_entity_rel_cache_del(object, rtype, 'object', subject)
   148             self._update_entity_rel_cache_del(object, rtype, 'object', subject)
   149 
   149 
   150     def _rel_cache(self, eid, rtype, role):
   150     def _update_entity_rel_cache_add(self, eid, rtype, role, targeteid):
   151         try:
   151         try:
   152             entity = self.entity_cache(eid)
   152             entity = self.entity_cache(eid)
   153         except KeyError:
   153         except KeyError:
   154             return
   154             return
   155         return entity.relation_cached(rtype, role)
   155         rcache = entity.relation_cached(rtype, role)
   156 
       
   157     def _update_entity_rel_cache_add(self, eid, rtype, role, targeteid):
       
   158         rcache = self._rel_cache(eid, rtype, role)
       
   159         if rcache is not None:
   156         if rcache is not None:
   160             rset, entities = rcache
   157             rset, entities = rcache
       
   158             rset = rset.copy()
       
   159             entities = list(entities)
   161             rset.rows.append([targeteid])
   160             rset.rows.append([targeteid])
   162             if not isinstance(rset.description, list): # else description not set
   161             if not isinstance(rset.description, list): # else description not set
   163                 rset.description = list(rset.description)
   162                 rset.description = list(rset.description)
   164             rset.description.append([self.describe(targeteid)[0]])
   163             rset.description.append([self.describe(targeteid)[0]])
   165             targetentity = self.entity_from_eid(targeteid)
   164             targetentity = self.entity_from_eid(targeteid)
   167                 targetentity.cw_rset = rset
   166                 targetentity.cw_rset = rset
   168                 targetentity.cw_row = rset.rowcount
   167                 targetentity.cw_row = rset.rowcount
   169                 targetentity.cw_col = 0
   168                 targetentity.cw_col = 0
   170             rset.rowcount += 1
   169             rset.rowcount += 1
   171             entities.append(targetentity)
   170             entities.append(targetentity)
       
   171             entity._related_cache['%s_%s' % (rtype, role)] = (rset, tuple(entities))
   172 
   172 
   173     def _update_entity_rel_cache_del(self, eid, rtype, role, targeteid):
   173     def _update_entity_rel_cache_del(self, eid, rtype, role, targeteid):
   174         rcache = self._rel_cache(eid, rtype, role)
   174         try:
       
   175             entity = self.entity_cache(eid)
       
   176         except KeyError:
       
   177             return
       
   178         rcache = entity.relation_cached(rtype, role)
   175         if rcache is not None:
   179         if rcache is not None:
   176             rset, entities = rcache
   180             rset, entities = rcache
   177             for idx, row in enumerate(rset.rows):
   181             for idx, row in enumerate(rset.rows):
   178                 if row[0] == targeteid:
   182                 if row[0] == targeteid:
   179                     break
   183                     break
   181                 # this may occurs if the cache has been filed by a hook
   185                 # this may occurs if the cache has been filed by a hook
   182                 # after the database update
   186                 # after the database update
   183                 self.debug('cache inconsistency for %s %s %s %s', eid, rtype,
   187                 self.debug('cache inconsistency for %s %s %s %s', eid, rtype,
   184                            role, targeteid)
   188                            role, targeteid)
   185                 return
   189                 return
       
   190             rset = rset.copy()
       
   191             entities = list(entities)
   186             del rset.rows[idx]
   192             del rset.rows[idx]
   187             if isinstance(rset.description, list): # else description not set
   193             if isinstance(rset.description, list): # else description not set
   188                 del rset.description[idx]
   194                 del rset.description[idx]
   189             del entities[idx]
   195             del entities[idx]
   190             rset.rowcount -= 1
   196             rset.rowcount -= 1
       
   197             entity._related_cache['%s_%s' % (rtype, role)] = (rset, tuple(entities))
   191 
   198 
   192     # resource accessors ######################################################
   199     # resource accessors ######################################################
   193 
   200 
   194     def actual_session(self):
   201     def actual_session(self):
   195         """return the original parent session if any, else self"""
   202         """return the original parent session if any, else self"""