misc/migration/3.21.0_Any.py
author Julien Cristau <julien.cristau@logilab.fr>
Mon, 20 Jul 2015 16:43:47 +0200
changeset 10538 a2d2383612f3
parent 10490 76ab3c71aff2
child 10556 8fbff2247816
permissions -rw-r--r--
[migration/3.21] fix stupid error in migration script str.join doesn't like a list of ints. Closes #5706359.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     1
from cubicweb.schema import PURE_VIRTUAL_RTYPES
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     2
from cubicweb.server.schema2sql import rschema_has_table
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     3
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     4
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     5
def add_foreign_keys():
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     6
    source = repo.sources_by_uri['system']
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     7
    if not source.dbhelper.alter_column_support:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     8
        return
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     9
    for rschema in schema.relations():
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    10
        if rschema.inlined:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    11
            add_foreign_keys_inlined(rschema)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    12
        elif rschema_has_table(rschema, skip_relations=PURE_VIRTUAL_RTYPES):
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    13
            add_foreign_keys_relation(rschema)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    14
    for eschema in schema.entities():
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    15
        if eschema.final:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    16
            continue
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    17
        add_foreign_key_etype(eschema)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    18
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    19
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    20
def add_foreign_keys_relation(rschema):
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    21
    args = {'r': rschema.type}
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    22
    count = sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    23
                '    SELECT eid_from FROM %(r)s_relation'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    24
                '  UNION'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    25
                '    SELECT eid_to FROM %(r)s_relation'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    26
                '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    27
                '    SELECT eid FROM entities) AS eids' % args,
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    28
                ask_confirm=False)[0][0]
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    29
    if count:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    30
        print '%s references %d unknown entities, deleting' % (rschema, count)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    31
        sql('DELETE FROM %(r)s_relation '
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    32
            'WHERE eid_from IN (SELECT eid_from FROM %(r)s_relation EXCEPT SELECT eid FROM entities)' % args)
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    33
        sql('DELETE FROM %(r)s_relation '
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    34
            'WHERE eid_to IN (SELECT eid_to FROM %(r)s_relation EXCEPT SELECT eid FROM entities)' % args)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    35
10484
7f15552b7463 [migration/3.21] idempotency fixes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10483
diff changeset
    36
    sql('ALTER TABLE %(r)s_relation DROP CONSTRAINT IF EXISTS %(r)s_relation_eid_from_fkey' % args)
7f15552b7463 [migration/3.21] idempotency fixes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10483
diff changeset
    37
    sql('ALTER TABLE %(r)s_relation DROP CONSTRAINT IF EXISTS %(r)s_relation_eid_to_fkey' % args)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    38
    sql('ALTER TABLE %(r)s_relation ADD CONSTRAINT %(r)s_relation_eid_from_fkey '
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    39
        'FOREIGN KEY (eid_from) REFERENCES entities (eid)' % args)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    40
    sql('ALTER TABLE %(r)s_relation ADD CONSTRAINT %(r)s_relation_eid_to_fkey '
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    41
        'FOREIGN KEY (eid_to) REFERENCES entities (eid)' % args)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    42
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    43
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    44
def add_foreign_keys_inlined(rschema):
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    45
    for eschema in rschema.subjects():
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    46
        args = {'e': eschema.type, 'r': rschema.type}
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    47
        args['c'] = 'cw_%(e)s_cw_%(r)s_fkey' % args
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    48
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    49
        if eschema.rdef(rschema).cardinality[0] == '1':
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    50
            broken_eids = sql('SELECT cw_eid FROM cw_%(e)s WHERE cw_%(r)s IS NULL' % args, ask_confirm=False)
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    51
            if broken_eids:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    52
                print 'Required relation %(e)s.%(r)s missing' % args
10538
a2d2383612f3 [migration/3.21] fix stupid error in migration script
Julien Cristau <julien.cristau@logilab.fr>
parents: 10490
diff changeset
    53
                args['eids'] = ', '.join(str(eid) for eid, in broken_eids)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    54
                rql('DELETE %(e)s X WHERE X eid IN (%(eids)s)' % args)
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    55
            broken_eids = sql('SELECT cw_eid FROM cw_%(e)s WHERE cw_%(r)s IN (SELECT cw_%(r)s FROM cw_%(e)s '
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    56
                              'EXCEPT SELECT eid FROM entities)' % args, ask_confirm=False)
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    57
            if broken_eids:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    58
                print 'Required relation %(e)s.%(r)s references unknown objects, deleting subject entities' % args
10538
a2d2383612f3 [migration/3.21] fix stupid error in migration script
Julien Cristau <julien.cristau@logilab.fr>
parents: 10490
diff changeset
    59
                args['eids'] = ', '.join(str(eid) for eid, in broken_eids)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    60
                rql('DELETE %(e)s X WHERE X eid IN (%(eids)s)' % args)
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    61
        else:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    62
            if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    63
                   '    SELECT cw_%(r)s FROM cw_%(e)s WHERE cw_%(r)s IS NOT NULL'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    64
                   '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    65
                   '    SELECT eid FROM entities) AS eids' % args, ask_confirm=False)[0][0]:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    66
                print '%(e)s.%(r)s references unknown entities, deleting relation' % args
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    67
                sql('UPDATE cw_%(e)s SET cw_%(r)s = NULL WHERE cw_%(r)s IS NOT NULL AND cw_%(r)s IN '
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    68
                    '(SELECT cw_%(r)s FROM cw_%(e)s EXCEPT SELECT eid FROM entities)' % args)
10484
7f15552b7463 [migration/3.21] idempotency fixes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10483
diff changeset
    69
        sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS %(c)s' % args)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    70
        sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s '
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    71
            'FOREIGN KEY (cw_%(r)s) references entities(eid)'
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    72
            % args)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    73
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    74
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    75
def add_foreign_key_etype(eschema):
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    76
    args = {'e': eschema.type}
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    77
    if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    78
           '    SELECT cw_eid FROM cw_%(e)s'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    79
           '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    80
           '    SELECT eid FROM entities) AS eids' % args,
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    81
           ask_confirm=False)[0][0]:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    82
        print '%(e)s has nonexistent entities, deleting' % args
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    83
        sql('DELETE FROM cw_%(e)s WHERE cw_eid IN '
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    84
            '(SELECT cw_eid FROM cw_%(e)s EXCEPT SELECT eid FROM entities)' % args)
10484
7f15552b7463 [migration/3.21] idempotency fixes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10483
diff changeset
    85
    sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS cw_%(e)s_cw_eid_fkey' % args)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    86
    sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT cw_%(e)s_cw_eid_fkey '
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    87
        'FOREIGN KEY (cw_eid) REFERENCES entities (eid)' % args)
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    88
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    89
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    90
add_foreign_keys()
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    91
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    92
cu = session.cnxset.cu
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    93
helper = repo.system_source.dbhelper
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    94
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    95
helper.drop_index(cu, 'entities', 'extid', False)
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    96
helper.create_index(cu, 'entities', 'extid', True)
10209
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
    97
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    98
if 'moved_entities' not in helper.list_tables(cu):
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
    99
    sql('''
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   100
    CREATE TABLE moved_entities (
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   101
      eid INTEGER PRIMARY KEY NOT NULL,
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   102
      extid VARCHAR(256) UNIQUE
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   103
    )
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   104
    ''')
10209
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   105
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   106
moved_entities = sql('SELECT -eid, extid FROM entities WHERE eid < 0')
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   107
cu.executemany('INSERT INTO moved_entities (eid, extid) VALUES (%s, %s)',
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   108
               moved_entities)
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   109
sql('DELETE FROM entities WHERE eid < 0')
4c64a41c0a1d Use a moved_entities table to record external entities moved to the system source
Julien Cristau <julien.cristau@logilab.fr>
parents: 10208
diff changeset
   110
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   111
commit()
10316
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   112
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   113
sync_schema_props_perms('CWEType')
10371
88577b10b31e [schema] add a unique index on cwuri
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10316
diff changeset
   114
88577b10b31e [schema] add a unique index on cwuri
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10316
diff changeset
   115
sync_schema_props_perms('cwuri')
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   116
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   117
from cubicweb.server.schema2sql import check_constraint
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   118
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   119
for cwconstraint in rql('Any C WHERE R constrained_by C').entities():
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   120
    cwrdef = cwconstraint.reverse_constrained_by[0]
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   121
    rdef = cwrdef.yams_schema()
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   122
    cstr = rdef.constraint_by_eid(cwconstraint.eid)
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   123
    if cstr.type() not in ('BoundaryConstraint', 'IntervalBoundConstraint', 'StaticVocabularyConstraint'):
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   124
        continue
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   125
    cstrname, check = check_constraint(rdef.subject, rdef.object, rdef.rtype.type,
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   126
            cstr, helper, prefix='cw_')
10484
7f15552b7463 [migration/3.21] idempotency fixes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10483
diff changeset
   127
    sql('ALTER TABLE %s%s DROP CONSTRAINT IF EXISTS %s' % ('cw_', rdef.subject.type, cstrname))
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   128
    sql('ALTER TABLE %s%s ADD CONSTRAINT %s CHECK(%s)' % ('cw_', rdef.subject.type, cstrname, check))
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   129
commit()