2013-08-29 12:30:07 +00:00
|
|
|
#
|
|
|
|
# Asterisk -- An open source telephony toolkit.
|
|
|
|
#
|
|
|
|
# Copyright (C) 2013, Russell Bryant
|
|
|
|
#
|
2021-10-30 21:04:41 -04:00
|
|
|
# Russell Bryant <russell@russellbryant.net>
|
2013-08-29 12:30:07 +00:00
|
|
|
#
|
|
|
|
# See http://www.asterisk.org for more information about
|
|
|
|
# the Asterisk project. Please do not directly contact
|
|
|
|
# any of the maintainers of this project for assistance;
|
|
|
|
# the project provides a web site, mailing lists and IRC
|
|
|
|
# channels for your use.
|
|
|
|
#
|
|
|
|
# This program is free software, distributed under the terms of
|
|
|
|
# the GNU General Public License Version 2. See the LICENSE file
|
|
|
|
# at the top of the source tree.
|
|
|
|
#
|
|
|
|
|
|
|
|
"""Create tables
|
|
|
|
|
|
|
|
Revision ID: 4da0c5f79a9c
|
|
|
|
Revises: None
|
|
|
|
Create Date: 2013-07-28 12:28:03.091587
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
|
|
revision = '4da0c5f79a9c'
|
|
|
|
down_revision = None
|
|
|
|
|
|
|
|
from alembic import op
|
|
|
|
import sqlalchemy as sa
|
2024-03-15 13:17:57 -04:00
|
|
|
from sqlalchemy.sql import quoted_name
|
alembic: Fix downgrade and tweak for sqlite
Downgrade had a few issues. First there was an errant 'update' statement in
add_auto_dtmf_mode that looks like it was a copy/paste error. Second, we
weren't cleaning up the ENUMs so subsequent upgrades on postgres failed
because the types already existed.
For sqlite... sqlite doesn't support ALTER or DROP COLUMN directly.
Fortunately alembic batch_operations takes care of this for us if we
use it so the alter and drops were converted to use batch operations.
Here's an example downgrade:
with op.batch_alter_table('ps_endpoints') as batch_op:
batch_op.drop_column('tos_audio')
batch_op.drop_column('tos_video')
batch_op.add_column(sa.Column('tos_audio', yesno_values))
batch_op.add_column(sa.Column('tos_video', yesno_values))
batch_op.drop_column('cos_audio')
batch_op.drop_column('cos_video')
batch_op.add_column(sa.Column('cos_audio', yesno_values))
batch_op.add_column(sa.Column('cos_video', yesno_values))
with op.batch_alter_table('ps_transports') as batch_op:
batch_op.drop_column('tos')
batch_op.add_column(sa.Column('tos', yesno_values))
# Can't cast integers to YESNO_VALUES, so dropping and adding is required
batch_op.drop_column('cos')
batch_op.add_column(sa.Column('cos', yesno_values))
Upgrades from base to head and downgrades from head to base were tested
repeatedly for postgresql, mysql/mariadb, and sqlite3.
Change-Id: I862b0739eb3fd45ec3412dcc13c2340e1b7baef8
2016-03-01 19:03:04 -07:00
|
|
|
from sqlalchemy.dialects.postgresql import ENUM
|
2013-08-29 12:30:07 +00:00
|
|
|
|
|
|
|
YESNO_VALUES = ['yes', 'no']
|
|
|
|
TYPE_VALUES = ['friend', 'user', 'peer']
|
|
|
|
|
|
|
|
SIP_TRANSPORT_VALUES = ['udp', 'tcp', 'tls', 'ws', 'wss', 'udp,tcp', 'tcp,udp']
|
|
|
|
SIP_DTMFMODE_VALUES = ['rfc2833', 'info', 'shortinfo', 'inband', 'auto']
|
|
|
|
SIP_DIRECTMEDIA_VALUES = ['yes', 'no', 'nonat', 'update']
|
|
|
|
SIP_PROGRESSINBAND_VALUES = ['yes', 'no', 'never']
|
|
|
|
SIP_SESSION_TIMERS_VALUES = ['accept', 'refuse', 'originate']
|
|
|
|
SIP_SESSION_REFRESHER_VALUES = ['uac', 'uas']
|
|
|
|
SIP_CALLINGPRES_VALUES = ['allowed_not_screened', 'allowed_passed_screen',
|
|
|
|
'allowed_failed_screen', 'allowed',
|
|
|
|
'prohib_not_screened', 'prohib_passed_screen',
|
|
|
|
'prohib_failed_screen', 'prohib']
|
|
|
|
|
|
|
|
IAX_REQUIRECALLTOKEN_VALUES = ['yes', 'no', 'auto']
|
|
|
|
IAX_ENCRYPTION_VALUES = ['yes', 'no', 'aes128']
|
|
|
|
IAX_TRANSFER_VALUES = ['yes', 'no', 'mediaonly']
|
|
|
|
|
|
|
|
MOH_MODE_VALUES = ['custom', 'files', 'mp3nb', 'quietmp3nb', 'quietmp3']
|
|
|
|
|
|
|
|
|
|
|
|
def upgrade():
|
|
|
|
op.create_table(
|
|
|
|
'sippeers',
|
|
|
|
sa.Column('id', sa.Integer, primary_key=True, nullable=False,
|
|
|
|
autoincrement=True),
|
|
|
|
sa.Column('name', sa.String(40), nullable=False, unique=True),
|
|
|
|
sa.Column('ipaddr', sa.String(45)),
|
|
|
|
sa.Column('port', sa.Integer),
|
|
|
|
sa.Column('regseconds', sa.Integer),
|
|
|
|
sa.Column('defaultuser', sa.String(40)),
|
|
|
|
sa.Column('fullcontact', sa.String(80)),
|
|
|
|
sa.Column('regserver', sa.String(20)),
|
|
|
|
sa.Column('useragent', sa.String(20)),
|
|
|
|
sa.Column('lastms', sa.Integer),
|
|
|
|
sa.Column('host', sa.String(40)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('type', sa.Enum(*TYPE_VALUES, name='type_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('context', sa.String(40)),
|
|
|
|
sa.Column('permit', sa.String(95)),
|
|
|
|
sa.Column('deny', sa.String(95)),
|
|
|
|
sa.Column('secret', sa.String(40)),
|
|
|
|
sa.Column('md5secret', sa.String(40)),
|
|
|
|
sa.Column('remotesecret', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('transport', sa.Enum(*SIP_TRANSPORT_VALUES,
|
|
|
|
name='sip_transport_values')),
|
|
|
|
sa.Column('dtmfmode', sa.Enum(*SIP_DTMFMODE_VALUES,
|
|
|
|
name='sip_dtmfmode_values')),
|
|
|
|
sa.Column('directmedia', sa.Enum(*SIP_DIRECTMEDIA_VALUES,
|
|
|
|
name='sip_directmedia_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('nat', sa.String(29)),
|
|
|
|
sa.Column('callgroup', sa.String(40)),
|
|
|
|
sa.Column('pickupgroup', sa.String(40)),
|
|
|
|
sa.Column('language', sa.String(40)),
|
|
|
|
sa.Column('disallow', sa.String(200)),
|
|
|
|
sa.Column('allow', sa.String(200)),
|
|
|
|
sa.Column('insecure', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('trustrpid', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('progressinband', sa.Enum(*SIP_PROGRESSINBAND_VALUES,
|
|
|
|
name='sip_progressinband_values')),
|
|
|
|
sa.Column('promiscredir', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('useclientcode', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('accountcode', sa.String(40)),
|
|
|
|
sa.Column('setvar', sa.String(200)),
|
|
|
|
sa.Column('callerid', sa.String(40)),
|
|
|
|
sa.Column('amaflags', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('callcounter', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('busylevel', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('allowoverlap', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('allowsubscribe', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('videosupport', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('maxcallbitrate', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('rfc2833compensate', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('mailbox', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('session-timers', sa.Enum(*SIP_SESSION_TIMERS_VALUES,
|
|
|
|
name='sip_session_timers_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('session-expires', sa.Integer),
|
|
|
|
sa.Column('session-minse', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('session-refresher', sa.Enum(*SIP_SESSION_REFRESHER_VALUES,
|
|
|
|
name='sip_session_refresher_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('t38pt_usertpsource', sa.String(40)),
|
|
|
|
sa.Column('regexten', sa.String(40)),
|
|
|
|
sa.Column('fromdomain', sa.String(40)),
|
|
|
|
sa.Column('fromuser', sa.String(40)),
|
2024-03-15 13:17:57 -04:00
|
|
|
sa.Column(quoted_name('qualify', True), sa.String(40)),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('defaultip', sa.String(45)),
|
|
|
|
sa.Column('rtptimeout', sa.Integer),
|
|
|
|
sa.Column('rtpholdtimeout', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('sendrpid', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('outboundproxy', sa.String(40)),
|
|
|
|
sa.Column('callbackextension', sa.String(40)),
|
|
|
|
sa.Column('timert1', sa.Integer),
|
|
|
|
sa.Column('timerb', sa.Integer),
|
|
|
|
sa.Column('qualifyfreq', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('constantssrc', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('contactpermit', sa.String(95)),
|
|
|
|
sa.Column('contactdeny', sa.String(95)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('usereqphone', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
|
|
|
sa.Column('textsupport', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
|
|
|
sa.Column('faxdetect', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
|
|
|
sa.Column('buggymwi', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('auth', sa.String(40)),
|
|
|
|
sa.Column('fullname', sa.String(40)),
|
|
|
|
sa.Column('trunkname', sa.String(40)),
|
|
|
|
sa.Column('cid_number', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('callingpres', sa.Enum(*SIP_CALLINGPRES_VALUES,
|
|
|
|
name='sip_callingpres_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('mohinterpret', sa.String(40)),
|
|
|
|
sa.Column('mohsuggest', sa.String(40)),
|
|
|
|
sa.Column('parkinglot', sa.String(40)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('hasvoicemail', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('subscribemwi', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('vmexten', sa.String(40)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('autoframing', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('rtpkeepalive', sa.Integer),
|
|
|
|
sa.Column('call-limit', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('g726nonstandard', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('ignoresdpversion', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('allowtransfer', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('dynamic', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('path', sa.String(256)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('supportpath', sa.Enum(*YESNO_VALUES, name='yes_no_values'))
|
2013-08-29 12:30:07 +00:00
|
|
|
)
|
|
|
|
op.create_index('sippeers_name', 'sippeers', ['name'])
|
|
|
|
op.create_index('sippeers_name_host', 'sippeers', ['name', 'host'])
|
|
|
|
op.create_index('sippeers_ipaddr_port', 'sippeers', ['ipaddr', 'port'])
|
|
|
|
op.create_index('sippeers_host_port', 'sippeers', ['host', 'port'])
|
|
|
|
|
|
|
|
op.create_table(
|
|
|
|
'iaxfriends',
|
|
|
|
sa.Column('id', sa.Integer, primary_key=True, nullable=False,
|
|
|
|
autoincrement=True),
|
|
|
|
sa.Column('name', sa.String(40), nullable=False, unique=True),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('type', sa.Enum(*TYPE_VALUES, name='type_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('username', sa.String(40)),
|
|
|
|
sa.Column('mailbox', sa.String(40)),
|
|
|
|
sa.Column('secret', sa.String(40)),
|
|
|
|
sa.Column('dbsecret', sa.String(40)),
|
|
|
|
sa.Column('context', sa.String(40)),
|
|
|
|
sa.Column('regcontext', sa.String(40)),
|
|
|
|
sa.Column('host', sa.String(40)),
|
|
|
|
sa.Column('ipaddr', sa.String(40)),
|
|
|
|
sa.Column('port', sa.Integer),
|
|
|
|
sa.Column('defaultip', sa.String(20)),
|
|
|
|
sa.Column('sourceaddress', sa.String(20)),
|
|
|
|
sa.Column('mask', sa.String(20)),
|
|
|
|
sa.Column('regexten', sa.String(40)),
|
|
|
|
sa.Column('regseconds', sa.Integer),
|
|
|
|
sa.Column('accountcode', sa.String(20)),
|
|
|
|
sa.Column('mohinterpret', sa.String(20)),
|
|
|
|
sa.Column('mohsuggest', sa.String(20)),
|
|
|
|
sa.Column('inkeys', sa.String(40)),
|
|
|
|
sa.Column('outkeys', sa.String(40)),
|
|
|
|
sa.Column('language', sa.String(10)),
|
|
|
|
sa.Column('callerid', sa.String(100)),
|
|
|
|
sa.Column('cid_number', sa.String(40)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('sendani', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('fullname', sa.String(40)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('trunk', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('auth', sa.String(20)),
|
|
|
|
sa.Column('maxauthreq', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('requirecalltoken', sa.Enum(*IAX_REQUIRECALLTOKEN_VALUES,
|
|
|
|
name='iax_requirecalltoken_values')),
|
|
|
|
sa.Column('encryption', sa.Enum(*IAX_ENCRYPTION_VALUES,
|
|
|
|
name='iax_encryption_values')),
|
|
|
|
sa.Column('transfer', sa.Enum(*IAX_TRANSFER_VALUES,
|
|
|
|
name='iax_transfer_values')),
|
|
|
|
sa.Column('jitterbuffer', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('forcejitterbuffer', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('disallow', sa.String(200)),
|
|
|
|
sa.Column('allow', sa.String(200)),
|
|
|
|
sa.Column('codecpriority', sa.String(40)),
|
2024-03-15 13:17:57 -04:00
|
|
|
sa.Column(quoted_name('qualify', True), sa.String(10)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('qualifysmoothing',
|
|
|
|
sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('qualifyfreqok', sa.String(10)),
|
|
|
|
sa.Column('qualifyfreqnotok', sa.String(10)),
|
|
|
|
sa.Column('timezone', sa.String(20)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('adsi', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('amaflags', sa.String(20)),
|
|
|
|
sa.Column('setvar', sa.String(200))
|
|
|
|
)
|
|
|
|
op.create_index('iaxfriends_name', 'iaxfriends', ['name'])
|
|
|
|
op.create_index('iaxfriends_name_host', 'iaxfriends', ['name', 'host'])
|
|
|
|
op.create_index('iaxfriends_name_ipaddr_port', 'iaxfriends',
|
|
|
|
['name', 'ipaddr', 'port'])
|
|
|
|
op.create_index('iaxfriends_ipaddr_port', 'iaxfriends', ['ipaddr', 'port'])
|
|
|
|
op.create_index('iaxfriends_host_port', 'iaxfriends', ['host', 'port'])
|
|
|
|
|
|
|
|
op.create_table(
|
|
|
|
'voicemail',
|
|
|
|
sa.Column('uniqueid', sa.Integer, primary_key=True, nullable=False,
|
|
|
|
autoincrement=True),
|
|
|
|
sa.Column('context', sa.String(80), nullable=False),
|
|
|
|
sa.Column('mailbox', sa.String(80), nullable=False),
|
|
|
|
sa.Column('password', sa.String(80), nullable=False),
|
|
|
|
sa.Column('fullname', sa.String(80)),
|
|
|
|
sa.Column('alias', sa.String(80)),
|
|
|
|
sa.Column('email', sa.String(80)),
|
|
|
|
sa.Column('pager', sa.String(80)),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('attach', sa.Enum(*YESNO_VALUES, name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('attachfmt', sa.String(10)),
|
|
|
|
sa.Column('serveremail', sa.String(80)),
|
|
|
|
sa.Column('language', sa.String(20)),
|
|
|
|
sa.Column('tz', sa.String(30)),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('deletevoicemail', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('saycid', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('sendvoicemail', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('review', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('tempgreetwarn', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('operator', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('envelope', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('sayduration', sa.Integer),
|
2013-10-04 18:13:37 +00:00
|
|
|
sa.Column('forcename', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
|
|
|
sa.Column('forcegreetings', sa.Enum(*YESNO_VALUES,
|
|
|
|
name='yes_no_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('callback', sa.String(80)),
|
|
|
|
sa.Column('dialout', sa.String(80)),
|
|
|
|
sa.Column('exitcontext', sa.String(80)),
|
|
|
|
sa.Column('maxmsg', sa.Integer),
|
|
|
|
sa.Column('volgain', sa.Numeric(precision=5, scale=2)),
|
|
|
|
sa.Column('imapuser', sa.String(80)),
|
|
|
|
sa.Column('imappassword', sa.String(80)),
|
|
|
|
sa.Column('imapserver', sa.String(80)),
|
|
|
|
sa.Column('imapport', sa.String(8)),
|
|
|
|
sa.Column('imapflags', sa.String(80)),
|
|
|
|
sa.Column('stamp', sa.DateTime())
|
|
|
|
)
|
|
|
|
op.create_index('voicemail_mailbox', 'voicemail', ['mailbox'])
|
|
|
|
op.create_index('voicemail_context', 'voicemail', ['context'])
|
2013-10-04 18:13:37 +00:00
|
|
|
op.create_index('voicemail_mailbox_context', 'voicemail',
|
|
|
|
['mailbox', 'context'])
|
2013-08-29 12:30:07 +00:00
|
|
|
op.create_index('voicemail_imapuser', 'voicemail', ['imapuser'])
|
|
|
|
|
|
|
|
op.create_table(
|
|
|
|
'meetme',
|
|
|
|
sa.Column('bookid', sa.Integer, primary_key=True, nullable=False,
|
|
|
|
autoincrement=True),
|
|
|
|
sa.Column('confno', sa.String(80), nullable=False),
|
|
|
|
sa.Column('starttime', sa.DateTime()),
|
|
|
|
sa.Column('endtime', sa.DateTime()),
|
|
|
|
sa.Column('pin', sa.String(20)),
|
|
|
|
sa.Column('adminpin', sa.String(20)),
|
|
|
|
sa.Column('opts', sa.String(20)),
|
|
|
|
sa.Column('adminopts', sa.String(20)),
|
|
|
|
sa.Column('recordingfilename', sa.String(80)),
|
|
|
|
sa.Column('recordingformat', sa.String(10)),
|
|
|
|
sa.Column('maxusers', sa.Integer),
|
|
|
|
sa.Column('members', sa.Integer, nullable=False, default=0)
|
|
|
|
)
|
2013-10-27 02:39:34 +00:00
|
|
|
op.create_index('meetme_confno_start_end', 'meetme',
|
2013-08-29 12:30:07 +00:00
|
|
|
['confno', 'starttime', 'endtime'])
|
|
|
|
|
|
|
|
op.create_table(
|
|
|
|
'musiconhold',
|
|
|
|
sa.Column('name', sa.String(80), primary_key=True, nullable=False),
|
2013-10-27 02:39:34 +00:00
|
|
|
sa.Column('mode', sa.Enum(*MOH_MODE_VALUES, name='moh_mode_values')),
|
2013-08-29 12:30:07 +00:00
|
|
|
sa.Column('directory', sa.String(255)),
|
|
|
|
sa.Column('application', sa.String(255)),
|
|
|
|
sa.Column('digit', sa.String(1)),
|
|
|
|
sa.Column('sort', sa.String(10)),
|
|
|
|
sa.Column('format', sa.String(10)),
|
|
|
|
sa.Column('stamp', sa.DateTime())
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def downgrade():
|
alembic: Fix downgrade and tweak for sqlite
Downgrade had a few issues. First there was an errant 'update' statement in
add_auto_dtmf_mode that looks like it was a copy/paste error. Second, we
weren't cleaning up the ENUMs so subsequent upgrades on postgres failed
because the types already existed.
For sqlite... sqlite doesn't support ALTER or DROP COLUMN directly.
Fortunately alembic batch_operations takes care of this for us if we
use it so the alter and drops were converted to use batch operations.
Here's an example downgrade:
with op.batch_alter_table('ps_endpoints') as batch_op:
batch_op.drop_column('tos_audio')
batch_op.drop_column('tos_video')
batch_op.add_column(sa.Column('tos_audio', yesno_values))
batch_op.add_column(sa.Column('tos_video', yesno_values))
batch_op.drop_column('cos_audio')
batch_op.drop_column('cos_video')
batch_op.add_column(sa.Column('cos_audio', yesno_values))
batch_op.add_column(sa.Column('cos_video', yesno_values))
with op.batch_alter_table('ps_transports') as batch_op:
batch_op.drop_column('tos')
batch_op.add_column(sa.Column('tos', yesno_values))
# Can't cast integers to YESNO_VALUES, so dropping and adding is required
batch_op.drop_column('cos')
batch_op.add_column(sa.Column('cos', yesno_values))
Upgrades from base to head and downgrades from head to base were tested
repeatedly for postgresql, mysql/mariadb, and sqlite3.
Change-Id: I862b0739eb3fd45ec3412dcc13c2340e1b7baef8
2016-03-01 19:03:04 -07:00
|
|
|
context = op.get_context()
|
|
|
|
|
2013-08-29 12:30:07 +00:00
|
|
|
op.drop_table('sippeers')
|
|
|
|
op.drop_table('iaxfriends')
|
|
|
|
op.drop_table('voicemail')
|
|
|
|
op.drop_table('meetme')
|
|
|
|
op.drop_table('musiconhold')
|
alembic: Fix downgrade and tweak for sqlite
Downgrade had a few issues. First there was an errant 'update' statement in
add_auto_dtmf_mode that looks like it was a copy/paste error. Second, we
weren't cleaning up the ENUMs so subsequent upgrades on postgres failed
because the types already existed.
For sqlite... sqlite doesn't support ALTER or DROP COLUMN directly.
Fortunately alembic batch_operations takes care of this for us if we
use it so the alter and drops were converted to use batch operations.
Here's an example downgrade:
with op.batch_alter_table('ps_endpoints') as batch_op:
batch_op.drop_column('tos_audio')
batch_op.drop_column('tos_video')
batch_op.add_column(sa.Column('tos_audio', yesno_values))
batch_op.add_column(sa.Column('tos_video', yesno_values))
batch_op.drop_column('cos_audio')
batch_op.drop_column('cos_video')
batch_op.add_column(sa.Column('cos_audio', yesno_values))
batch_op.add_column(sa.Column('cos_video', yesno_values))
with op.batch_alter_table('ps_transports') as batch_op:
batch_op.drop_column('tos')
batch_op.add_column(sa.Column('tos', yesno_values))
# Can't cast integers to YESNO_VALUES, so dropping and adding is required
batch_op.drop_column('cos')
batch_op.add_column(sa.Column('cos', yesno_values))
Upgrades from base to head and downgrades from head to base were tested
repeatedly for postgresql, mysql/mariadb, and sqlite3.
Change-Id: I862b0739eb3fd45ec3412dcc13c2340e1b7baef8
2016-03-01 19:03:04 -07:00
|
|
|
|
|
|
|
enums = ['type_values', 'yes_no_values',
|
|
|
|
'sip_transport_values','sip_dtmfmode_values','sip_directmedia_values',
|
|
|
|
'sip_progressinband_values','sip_session_timers_values','sip_session_refresher_values',
|
|
|
|
'sip_callingpres_values','iax_requirecalltoken_values','iax_encryption_values',
|
|
|
|
'iax_transfer_values','moh_mode_values']
|
|
|
|
|
|
|
|
if context.bind.dialect.name == 'postgresql':
|
|
|
|
for e in enums:
|
|
|
|
ENUM(name=e).drop(op.get_bind(), checkfirst=False)
|