[migration] add script to repair instances which have lost some relation due to 3.9 + file 1.9 migration (bad Image -> File entity type renaming) stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Wed, 21 Jul 2010 12:40:17 +0200
branchstable
changeset 6001 1a21d7d2c959
parent 6000 98ca82aae3a1
child 6002 0ce7052ce30b
[migration] add script to repair instances which have lost some relation due to 3.9 + file 1.9 migration (bad Image -> File entity type renaming)
misc/scripts/repair_file_1-9_migration.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/scripts/repair_file_1-9_migration.py	Wed Jul 21 12:40:17 2010 +0200
@@ -0,0 +1,52 @@
+"""execute this script if you've migration to file >= 1.9.0 with cubicweb <= 3.9.2
+
+FYI, this migration occured :
+* 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_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()