alembic: Turn off execute bit on non-executable python scripts
[asterisk/asterisk.git] / contrib / ast-db-manage / env.py
1 from __future__ import with_statement
2 from alembic import context
3 from alembic.script import ScriptDirectory
4 from alembic.operations import Operations
5 from sqlalchemy import engine_from_config, pool
6 from logging.config import fileConfig
7 import logging
8
9 # this is the Alembic Config object, which provides
10 # access to the values within the .ini file in use.
11 config = context.config
12
13 # Interpret the config file for Python logging.
14 # This line sets up loggers basically.
15 try:
16     fileConfig(config.config_file_name)
17 except:
18     pass
19
20 logger = logging.getLogger('alembic.runtime.setup')
21 # add your model's MetaData object here
22 # for 'autogenerate' support
23 # from myapp import mymodel
24 # target_metadata = mymodel.Base.metadata
25 target_metadata = None
26
27 # other values from the config, defined by the needs of env.py,
28 # can be acquired:
29 # my_important_option = config.get_main_option("my_important_option")
30 # ... etc.
31
32 def run_migrations_offline():
33     """Run migrations in 'offline' mode.
34
35     This configures the context with just a URL
36     and not an Engine, though an Engine is acceptable
37     here as well.  By skipping the Engine creation
38     we don't even need a DBAPI to be available.
39
40     Calls to context.execute() here emit the given string to the
41     script output.
42
43     """
44     url = config.get_main_option("sqlalchemy.url")
45     context.configure(url=url)
46
47     with context.begin_transaction():
48         context.run_migrations()
49
50 def run_migrations_online():
51     """Run migrations in 'online' mode.
52
53     In this scenario we need to create an Engine
54     and associate a connection with the context.
55
56     """
57     engine = engine_from_config(
58                 config.get_section(config.config_ini_section),
59                 prefix='sqlalchemy.',
60                 poolclass=pool.NullPool)
61
62     logger.info('Testing for an old alembic_version table.')
63
64     connection = engine.connect()
65     context.configure(
66                 connection=connection,
67                 target_metadata=target_metadata,
68                 version_table='alembic_version'
69                 )
70
71     script_location = config.get_main_option('script_location')
72     found = False
73     mc = context.get_context()
74     current_db_revision = mc.get_current_revision()
75     script = ScriptDirectory.from_config(config)
76     """ If there was an existing alembic_version table, we need to
77     check that it's current revision is in the history for the tree
78     we're working with.
79     """
80     for x in script.iterate_revisions('head', 'base'):
81         if x.revision == current_db_revision:
82             """ An alembic_versions table was found and it belongs to
83             this alembic tree
84             """
85             logger.info(
86                 ('An old alembic_version table at revision %s was '
87                  'found for %s.  Renaming to alembic_version_%s.'),
88                         current_db_revision, script_location,
89                         script_location)
90             op = Operations(mc)
91             try:
92                 with context.begin_transaction():
93                     op.rename_table(
94                         'alembic_version', 'alembic_version_%s'
95                         % script_location)
96                 found = True
97             except:
98                 logger.error(('Unable to rename alembic_version to '
99                              'alembic_version_%s.'),
100                              script_location)
101                 connection.close()
102                 return
103
104             break
105
106     if not found:
107         logger.info('Didn\'t find an old alembic_version table.')
108     logger.info('Trying alembic_version_%s.' % script_location)
109
110     """ We MAY have an alembic_version table that doesn't belong to
111     this tree but if we still don't have an alembic_version_<tree>
112     table, alembic will create it.
113     """
114     context.configure(
115                 connection=connection,
116                 target_metadata=target_metadata,
117                 version_table='alembic_version_' + script_location
118                 )
119     mc = context.get_context()
120     current_db_revision = mc.get_current_revision()
121     if current_db_revision:
122         logger.info(
123             'Using the alembic_version_%s table at revision %s.',
124             script_location, current_db_revision)
125     else:
126         logger.info('Creating new alembic_version_%s table.',
127                     script_location)
128
129     try:
130         with context.begin_transaction():
131             context.run_migrations()
132     finally:
133         connection.close()
134
135
136 if context.is_offline_mode():
137     run_migrations_offline()
138 else:
139     run_migrations_online()
140