-Asterisk Database Manager
-=========================
+# Asterisk Database Manager
Asterisk includes optional database integration for a variety of features.
The purpose of this effort is to assist in managing the database schema
Alembic uses SQLAlchemy, which has support for
[many databases](http://docs.sqlalchemy.org/en/rel_0_8/dialects/index.html).
-IMPORTANT NOTE: This is brand new and the initial migrations are still subject
-to change. Only use this for testing purposes for now.
-Example Usage
--------------
+## Example Usage
First, create an ini file that contains database connection details. For help
with connection string details, see the
$ alembic -c config.ini upgrade 4da0c5f79a9c
-Offline Mode
-------------
+## Offline Mode
If you would like to just generate the SQL statements that would have been
executed, you can use alembic's offline mode.
$ alembic -c config.ini upgrade head --sql
-Adding Database Migrations
---------------------------
+## Adding Database Migrations
The best way to learn about how to add additional database migrations is to
refer to the [Alembic documentation](http://alembic.readthedocs.org).
+
+### Notes
+
+* For boolean columns, always use the AST_BOOL_VALUES type.
+ Example:
+
+```
+from alembic import op
+import sqlalchemy as sa
+# This works for MySQL/MariaDB and others as well
+from sqlalchemy.dialects.postgresql import ENUM
+
+AST_BOOL_NAME = 'ast_bool_values'
+AST_BOOL_VALUES = [ '0', '1',
+ 'off', 'on',
+ 'false', 'true',
+ 'no', 'yes' ]
+
+def upgrade():
+ # ast_bool_values have already been created, so use postgres enum object type
+ # to get around "already created" issue - works okay with MySQL/MariaDB and others.
+ ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
+ op.add_column('ps_endpoints', sa.Column('suppress_moh_on_sendonly', ast_bool_values))
+
+def downgrade():
+ if op.get_context().bind.dialect.name == 'mssql':
+ op.drop_constraint('ck_ps_endpoints_suppress_moh_on_sendonly_ast_bool_values', 'ps_endpoints')
+ op.drop_column('ps_endpoints', 'suppress_moh_on_sendonly')
+```
+
+
+Older scripts used YESNO_VALUES but that is no longer supported.
+
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
-YESNO_NAME = 'yesno_values'
-YESNO_VALUES = ['yes', 'no']
-
+AST_BOOL_NAME = 'ast_bool_values'
+AST_BOOL_VALUES = [ '0', '1',
+ 'off', 'on',
+ 'false', 'true',
+ 'no', 'yes' ]
def upgrade():
- yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
-
- op.add_column('ps_endpoints', sa.Column('suppress_moh_on_sendonly', yesno_values))
-
+ ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
+ op.add_column('ps_endpoints', sa.Column('suppress_moh_on_sendonly', ast_bool_values))
def downgrade():
if op.get_context().bind.dialect.name == 'mssql':
- op.drop_constraint('ck_ps_endpoints_suppress_moh_on_sendonly_yesno_values', 'ps_endpoints')
+ op.drop_constraint('ck_ps_endpoints_suppress_moh_on_sendonly_ast_bool_values', 'ps_endpoints')
op.drop_column('ps_endpoints', 'suppress_moh_on_sendonly')
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_aoc", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, send_aoc));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "tenantid", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, tenantid));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "suppress_moh_on_sendonly",
- "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, suppress_moh_on_sendonly));
+ "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, suppress_moh_on_sendonly));
if (ast_sip_initialize_sorcery_transport()) {
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");