diff -r c9dbd95333f7 -r d6fd82a5a4e8 server/hook.py --- a/server/hook.py Fri Mar 26 19:21:17 2010 +0100 +++ b/server/hook.py Tue Mar 30 14:32:03 2010 +0200 @@ -450,6 +450,24 @@ set_log_methods(Operation, getLogger('cubicweb.session')) +def set_operation(session, datakey, value, opcls, **opkwargs): + """Search for session.transaction_data[`datakey`] (expected to be a set): + + * if found, simply append `value` + + * else, initialize it to set([`value`]) and instantiate the given `opcls` + operation class with additional keyword arguments. + + You should use this instead of creating on operation for each `value`, + since handling operations becomes coslty on massive data import. + """ + try: + session.transaction_data[datakey].add(value) + except KeyError: + opcls(session, *opkwargs) + session.transaction_data[datakey] = set((value,)) + + class LateOperation(Operation): """special operation which should be called after all possible (ie non late) operations @@ -529,3 +547,40 @@ execute = self.session.execute for rql in self.rqls: execute(*rql) + + +class CleanupNewEidsCacheOp(SingleLastOperation): + """on rollback of a insert query we have to remove from repository's + type/source cache eids of entities added in that transaction. + + NOTE: querier's rqlst/solutions cache may have been polluted too with + queries such as Any X WHERE X eid 32 if 32 has been rollbacked however + generated queries are unpredictable and analysing all the cache probably + too expensive. Notice that there is no pb when using args to specify eids + instead of giving them into the rql string. + """ + + def rollback_event(self): + """the observed connections pool has been rollbacked, + remove inserted eid from repository type/source cache + """ + try: + self.session.repo.clear_caches( + self.session.transaction_data['neweids']) + except KeyError: + pass + +class CleanupDeletedEidsCacheOp(SingleLastOperation): + """on commit of delete query, we have to remove from repository's + type/source cache eids of entities deleted in that transaction. + """ + + def commit_event(self): + """the observed connections pool has been rollbacked, + remove inserted eid from repository type/source cache + """ + try: + self.session.repo.clear_caches( + self.session.transaction_data['pendingeids']) + except KeyError: + pass