279 self.exception('while updating %s with external id %s of source %s', |
279 self.exception('while updating %s with external id %s of source %s', |
280 etype, extid, self.uri) |
280 etype, extid, self.uri) |
281 continue |
281 continue |
282 for etype, extid in deleted: |
282 for etype, extid in deleted: |
283 try: |
283 try: |
284 eid = self.extid2eid(str(extid), etype, session, |
284 eid = self.repo.extid2eid(self, str(extid), etype, session, |
285 insert=False) |
285 insert=False) |
286 # entity has been deleted from external repository but is not known here |
286 # entity has been deleted from external repository but is not known here |
287 if eid is not None: |
287 if eid is not None: |
288 entity = session.entity_from_eid(eid, etype) |
288 entity = session.entity_from_eid(eid, etype) |
289 repo.delete_info(session, entity, self.uri, extid, |
289 repo.delete_info(session, entity, self.uri, extid, |
290 scleanup=self.eid) |
290 scleanup=self.eid) |
421 results = [] |
421 results = [] |
422 return results |
422 return results |
423 |
423 |
424 def _entity_relations_and_kwargs(self, session, entity): |
424 def _entity_relations_and_kwargs(self, session, entity): |
425 relations = [] |
425 relations = [] |
426 kwargs = {'x': self.eid2extid(entity.eid, session)} |
426 kwargs = {'x': self.repo.eid2extid(self, entity.eid, session)} |
427 for key, val in entity.cw_attr_cache.iteritems(): |
427 for key, val in entity.cw_attr_cache.iteritems(): |
428 relations.append('X %s %%(%s)s' % (key, key)) |
428 relations.append('X %s %%(%s)s' % (key, key)) |
429 kwargs[key] = val |
429 kwargs[key] = val |
430 return relations, kwargs |
430 return relations, kwargs |
431 |
431 |
447 # source is being deleted, don't propagate |
447 # source is being deleted, don't propagate |
448 self._query_cache.clear() |
448 self._query_cache.clear() |
449 return |
449 return |
450 cu = session.cnxset[self.uri] |
450 cu = session.cnxset[self.uri] |
451 cu.execute('DELETE %s X WHERE X eid %%(x)s' % entity.__regid__, |
451 cu.execute('DELETE %s X WHERE X eid %%(x)s' % entity.__regid__, |
452 {'x': self.eid2extid(entity.eid, session)}) |
452 {'x': self.repo.eid2extid(self, entity.eid, session)}) |
453 self._query_cache.clear() |
453 self._query_cache.clear() |
454 |
454 |
455 def add_relation(self, session, subject, rtype, object): |
455 def add_relation(self, session, subject, rtype, object): |
456 """add a relation to the source""" |
456 """add a relation to the source""" |
457 cu = session.cnxset[self.uri] |
457 cu = session.cnxset[self.uri] |
458 cu.execute('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, |
458 cu.execute('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, |
459 {'x': self.eid2extid(subject, session), |
459 {'x': self.repo.eid2extid(self, subject, session), |
460 'y': self.eid2extid(object, session)}) |
460 'y': self.repo.eid2extid(self, object, session)}) |
461 self._query_cache.clear() |
461 self._query_cache.clear() |
462 session.entity_from_eid(subject).cw_clear_all_caches() |
462 session.entity_from_eid(subject).cw_clear_all_caches() |
463 session.entity_from_eid(object).cw_clear_all_caches() |
463 session.entity_from_eid(object).cw_clear_all_caches() |
464 |
464 |
465 def delete_relation(self, session, subject, rtype, object): |
465 def delete_relation(self, session, subject, rtype, object): |
468 # source is being deleted, don't propagate |
468 # source is being deleted, don't propagate |
469 self._query_cache.clear() |
469 self._query_cache.clear() |
470 return |
470 return |
471 cu = session.cnxset[self.uri] |
471 cu = session.cnxset[self.uri] |
472 cu.execute('DELETE X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, |
472 cu.execute('DELETE X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, |
473 {'x': self.eid2extid(subject, session), |
473 {'x': self.repo.eid2extid(self, subject, session), |
474 'y': self.eid2extid(object, session)}) |
474 'y': self.repo.eid2extid(self, object, session)}) |
475 self._query_cache.clear() |
475 self._query_cache.clear() |
476 session.entity_from_eid(subject).cw_clear_all_caches() |
476 session.entity_from_eid(subject).cw_clear_all_caches() |
477 session.entity_from_eid(object).cw_clear_all_caches() |
477 session.entity_from_eid(object).cw_clear_all_caches() |
478 |
478 |
479 |
479 |
480 class RQL2RQL(object): |
480 class RQL2RQL(object): |
481 """translate a local rql query to be executed on a distant repository""" |
481 """translate a local rql query to be executed on a distant repository""" |
482 def __init__(self, source): |
482 def __init__(self, source): |
483 self.source = source |
483 self.source = source |
|
484 self.repo = source.repo |
484 self.current_operator = None |
485 self.current_operator = None |
485 |
486 |
486 def _accept_children(self, node): |
487 def _accept_children(self, node): |
487 res = [] |
488 res = [] |
488 for child in node.children: |
489 for child in node.children: |
674 self._const_var[value] = var |
675 self._const_var[value] = var |
675 return restr, var |
676 return restr, var |
676 |
677 |
677 def eid2extid(self, eid): |
678 def eid2extid(self, eid): |
678 try: |
679 try: |
679 return self.source.eid2extid(eid, self._session) |
680 return self.repo.eid2extid(self.source, eid, self._session) |
680 except UnknownEid: |
681 except UnknownEid: |
681 operator = self.current_operator |
682 operator = self.current_operator |
682 if operator is not None and operator != '=': |
683 if operator is not None and operator != '=': |
683 # deal with query like "X eid > 12" |
684 # deal with query like "X eid > 12" |
684 # |
685 # |