misc/scripts/repair_file_1-9_migration.py
author Pierre-Yves David <pierre-yves.david@logilab.fr>
Wed, 07 Mar 2012 16:09:55 +0100
branchstable
changeset 8296 f23782a2cdee
parent 7056 51f88f13d6f3
child 8694 d901c36bcfce
permissions -rw-r--r--
rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985) update _cleanup_inserted to avoid leaving rewritten variable behind when removing a snipset. insert_varmap_snippets was impacted too for unclear reason --- Before A KeyError was raised when: * multiple snipset is to be inserted on a statement * some *supported* snipset adds ambiguity (increase the number of solution) * some *unsupported* snipset adds new variable * The new variable require rewritting :: File "/home/pyves/src/fcw/cubicweb/rqlrewrite.py", line 185, in rewrite newsolutions = self.remove_ambiguities(snippets, newsolutions) File "/home/pyves/src/fcw/cubicweb/rqlrewrite.py", line 436, in remove_ambiguities variantes = self.build_variantes(newsolutions) File "/home/pyves/src/fcw/cubicweb/devtools/repotest.py", line 340, in _build_variantes variantes = _orig_build_variantes(self, newsolutions) File "/home/pyves/src/fcw/cubicweb/rqlrewrite.py", line 470, in build_variantes variante.append( (key, sol[newvar]) ) KeyError: u'D' This happen because the mechanism removing unsupported snipset does not remove entry in ``self.rewritten`` when it removes entry from ``self.select.defined_vars``. Iteration on ``self.rewritten`` then crash because values of ``rewritten`` are expected to be found in solution.

"""execute this script if you've migration to file >= 1.9.0 with cubicweb <= 3.9.2

FYI, this migration occurred :
* on our intranet on July 07 2010
* on our extranet on July 16 2010
"""
from __future__ import with_statement

try:
    backupinstance, = __args__
except ValueError:
    print 'USAGE: cubicweb-ctl shell <instance> repair_file_1-9_migration.py -- <backup instance id>'
    print
    print 'you should restored the backup on a new instance, accessible through pyro'

from cubicweb import cwconfig, dbapi
from cubicweb.server.session import hooks_control

sourcescfg = repo.config.sources()
backupcfg = cwconfig.instance_configuration(backupinstance)
backupcfg.repairing = True
backuprepo, backupcnx = dbapi.in_memory_repo_cnx(backupcfg, sourcescfg['admin']['login'],
                                                 password=sourcescfg['admin']['password'],
                                                 host='localhost')
backupcu = backupcnx.cursor()

with hooks_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')
    for rtype, in backupcu.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")'):
        if rtype in ('is', 'is_instance_of'):
            continue
        print rtype
        for feid, xeid in backupcu.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),
            print rql('SET F %s X WHERE F eid %%(f)s, X eid %%(x)s, NOT F %s X' % (rtype, rtype),
                      {'f': feid, 'x': xeid})

    for rtype, in backupcu.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")'):
        print rtype
        for feid, xeid in backupcu.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),
            print rql('SET X %s F WHERE F eid %%(f)s, X eid %%(x)s, NOT X %s F' % (rtype, rtype),
                      {'f': feid, 'x': xeid})

commit()