cubicweb/misc/migration/3.23.0_Any.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Wed, 22 Jun 2016 07:57:13 +0200
changeset 11360 49aca289134f
parent 11215 4e79acdc36a6
child 11363 e5fe836df6f1
permissions -rw-r--r--
[sql gen] Control size of index name using an md5 hash When using concatenation of table and column, we may hit the backend size limit on index names, which results on truncated name (64 for postgres). Then we may have conflict or be unable to find expected index on later synchronization attempt. This is done by monkeypatching lgdb for now to avoid dependancy problems. Unique and primary key indices of entity types handling is left to the backend, as they are not explicitly named. See https://www.logilab.org/ticket/4789189 Closes #13821949
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11360
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     1
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     2
from functools import partial
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     3
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     4
from yams.constraints import UniqueConstraint
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     5
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     6
from cubicweb.schema import PURE_VIRTUAL_RTYPES
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     7
from cubicweb.server.schema2sql import build_index_name, check_constraint
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     8
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
     9
sql = partial(sql, ask_confirm=False)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    10
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    11
source = repo.system_source
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    12
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    13
for rschema in schema.relations():
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    14
    if rschema.rule or rschema in PURE_VIRTUAL_RTYPES:
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    15
        continue
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    16
    if rschema.final or rschema.inlined:
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    17
        for rdef in rschema.rdefs.values():
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    18
            table = 'cw_{0}'.format(rdef.subject)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    19
            column = 'cw_{0}'.format(rdef.rtype)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    20
            if any(isinstance(cstr, UniqueConstraint) for cstr in rdef.constraints):
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    21
                old_name = '%s_%s_key' % (table.lower(), column.lower())
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    22
                sql('ALTER TABLE %s DROP CONSTRAINT %s' % (table, old_name))
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    23
                source.create_index(cnx, table, column, unique=True)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    24
            if rschema.inlined or rdef.indexed:
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    25
                old_name = '%s_%s_idx' % (table.lower(), column.lower())
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    26
                sql('DROP INDEX IF EXISTS %s' % old_name)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    27
                source.create_index(cnx, table, column)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    28
    else:
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    29
        table = '{0}_relation'.format(rschema)
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    30
        sql('ALTER TABLE %s DROP CONSTRAINT IF EXISTS %s_p_key' % (table, table))
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    31
        sql('ALTER TABLE %s ADD CONSTRAINT %s PRIMARY KEY(eid_from, eid_to)'
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    32
            % (table, build_index_name(table, ['eid_from', 'eid_to'], 'key_')))
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    33
        for column in ('from', 'to'):
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    34
            sql('DROP INDEX IF EXISTS %s_%s_idx' % (table, column))
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    35
            sql('CREATE INDEX %s ON %s(eid_%s);'
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    36
                % (build_index_name(table, ['eid_' + column], 'idx_'), table, column))
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    37
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    38
11215
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    39
# we changed constraint serialization, which also changes their name
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    40
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    41
helper = repo.system_source.dbhelper
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    42
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    43
for table, cstr in sql("""
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    44
    SELECT table_name, constraint_name FROM information_schema.constraint_column_usage
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    45
    WHERE constraint_name LIKE 'cstr%'"""):
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    46
    sql("ALTER TABLE %(table)s DROP CONSTRAINT %(cstr)s" % locals())
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    47
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    48
for cwconstraint in rql('Any C WHERE R constrained_by C').entities():
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    49
    cwrdef = cwconstraint.reverse_constrained_by[0]
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    50
    rdef = cwrdef.yams_schema()
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    51
    cstr = rdef.constraint_by_eid(cwconstraint.eid)
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    52
    if cstr.type() not in ('BoundaryConstraint', 'IntervalBoundConstraint',
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    53
                           'StaticVocabularyConstraint'):
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    54
        # These cannot be translate into backend CHECK.
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    55
        continue
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    56
    cstrname, check = check_constraint(rdef.subject, rdef.object, rdef.rtype.type,
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    57
                                       cstr, helper, prefix='cw_')
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    58
    args = {'e': rdef.subject.type, 'c': cstrname, 'v': check}
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    59
    sql('ALTER TABLE cw_%(e)s ADD CONSTRAINT %(c)s CHECK(%(v)s)' % args)
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    60
4e79acdc36a6 [schema] use json to serialize constraints
Julien Cristau <julien.cristau@logilab.fr>
parents:
diff changeset
    61
commit()
11360
49aca289134f [sql gen] Control size of index name using an md5 hash
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11215
diff changeset
    62