Permit the syntax and synopsis fields to be set (for func_odbc).

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@145846 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher
2008-10-02 17:16:54 +00:00
parent 4ea05efd8b
commit cf06228a2f
3 changed files with 34 additions and 3 deletions

View File

@@ -13,6 +13,8 @@ Dialplan Functions
* Added a new dialplan function, CURLOPT, which permits setting various * Added a new dialplan function, CURLOPT, which permits setting various
options that may be useful with the CURL dialplan function, such as options that may be useful with the CURL dialplan function, such as
cookies, proxies, connection timeouts, passwords, etc. cookies, proxies, connection timeouts, passwords, etc.
* Permit the syntax and synopsis fields of the corresponding dialplan
functions to be individually set from func_odbc.conf.
Miscellaneous Miscellaneous
------------- -------------

View File

@@ -57,6 +57,8 @@ dsn=mysql1,mysql2 ; Use mysql1 as the primary handle, but fall back to mysql2
; "writehandle", if it is important to separate reads and ; "writehandle", if it is important to separate reads and
; writes to different databases. ; writes to different databases.
readsql=SELECT COUNT(*) FROM exgirlfriends WHERE callerid='${SQL_ESC(${ARG1})}' readsql=SELECT COUNT(*) FROM exgirlfriends WHERE callerid='${SQL_ESC(${ARG1})}'
syntax=<callerid>
synopsis=Check if a specified callerid is contained in the ex-gf database
; ODBC_PRESENCE - Retrieve and update presence ; ODBC_PRESENCE - Retrieve and update presence
[PRESENCE] [PRESENCE]

View File

@@ -564,6 +564,7 @@ static int acf_fetch(struct ast_channel *chan, const char *cmd, char *data, char
struct odbc_datastore_row *row; struct odbc_datastore_row *row;
store = ast_channel_datastore_find(chan, &odbc_info, data); store = ast_channel_datastore_find(chan, &odbc_info, data);
if (!store) { if (!store) {
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "FAILURE");
return -1; return -1;
} }
resultset = store->data; resultset = store->data;
@@ -574,11 +575,13 @@ static int acf_fetch(struct ast_channel *chan, const char *cmd, char *data, char
/* Cleanup datastore */ /* Cleanup datastore */
ast_channel_datastore_remove(chan, store); ast_channel_datastore_remove(chan, store);
ast_datastore_free(store); ast_datastore_free(store);
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "FAILURE");
return -1; return -1;
} }
pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", resultset->names); pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", resultset->names);
ast_copy_string(buf, row->data, len); ast_copy_string(buf, row->data, len);
ast_free(row); ast_free(row);
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "SUCCESS");
return 0; return 0;
} }
@@ -589,7 +592,9 @@ static struct ast_custom_function fetch_function = {
.desc = .desc =
"For queries which are marked as mode=multirow, the original query returns a\n" "For queries which are marked as mode=multirow, the original query returns a\n"
"result-id from which results may be fetched. This function implements the\n" "result-id from which results may be fetched. This function implements the\n"
"actual fetch of the results.\n", "actual fetch of the results.\n"
"This function also sets ODBC_FETCH_STATUS to one of \"SUCCESS\" or \"FAILURE\",\n"
"depending upon whether there were rows available or not.\n",
.read = acf_fetch, .read = acf_fetch,
.write = NULL, .write = NULL,
}; };
@@ -716,7 +721,11 @@ static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_qu
return ENOMEM; return ENOMEM;
} }
if ((tmp = ast_variable_retrieve(cfg, catg, "syntax")) && !ast_strlen_zero(tmp)) {
asprintf((char **)&((*query)->acf->syntax), "%s(%s)", (*query)->acf->name, tmp);
} else {
asprintf((char **)&((*query)->acf->syntax), "%s(<arg1>[...[,<argN>]])", (*query)->acf->name); asprintf((char **)&((*query)->acf->syntax), "%s(<arg1>[...[,<argN>]])", (*query)->acf->name);
}
if (!((*query)->acf->syntax)) { if (!((*query)->acf->syntax)) {
ast_free((char *)(*query)->acf->name); ast_free((char *)(*query)->acf->name);
@@ -726,7 +735,21 @@ static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_qu
return ENOMEM; return ENOMEM;
} }
(*query)->acf->synopsis = "Runs the referenced query with the specified arguments"; if ((tmp = ast_variable_retrieve(cfg, catg, "synopsis")) && !ast_strlen_zero(tmp)) {
(*query)->acf->synopsis = ast_strdup(tmp);
} else {
(*query)->acf->synopsis = ast_strdup("Runs the referenced query with the specified arguments");
}
if (!((*query)->acf->synopsis)) {
ast_free((char *)(*query)->acf->name);
ast_free((char *)(*query)->acf->syntax);
ast_free((*query)->acf);
ast_free(*query);
*query = NULL;
return ENOMEM;
}
if (!ast_strlen_zero((*query)->sql_read) && !ast_strlen_zero((*query)->sql_write)) { if (!ast_strlen_zero((*query)->sql_read) && !ast_strlen_zero((*query)->sql_write)) {
asprintf((char **)&((*query)->acf->desc), asprintf((char **)&((*query)->acf->desc),
"Runs the following query, as defined in func_odbc.conf, performing\n" "Runs the following query, as defined in func_odbc.conf, performing\n"
@@ -751,6 +774,7 @@ static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_qu
"This function may only be set.\nSQL:\n%s\n", "This function may only be set.\nSQL:\n%s\n",
(*query)->sql_write); (*query)->sql_write);
} else { } else {
ast_free((char *)(*query)->acf->synopsis);
ast_free((char *)(*query)->acf->syntax); ast_free((char *)(*query)->acf->syntax);
ast_free((char *)(*query)->acf->name); ast_free((char *)(*query)->acf->name);
ast_free((*query)->acf); ast_free((*query)->acf);
@@ -760,6 +784,7 @@ static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_qu
} }
if (! ((*query)->acf->desc)) { if (! ((*query)->acf->desc)) {
ast_free((char *)(*query)->acf->synopsis);
ast_free((char *)(*query)->acf->syntax); ast_free((char *)(*query)->acf->syntax);
ast_free((char *)(*query)->acf->name); ast_free((char *)(*query)->acf->name);
ast_free((*query)->acf); ast_free((*query)->acf);
@@ -791,6 +816,8 @@ static int free_acf_query(struct acf_odbc_query *query)
ast_free((char *)query->acf->name); ast_free((char *)query->acf->name);
if (query->acf->syntax) if (query->acf->syntax)
ast_free((char *)query->acf->syntax); ast_free((char *)query->acf->syntax);
if (query->acf->synopsis)
ast_free((char *)query->acf->synopsis);
if (query->acf->desc) if (query->acf->desc)
ast_free((char *)query->acf->desc); ast_free((char *)query->acf->desc);
ast_free(query->acf); ast_free(query->acf);