cubicweb/misc/migration/3.21.0_Any.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Thu, 21 Mar 2019 14:33:54 +0100
changeset 12530 9d88e1177c35
parent 11774 51c160677afe
permissions -rw-r--r--
Remove Twisted web server Twisted web server is not used anymore and has been superseded by pyramid many years ago. Furthermore, our usage is not compatible with Python 3. So we drop the "etwist" sub-package. As a consequence, "all-in-one" configuration type gets dropped as it was Twisted-specific. We resurrect it in cubicweb/pyramid/config.py by only keeping options used by the "pyramid". Similarly, we introduce a AllInOneCreateHandler in cubicweb/pyramid/pyramidctl.py that is basically the one that lived in cubicweb/etwist/twctl.py and is used to create the "all-in-one" instance. Added a TODO here about "pyramid.ini" that could be generated at the end of bootstrap() method. In cubicweb/devtools/httptest.py, CubicWebServerTC is now equivalent to CubicWebWsgiTC and the latter is dropped.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
     1
from __future__ import print_function
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
     2
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     3
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
     4
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
     5
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     6
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
     7
def add_foreign_keys():
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
     8
    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
     9
    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
    10
        return
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    11
    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
    12
        if rschema.inlined:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    13
            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
    14
        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
    15
            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
    16
    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
    17
        if eschema.final:
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    18
            continue
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    19
        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
    20
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    21
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    22
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
    23
    args = {'r': rschema.type}
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    24
    count = sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    25
                '    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
    26
                '  UNION'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    27
                '    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
    28
                '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    29
                '    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
    30
                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
    31
    if count:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
    32
        print('%s references %d unknown entities, deleting' % (rschema, count))
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    33
        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
    34
            '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
    35
        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
    36
            '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
    37
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    38
    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
    39
    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
    40
    args['table'] = '%(r)s_relation' % args
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    41
    if repo.system_source.dbdriver == 'postgres':
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 %(from_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
        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
    45
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    46
    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
    47
        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
    48
            "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
    49
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    50
        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
    51
            "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
    52
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    53
    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
    54
        '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
    55
        ask_confirm=False)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    56
    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
    57
        '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
    58
        ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    59
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    60
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    61
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
    62
    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
    63
        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
    64
        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
    65
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    66
        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
    67
            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
    68
                              ask_confirm=False)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    69
            if broken_eids:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
    70
                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
    71
                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
    72
                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
    73
            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
    74
                              'EXCEPT SELECT eid FROM entities)' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    75
                              ask_confirm=False)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    76
            if broken_eids:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
    77
                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
    78
                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
    79
                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
    80
        else:
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    81
            if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    82
                   '    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
    83
                   '  EXCEPT'
10556
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    84
                   '    SELECT eid FROM entities) AS eids' % args,
8fbff2247816 [migration/3.21] ask fewer questions
Julien Cristau <julien.cristau@logilab.fr>
parents: 10538
diff changeset
    85
                   ask_confirm=False)[0][0]:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
    86
                print('%(e)s.%(r)s references unknown entities, deleting relation' % args)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
    87
                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
    88
                    '(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
    89
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    90
        if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    91
            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
    92
                ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
    93
        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
    94
            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
    95
                "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
    96
                ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
    97
        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
    98
            '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
    99
            ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   100
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   101
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   102
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
   103
    args = {'e': eschema.type}
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   104
    if sql('SELECT COUNT(*) FROM ('
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   105
           '    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
   106
           '  EXCEPT'
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   107
           '    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
   108
           ask_confirm=False)[0][0]:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10556
diff changeset
   109
        print('%(e)s has nonexistent entities, deleting' % args)
10490
76ab3c71aff2 [migration/3.21.0] performance and reliability fixes
Julien Cristau <julien.cristau@logilab.fr>
parents: 10484
diff changeset
   110
        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
   111
            '(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
   112
    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
   113
    if repo.system_source.dbdriver == 'postgres':
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   114
        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
   115
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   116
    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
   117
        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
   118
            "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
   119
            ask_confirm=False)
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   120
    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
   121
        '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
   122
        ask_confirm=False)
10482
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   123
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   124
88119421a09c [migration/3.21] Add missing foreign keys when upgrading
Julien Cristau <julien.cristau@logilab.fr>
parents: 10448
diff changeset
   125
add_foreign_keys()
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   126
10483
c8dbb845b465 [migration/3.21] Make index and table creation idempotent
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10482
diff changeset
   127
cu = session.cnxset.cu
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   128
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
   129
11757
e845746b4d3c [sources] Drop 'moved_entities' table handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11406
diff changeset
   130
sql('DELETE FROM entities WHERE eid < 0')
10208
249126034c0e Add unique index on entities.extid
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
   131
commit()
10316
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   132
4ce8b8437838 [schemas] make CWEType.final default to False (closes #5049201)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 10209
diff changeset
   133
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
   134
88577b10b31e [schema] add a unique index on cwuri
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10316
diff changeset
   135
sync_schema_props_perms('cwuri')
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   136
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   137
from cubicweb.server.schema2sql import check_constraint
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   138
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   139
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
   140
    cwrdef = cwconstraint.reverse_constrained_by[0]
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   141
    rdef = cwrdef.yams_schema()
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   142
    cstr = rdef.constraint_by_eid(cwconstraint.eid)
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   143
    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
   144
        continue
11406
8ed625765a5c [schema2sql] Give a rdef to check_constraint
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11129
diff changeset
   145
    cstrname, check = check_constraint(rdef, cstr, helper, prefix='cw_')
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   146
    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
   147
    if repo.system_source.dbdriver == 'postgres':
11108
c14087d08698 [migration] don't ask confirm for those sql queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10651
diff changeset
   148
        sql('ALTER TABLE cw_%(e)s DROP CONSTRAINT IF EXISTS %(c)s' % args, ask_confirm=False)
10628
8f32cdc3f4ec [migration/3.21] add support for sqlserver
Julien Cristau <julien.cristau@logilab.fr>
parents: 10626
diff changeset
   149
    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
   150
        sql("IF OBJECT_ID('%(c)s', 'C') IS NOT NULL "
11108
c14087d08698 [migration] don't ask confirm for those sql queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10651
diff changeset
   151
            "ALTER TABLE cw_%(e)s DROP CONSTRAINT %(c)s" % args, ask_confirm=False)
c14087d08698 [migration] don't ask confirm for those sql queries
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10651
diff changeset
   152
    sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s CHECK(%(v)s)' % args, ask_confirm=False)
10448
de5be53e2ea8 [migration] add sql constraints on upgrade
Julien Cristau <julien.cristau@logilab.fr>
parents: 10371
diff changeset
   153
commit()