aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/migrate/versions/017_restore_other_indices.py
blob: 59d2f8aae177f415137f8900cfd279e7549150bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# This file is part of Buildbot.  Buildbot is free software: you can
# redistribute it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright Buildbot Team Members

import sqlalchemy as sa

def upgrade(migrate_engine):
    metadata = sa.MetaData()
    metadata.bind = migrate_engine

    # the column changes in 010_fix_column_lengths.py unfortunately also drop a
    # great deal of other stuff on sqlite.  In particular, all indexes and
    # foreign keys on the 'changes' and 'schedulers' tables.
    #
    # The foreign keys do not matter anyway - SQLite tracks them but ignores
    # them.  The indices, however, are important, so they are re-added here,
    # but only for the sqlite dialect.

    if migrate_engine.dialect.name == 'sqlite':
        schedulers = sa.Table('schedulers', metadata, autoload=True)

        sa.Index('name_and_class',
                schedulers.c.name, schedulers.c.class_name).create()

        changes = sa.Table('changes', metadata, autoload=True)

        sa.Index('changes_branch', changes.c.branch).create()
        sa.Index('changes_revision', changes.c.revision).create()
        sa.Index('changes_author', changes.c.author).create()
        sa.Index('changes_category', changes.c.category).create()
        sa.Index('changes_when_timestamp', changes.c.when_timestamp).create()

        # These were implemented as UniqueConstraint objects, which are
        # recognized as indexes on non-sqlite DB's.  So add them as explicit
        # indexes on sqlite.

        objects = sa.Table('objects', metadata, autoload=True)
        sa.Index('object_identity', objects.c.name, objects.c.class_name,
                unique=True).create()

        object_state = sa.Table('object_state', metadata, autoload=True)
        sa.Index('name_per_object', object_state.c.objectid,
                object_state.c.name, unique=True).create()

    # Due to a coding bug in version 012, the users_identifier index is not
    # unique (on any DB).  SQLAlchemy-migrate does not provide an interface to
    # drop columns, so we fake it here.

    users = sa.Table('users', metadata, autoload=True)

    dialect = migrate_engine.dialect.name
    if dialect in ('sqlite', 'postgresql'):
        migrate_engine.execute("DROP INDEX users_identifier")
    elif dialect == 'mysql':
        migrate_engine.execute("DROP INDEX users_identifier ON users")

    sa.Index('users_identifier', users.c.identifier, unique=True).create()