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()
|