misc/migration/3.21.0_Any.py
author Julien Cristau <julien.cristau@logilab.fr>
Tue, 29 Sep 2015 14:41:28 +0200
changeset 10628 8f32cdc3f4ec
parent 10626 93f8d239c708
child 10651 9ca33768473c
permissions -rw-r--r--
[migration/3.21] add support for sqlserver Closes #7173702
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():
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
     6
    source = repo.system_source
10482
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
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    36
    args['from_fk'] = '%(r)s_relation_eid_from_fkey' % args
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    37
    args['to_fk'] = '%(r)s_relation_eid_to_fkey' % args
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    38
    args['table'] = '%(r)s_relation' % args
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    39
    if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    40
        sql('ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(from_fk)s' % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    41
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    42
        sql('ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(to_fk)s' % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    43
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    44
    elif repo.system_source.dbdriver.startswith('sqlserver'):
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    45
        sql("IF OBJECT_ID('%(from_fk)s', 'F') IS NOT NULL "
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    46
            "ALTER TABLE %(table)s DROP CONSTRAINT %(from_fk)s" % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    47
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    48
        sql("IF OBJECT_ID('%(to_fk)s', 'F') IS NOT NULL "
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    49
            "ALTER TABLE %(table)s DROP CONSTRAINT %(to_fk)s" % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    50
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    51
    sql('ALTER TABLE %(table)s ADD CONSTRAINT %(from_fk)s '
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    52
        'FOREIGN KEY (eid_from) REFERENCES entities (eid)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    53
        ask_confirm=False)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    54
    sql('ALTER TABLE %(table)s ADD CONSTRAINT %(to_fk)s '
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    55
        'FOREIGN KEY (eid_to) REFERENCES entities (eid)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    56
        ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    57
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    58
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    59
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
    60
    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
    61
        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
    62
        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
    63
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    64
        if eschema.rdef(rschema).cardinality[0] == '1':
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    65
            broken_eids = sql('SELECT cw_eid FROM cw_%(e)s WHERE cw_%(r)s IS NULL' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    66
                              ask_confirm=False)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    67
            if broken_eids:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    68
                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
    69
                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
    70
                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
    71
            broken_eids = sql('SELECT cw_eid FROM cw_%(e)s WHERE cw_%(r)s IN (SELECT cw_%(r)s FROM cw_%(e)s '
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    72
                              'EXCEPT SELECT eid FROM entities)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    73
                              ask_confirm=False)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    74
            if broken_eids:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    75
                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
    76
                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
    77
                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
    78
        else:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    79
            if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    80
                   '    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
    81
                   '  EXCEPT'
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    82
                   '    SELECT eid FROM entities) AS eids' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    83
                   ask_confirm=False)[0][0]:
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    84
                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
    85
                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
    86
                    '(SELECT cw_%(r)s FROM cw_%(e)s EXCEPT SELECT eid FROM entities)' % args)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    87
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    88
        if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    89
            sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS %(c)s' % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    90
                ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    91
        elif repo.system_source.dbdriver.startswith('sqlserver'):
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    92
            sql("IF OBJECT_ID('%(c)s', 'F') IS NOT NULL "
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    93
                "ALTER TABLE cw_%(e)s DROP CONSTRAINT %(c)s" % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    94
                ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    95
        sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s '
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    96
            'FOREIGN KEY (cw_%(r)s) references entities(eid)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    97
            ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    98
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    99
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   100
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
   101
    args = {'e': eschema.type}
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   102
    if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   103
           '    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
   104
           '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   105
           '    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
   106
           ask_confirm=False)[0][0]:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   107
        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
   108
        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
   109
            '(SELECT cw_eid FROM cw_%(e)s EXCEPT SELECT eid FROM entities)' % args)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   110
    args['c'] = 'cw_%(e)s_cw_eid_fkey' % args
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   111
    if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   112
        sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS %(c)s' % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   113
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   114
    elif repo.system_source.dbdriver.startswith('sqlserver'):
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   115
        sql("IF OBJECT_ID('%(c)s', 'F') IS NOT NULL "
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   116
            "ALTER TABLE cw_%(e)s DROP CONSTRAINT %(c)s" % args,
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   117
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   118
    sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s '
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
   119
        'FOREIGN KEY (cw_eid) REFERENCES entities (eid)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
   120
        ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   121
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   122
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   123
add_foreign_keys()
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   124
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   125
cu = session.cnxset.cu
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   126
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
   127
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   128
helper.drop_index(cu, 'entities', 'extid', False)
10626
93f8d239c708 [server] use sqls_create_multicol_unique_index to index entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents: 10556
diff changeset
   129
# don't use create_index because it doesn't work for columns that may be NULL
93f8d239c708 [server] use sqls_create_multicol_unique_index to index entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents: 10556
diff changeset
   130
# on sqlserver
93f8d239c708 [server] use sqls_create_multicol_unique_index to index entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents: 10556
diff changeset
   131
for query in helper.sqls_create_multicol_unique_index('entities', ['extid']):
93f8d239c708 [server] use sqls_create_multicol_unique_index to index entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents: 10556
diff changeset
   132
    cu.execute(query)
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
   133
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   134
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
   135
    sql('''
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   136
    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
   137
      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
   138
      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
   139
    )
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   140
    ''')
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
   141
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
   142
moved_entities = sql('SELECT -eid, extid FROM entities WHERE eid < 0',
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
   143
                     ask_confirm=False)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   144
if moved_entities:
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   145
    cu.executemany('INSERT INTO moved_entities (eid, extid) VALUES (%s, %s)',
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   146
                   moved_entities)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   147
    sql('DELETE FROM entities WHERE eid < 0')
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
   148
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   149
commit()
10316
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   150
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   151
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
   152
88577b10b31e [schema] add a unique index on cwuri
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10316
diff changeset
   153
sync_schema_props_perms('cwuri')
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   154
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   155
from cubicweb.server.schema2sql import check_constraint
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   156
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   157
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
   158
    cwrdef = cwconstraint.reverse_constrained_by[0]
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   159
    rdef = cwrdef.yams_schema()
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   160
    cstr = rdef.constraint_by_eid(cwconstraint.eid)
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   161
    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
   162
        continue
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   163
    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
   164
            cstr, helper, prefix='cw_')
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   165
    args = {'e': rdef.subject.type, 'c': cstrname, 'v': check}
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   166
    if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   167
        sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS %(c)s' % args)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   168
    elif repo.system_source.dbdriver.startswith('sqlserver'):
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   169
        sql("IF OBJECT_ID('%(c)s', 'C') IS NOT NULL "
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   170
            "ALTER TABLE cw_%(e)s DROP CONSTRAINT %(c)s" % args)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   171
    sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s CHECK(%(v)s)' % args)
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   172
commit()