[datafeed] for datafeed source, we don't want commit in extid2eid but explicitly handled by the source. Also, we should use 'safe' internal session
# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""core hooks registering some maintainance tasks as server startup time"""__docformat__="restructuredtext en"fromdatetimeimporttimedelta,datetimefromcubicweb.serverimporthookclassServerStartupHook(hook.Hook):"""task to cleanup expirated auth cookie entities"""__regid__='cw.start-looping-tasks'events=('server_startup',)def__call__(self):# XXX use named args and inner functions to avoid referencing globals# which may cause reloading pblifetime=timedelta(days=self.repo.config['keep-transaction-lifetime'])defcleanup_old_transactions(repo=self.repo,lifetime=lifetime):mindate=datetime.now()-lifetimesession=repo.internal_session()try:session.system_sql('DELETE FROM transactions WHERE tx_time < %(time)s',{'time':mindate})# cleanup deleted entitiessession.system_sql('DELETE FROM deleted_entities WHERE dtime < %(time)s',{'time':mindate})session.commit()finally:session.close()ifself.repo.config['undo-support']:self.repo.looping_task(60*60*24,cleanup_old_transactions,self.repo)defupdate_feeds(repo):# don't iter on repo.sources which doesn't include copy based# sources (the one we're looking for)forsourceinrepo.sources_by_eid.itervalues():if(notsource.copy_based_sourceornotrepo.config.source_enabled(source)ornotsource.config['synchronize']):continuesession=repo.internal_session(safe=True)try:stats=source.pull_data(session)ifstats.get('created'):source.info('added %s entities',len(stats['created']))ifstats.get('updated'):source.info('updated %s entities',len(stats['updated']))exceptException,exc:session.exception('while trying to update feed %s',source)finally:session.close()self.repo.looping_task(60,update_feeds,self.repo)