mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-26 22:30:28 +00:00
Merge "Fix Alembic upgrades."
This commit is contained in:
@@ -8,7 +8,7 @@ Create Date: 2016-05-19 15:51:33.410852
|
|||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
revision = 'a845e4d8ade8'
|
revision = 'a845e4d8ade8'
|
||||||
down_revision = 'bca7113d796f'
|
down_revision = 'd7e3c73eb2bf'
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|||||||
@@ -16,10 +16,8 @@ import sqlalchemy as sa
|
|||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
op.add_column('ps_contacts', sa.Column('reg_server', sa.String(20)))
|
op.add_column('ps_contacts', sa.Column('reg_server', sa.String(20)))
|
||||||
op.drop_constraint('id', 'ps_contacts', type_='unique')
|
|
||||||
op.create_unique_constraint('ps_contacts_uq', 'ps_contacts', ['id','reg_server'])
|
op.create_unique_constraint('ps_contacts_uq', 'ps_contacts', ['id','reg_server'])
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
op.drop_constraint('ps_contacts_uq', 'ps_contacts', type_='unique')
|
op.drop_constraint('ps_contacts_uq', 'ps_contacts', type_='unique')
|
||||||
op.drop_column('ps_contacts', 'reg_server')
|
op.drop_column('ps_contacts', 'reg_server')
|
||||||
op.create_unique_constraint(None, 'ps_contacts', 'id')
|
|
||||||
|
|||||||
@@ -445,6 +445,29 @@ enum aco_option_type {
|
|||||||
* {endcode}
|
* {endcode}
|
||||||
*/
|
*/
|
||||||
OPT_UINT_T,
|
OPT_UINT_T,
|
||||||
|
|
||||||
|
/*! \brief Type for default option handler for bools (ast_true/ast_false)
|
||||||
|
* \note aco_option_register flags:
|
||||||
|
* non-zero : process via ast_true
|
||||||
|
* 0 : process via ast_false
|
||||||
|
* aco_option_register varargs:
|
||||||
|
* FLDSET macro with the field of type int. It is important to note that the field
|
||||||
|
* cannot be a bitfield. If bitfields are required, they must be set via a custom handler.
|
||||||
|
*
|
||||||
|
* This is exactly the same as OPT_BOOL_T. The only difference is that when
|
||||||
|
* translated to a string, OPT_BOOL_T becomes "true" or "false"; OPT_YESNO_T becomes
|
||||||
|
* "yes" or "no".
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* {code}
|
||||||
|
* struct test_item {
|
||||||
|
* int enabled;
|
||||||
|
* };
|
||||||
|
* aco_option_register(&cfg_info, "enabled", ACO_EXACT, my_types, "no", OPT_YESNO_T, 1, FLDSET(struct test_item, enabled));
|
||||||
|
* {endcode}
|
||||||
|
*/
|
||||||
|
OPT_YESNO_T,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \brief A callback function for handling a particular option
|
/*! \brief A callback function for handling a particular option
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ static char *aco_option_type_string[] = {
|
|||||||
"IP Address", /* OPT_SOCKADDR_T, */
|
"IP Address", /* OPT_SOCKADDR_T, */
|
||||||
"String", /* OPT_STRINGFIELD_T, */
|
"String", /* OPT_STRINGFIELD_T, */
|
||||||
"Unsigned Integer", /* OPT_UINT_T, */
|
"Unsigned Integer", /* OPT_UINT_T, */
|
||||||
|
"Boolean", /* OPT_YESNO_T, */
|
||||||
};
|
};
|
||||||
|
|
||||||
void *aco_pending_config(struct aco_info *info)
|
void *aco_pending_config(struct aco_info *info)
|
||||||
@@ -139,6 +140,10 @@ static aco_option_handler ast_config_option_default_handler(enum aco_option_type
|
|||||||
switch(type) {
|
switch(type) {
|
||||||
case OPT_ACL_T: return acl_handler_fn;
|
case OPT_ACL_T: return acl_handler_fn;
|
||||||
case OPT_BOOL_T: return bool_handler_fn;
|
case OPT_BOOL_T: return bool_handler_fn;
|
||||||
|
/* Reading from config files, BOOL and YESNO are handled exactly the
|
||||||
|
* same. Their difference is in how they are rendered to users
|
||||||
|
*/
|
||||||
|
case OPT_YESNO_T: return bool_handler_fn;
|
||||||
case OPT_BOOLFLAG_T: return boolflag_handler_fn;
|
case OPT_BOOLFLAG_T: return boolflag_handler_fn;
|
||||||
case OPT_CHAR_ARRAY_T: return chararray_handler_fn;
|
case OPT_CHAR_ARRAY_T: return chararray_handler_fn;
|
||||||
case OPT_CODEC_T: return codec_handler_fn;
|
case OPT_CODEC_T: return codec_handler_fn;
|
||||||
|
|||||||
@@ -293,6 +293,12 @@ static int bool_handler_fn(const void *obj, const intptr_t *args, char **buf)
|
|||||||
return !(*buf = ast_strdup(*field ? "true" : "false")) ? -1 : 0;
|
return !(*buf = ast_strdup(*field ? "true" : "false")) ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int yesno_handler_fn(const void *obj, const intptr_t *args, char **buf)
|
||||||
|
{
|
||||||
|
unsigned int *field = (unsigned int *)(obj + args[0]);
|
||||||
|
return !(*buf = ast_strdup(*field ? "yes" : "no")) ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int sockaddr_handler_fn(const void *obj, const intptr_t *args, char **buf)
|
static int sockaddr_handler_fn(const void *obj, const intptr_t *args, char **buf)
|
||||||
{
|
{
|
||||||
struct ast_sockaddr *field = (struct ast_sockaddr *)(obj + args[0]);
|
struct ast_sockaddr *field = (struct ast_sockaddr *)(obj + args[0]);
|
||||||
@@ -316,6 +322,7 @@ static sorcery_field_handler sorcery_field_default_handler(enum aco_option_type
|
|||||||
{
|
{
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case OPT_BOOL_T: return bool_handler_fn;
|
case OPT_BOOL_T: return bool_handler_fn;
|
||||||
|
case OPT_YESNO_T: return yesno_handler_fn;
|
||||||
case OPT_CHAR_ARRAY_T: return chararray_handler_fn;
|
case OPT_CHAR_ARRAY_T: return chararray_handler_fn;
|
||||||
case OPT_CODEC_T: return codec_handler_fn;
|
case OPT_CODEC_T: return codec_handler_fn;
|
||||||
case OPT_DOUBLE_T: return double_handler_fn;
|
case OPT_DOUBLE_T: return double_handler_fn;
|
||||||
|
|||||||
@@ -1133,7 +1133,7 @@ int ast_sip_initialize_sorcery_location(void)
|
|||||||
ast_sorcery_object_field_register(sorcery, "contact", "qualify_frequency", 0, OPT_UINT_T,
|
ast_sorcery_object_field_register(sorcery, "contact", "qualify_frequency", 0, OPT_UINT_T,
|
||||||
PARSE_IN_RANGE, FLDSET(struct ast_sip_contact, qualify_frequency), 0, 86400);
|
PARSE_IN_RANGE, FLDSET(struct ast_sip_contact, qualify_frequency), 0, 86400);
|
||||||
ast_sorcery_object_field_register(sorcery, "contact", "qualify_timeout", "3.0", OPT_DOUBLE_T, 0, FLDSET(struct ast_sip_contact, qualify_timeout));
|
ast_sorcery_object_field_register(sorcery, "contact", "qualify_timeout", "3.0", OPT_DOUBLE_T, 0, FLDSET(struct ast_sip_contact, qualify_timeout));
|
||||||
ast_sorcery_object_field_register(sorcery, "contact", "authenticate_qualify", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_contact, authenticate_qualify));
|
ast_sorcery_object_field_register(sorcery, "contact", "authenticate_qualify", "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_contact, authenticate_qualify));
|
||||||
ast_sorcery_object_field_register(sorcery, "contact", "outbound_proxy", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, outbound_proxy));
|
ast_sorcery_object_field_register(sorcery, "contact", "outbound_proxy", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, outbound_proxy));
|
||||||
ast_sorcery_object_field_register(sorcery, "contact", "user_agent", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, user_agent));
|
ast_sorcery_object_field_register(sorcery, "contact", "user_agent", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, user_agent));
|
||||||
ast_sorcery_object_field_register(sorcery, "contact", "reg_server", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, reg_server));
|
ast_sorcery_object_field_register(sorcery, "contact", "reg_server", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, reg_server));
|
||||||
|
|||||||
Reference in New Issue
Block a user