summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2016-06-20 13:18:38 -0500
committerMark Michelson <mmichelson@digium.com>2016-06-22 12:21:11 -0500
commit1b79e2deff58dbf3f98791da1715aa4a696b028c (patch)
tree2df4afd96a8f86629128ded1412f7b12c51c10eb
parentfe8aab6959822438fc2b1bfb8a32d0e22816026e (diff)
Fix Alembic upgrades.
A non-existent constraint was being referenced in the upgrade script. This patch corrects the problem by removing the reference. This patch fixes another realtime problem as well. Our Alembic scripts store booleans as yes or no values. However, Sorcery tries to insert "true" or "false" instead. This patch updates Sorcery to use "yes" and "no" ASTERISK-26128 #close Change-Id: I366dbbf91418a9cb160b3ca74b0e59b5ac284bec
-rw-r--r--contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py2
-rw-r--r--include/asterisk/config_options.h22
-rw-r--r--main/config_options.c5
-rw-r--r--main/sorcery.c7
-rw-r--r--res/res_pjsip/location.c2
5 files changed, 35 insertions, 3 deletions
diff --git a/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py b/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py
index 0318b9a4f..0919370ba 100644
--- a/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py
+++ b/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py
@@ -16,10 +16,8 @@ import sqlalchemy as sa
def upgrade():
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'])
def downgrade():
op.drop_constraint('ps_contacts_uq', 'ps_contacts', type_='unique')
op.drop_column('ps_contacts', 'reg_server')
- op.create_unique_constraint(None, 'ps_contacts', 'id')
diff --git a/include/asterisk/config_options.h b/include/asterisk/config_options.h
index 30c042176..30d0c9142 100644
--- a/include/asterisk/config_options.h
+++ b/include/asterisk/config_options.h
@@ -445,6 +445,28 @@ enum aco_option_type {
* {endcode}
*/
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
diff --git a/main/config_options.c b/main/config_options.c
index c8988c984..cc8e218f8 100644
--- a/main/config_options.c
+++ b/main/config_options.c
@@ -97,6 +97,7 @@ static char *aco_option_type_string[] = {
"IP Address", /* OPT_SOCKADDR_T, */
"String", /* OPT_STRINGFIELD_T, */
"Unsigned Integer", /* OPT_UINT_T, */
+ "Boolean", /* OPT_YESNO_T, */
};
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) {
case OPT_ACL_T: return acl_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_CHAR_ARRAY_T: return chararray_handler_fn;
case OPT_CODEC_T: return codec_handler_fn;
diff --git a/main/sorcery.c b/main/sorcery.c
index 4dedc4d9b..bfc768879 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -290,6 +290,12 @@ static int bool_handler_fn(const void *obj, const intptr_t *args, char **buf)
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)
{
struct ast_sockaddr *field = (struct ast_sockaddr *)(obj + args[0]);
@@ -313,6 +319,7 @@ static sorcery_field_handler sorcery_field_default_handler(enum aco_option_type
{
switch(type) {
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_CODEC_T: return codec_handler_fn;
case OPT_DOUBLE_T: return double_handler_fn;
diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c
index bf08d8e86..f02a72c77 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -1138,7 +1138,7 @@ int ast_sip_initialize_sorcery_location(void)
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);
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", "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));