[datafeed] make cnxset handling of datafeed source more robust
currently we may run in some cases where the session has no more cnxset
depending on errors and parser's handling of the cnxset.
Also, free the cnxset and reacquire it later, letting a chance to other
threads to run.
"""execute this script if you've migration to file >= 1.9.0 with cubicweb <= 3.9.2FYI, this migration occurred :* on our intranet on July 07 2010* on our extranet on July 16 2010"""from__future__importwith_statementtry:backupinstance,=__args__exceptValueError:print'USAGE: cubicweb-ctl shell <instance> repair_file_1-9_migration.py -- <backup instance id>'printprint'you should restored the backup on a new instance, accessible through pyro'fromcubicwebimportcwconfig,dbapifromcubicweb.server.sessionimporthooks_controlsourcescfg=repo.config.sources()backupcfg=cwconfig.instance_configuration(backupinstance)backupcfg.repairing=Truebackuprepo,backupcnx=dbapi.in_memory_repo_cnx(backupcfg,sourcescfg['admin']['login'],password=sourcescfg['admin']['password'],host='localhost')backupcu=backupcnx.cursor()withhooks_control(session,session.HOOKS_DENY_ALL):rql('SET X is Y WHERE X is File, Y name "File", NOT X is Y')rql('SET X is_instance_of Y WHERE X is File, Y name "File", NOT X is_instance_of Y')forrtype,inbackupcu.execute('DISTINCT Any RTN WHERE X relation_type RT, RT name RTN,''X from_entity Y, Y name "Image", X is CWRelation, ''EXISTS(XX is CWRelation, XX relation_type RT, ''XX from_entity YY, YY name "File")'):ifrtypein('is','is_instance_of'):continueprintrtypeforfeid,xeidinbackupcu.execute('Any F,X WHERE F %s X, F is IN (File,Image)'%rtype):print'restoring relation %s between file %s and %s'%(rtype,feid,xeid),printrql('SET F %s X WHERE F eid %%(f)s, X eid %%(x)s, NOT F %s X'%(rtype,rtype),{'f':feid,'x':xeid})forrtype,inbackupcu.execute('DISTINCT Any RTN WHERE X relation_type RT, RT name RTN,''X to_entity Y, Y name "Image", X is CWRelation, ''EXISTS(XX is CWRelation, XX relation_type RT, ''XX to_entity YY, YY name "File")'):printrtypeforfeid,xeidinbackupcu.execute('Any F,X WHERE X %s F, F is IN (File,Image)'%rtype):print'restoring relation %s between %s and file %s'%(rtype,xeid,feid),printrql('SET X %s F WHERE F eid %%(f)s, X eid %%(x)s, NOT X %s F'%(rtype,rtype),{'f':feid,'x':xeid})commit()