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""" |