server/sources/pyrorql.py
changeset 519 06390418cd9a
parent 417 828424d2eb3c
child 520 29342c0cf55f
--- a/server/sources/pyrorql.py	Thu Jan 29 15:26:09 2009 +0100
+++ b/server/sources/pyrorql.py	Thu Jan 29 16:26:33 2009 +0100
@@ -159,7 +159,8 @@
         external repository
         """
         self.info('synchronizing pyro source %s', self.uri)
-        extrepo = self.get_connection()._repo
+        cnx = self.get_connection()
+        extrepo = cnx._repo
         etypes = self.support_entities.keys()
         if mtime is None:
             mtime = self.last_update_time()
@@ -170,11 +171,13 @@
         try:
             for etype, extid in modified:
                 try:
-                    eid = self.extid2eid(extid, etype, session)
-                    rset = session.eid_rset(eid, etype)
-                    entity = rset.get_entity(0, 0)
-                    entity.complete(entity.e_schema.indexable_attributes())
-                    repo.index_entity(session, entity)
+                    exturi = cnx.describe(extid)[1]
+                    if exturi == 'system' or not exturi in repo.sources_by_uri:
+                        eid = self.extid2eid(extid, etype, session)
+                        rset = session.eid_rset(eid, etype)
+                        entity = rset.get_entity(0, 0)
+                        entity.complete(entity.e_schema.indexable_attributes())
+                        repo.index_entity(session, entity)
                 except:
                     self.exception('while updating %s with external id %s of source %s',
                                    etype, extid, self.uri)
@@ -277,18 +280,29 @@
         descr = rset.description
         if rset:
             needtranslation = []
+            rows = rset.rows
             for i, etype in enumerate(descr[0]):
                 if (etype is None or not self.schema.eschema(etype).is_final() or
                     getattr(union.locate_subquery(i, etype, args).selection[i], 'uidtype', None)):
                     needtranslation.append(i)
             if needtranslation:
-                for rowindex, row in enumerate(rset):
+                cnx = session.pool.connection(self.uri)
+                for rowindex in xrange(rset.rowcount - 1, -1, -1):
+                    row = rows[rowindex]
                     for colindex in needtranslation:
                         if row[colindex] is not None: # optional variable
                             etype = descr[rowindex][colindex]
-                            eid = self.extid2eid(row[colindex], etype, session)
-                            row[colindex] = eid
-            results = rset.rows
+                            exttype, exturi, extid = cnx.describe(row[colindex])
+                            if exturi == 'system' or not exturi in self.repo.sources_by_uri:
+                                eid = self.extid2eid(row[colindex], etype, session)
+                                row[colindex] = eid
+                            else:
+                                # skip this row
+                                print 'skip external', etype, exturi, extid, self.uri
+                                del rows[rowindex]
+                                del descr[rowindex]
+                                break
+            results = rows
         else:
             results = []
         if server.DEBUG: