[Asterisk-code-review] Fix Alembic upgrades. (asterisk[master])

Joshua Colp asteriskteam at digium.com
Wed Jun 22 16:06:07 CDT 2016


Joshua Colp has submitted this change and it was merged.

Change subject: Fix Alembic upgrades.
......................................................................


Fix Alembic upgrades.

A non-existent constraint was being referenced in the upgrade script.
This patch corrects the problem by removing the reference.

In addition, the head of the alembic branch referred to a non-existent
revision. This has been fixed by referring to the proper revision.

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 introduces a new boolean type that
translates to "yes" or "no" instead.

ASTERISK-26128 #close

Change-Id: I51574736a881189de695a824883a18d66a52dcef
---
M contrib/ast-db-manage/config/versions/6d8c104e6184_res_pjsip_add_contact_via_addr_and_.py
M contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py
M include/asterisk/config_options.h
M main/config_options.c
M main/sorcery.c
M res/res_pjsip/location.c
6 files changed, 37 insertions(+), 4 deletions(-)

Approvals:
  George Joseph: Looks good to me, but someone else must approve
  Richard Mudgett: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, approved; Verified



diff --git a/contrib/ast-db-manage/config/versions/6d8c104e6184_res_pjsip_add_contact_via_addr_and_.py b/contrib/ast-db-manage/config/versions/6d8c104e6184_res_pjsip_add_contact_via_addr_and_.py
index 893d9d8..77242ac 100644
--- a/contrib/ast-db-manage/config/versions/6d8c104e6184_res_pjsip_add_contact_via_addr_and_.py
+++ b/contrib/ast-db-manage/config/versions/6d8c104e6184_res_pjsip_add_contact_via_addr_and_.py
@@ -8,7 +8,7 @@
 
 # revision identifiers, used by Alembic.
 revision = 'a845e4d8ade8'
-down_revision = 'bca7113d796f'
+down_revision = 'd7e3c73eb2bf'
 
 from alembic import op
 import sqlalchemy as sa
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 0318b9a..0919370 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 @@
 
 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 30c0421..f2a457e 100644
--- a/include/asterisk/config_options.h
+++ b/include/asterisk/config_options.h
@@ -445,6 +445,29 @@
 	 * {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 c58dfdd..2d23008 100644
--- a/main/config_options.c
+++ b/main/config_options.c
@@ -97,6 +97,7 @@
 	"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 @@
 	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 6a7b54b..a739f5e 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -293,6 +293,12 @@
 	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]);
@@ -316,6 +322,7 @@
 {
 	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 8f8c030..4f8f56f 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -1133,7 +1133,7 @@
 	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));

-- 
To view, visit https://gerrit.asterisk.org/3047
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I51574736a881189de695a824883a18d66a52dcef
Gerrit-PatchSet: 6
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>



More information about the asterisk-code-review mailing list