curl plugin for portable configuration engine More...
#include "asterisk.h"
#include <curl/curl.h>
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
Go to the source code of this file.
Functions | |
static void | __init_query_buf (void) |
static void | __init_result_buf (void) |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static struct ast_config * | config_curl (const char *url, const char *unused, const char *file, struct ast_config *cfg, struct ast_flags flags, const char *sugg_incl, const char *who_asked) |
static int | destroy_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an DELETE query. | |
static int | load_module (void) |
static struct ast_variable * | realtime_curl (const char *url, const char *unused, va_list ap) |
Execute a curl query and return ast_variable list. | |
static struct ast_config * | realtime_multi_curl (const char *url, const char *unused, va_list ap) |
Excute an Select query and return ast_config list. | |
static int | reload_module (void) |
static int | require_curl (const char *url, const char *unused, va_list ap) |
static int | store_curl (const char *url, const char *unused, va_list ap) |
Execute an INSERT query. | |
static int | unload_module (void) |
static int | update2_curl (const char *url, const char *unused, va_list ap) |
static int | update_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an UPDATE query. | |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_config_engine | curl_engine |
static struct ast_threadstorage | query_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_query_buf , .custom_init = NULL , } |
static struct ast_threadstorage | result_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_result_buf , .custom_init = NULL , } |
curl plugin for portable configuration engine
Definition in file res_config_curl.c.
static void __init_query_buf | ( | void | ) | [static] |
Definition at line 49 of file res_config_curl.c.
static void __init_result_buf | ( | void | ) | [static] |
Definition at line 50 of file res_config_curl.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 675 of file res_config_curl.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 675 of file res_config_curl.c.
static struct ast_config* config_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | file, | |||
struct ast_config * | cfg, | |||
struct ast_flags | flags, | |||
const char * | sugg_incl, | |||
const char * | who_asked | |||
) | [static, read] |
Definition at line 520 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_config_get_current_category(), ast_config_internal_load(), ast_custom_function_find(), ast_log(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, query_buf, result_buf, and S_OR.
00521 { 00522 struct ast_str *query, *buffer; 00523 char buf1[200]; 00524 char *stringp, *line, *pair, *key; 00525 const int EncodeSpecialChars = 1; 00526 int last_cat_metric = -1, cat_metric = -1; 00527 struct ast_category *cat = NULL; 00528 char *cur_cat = ""; 00529 char *category = "", *var_name = "", *var_val = ""; 00530 struct ast_flags loader_flags = { 0 }; 00531 00532 if (!ast_custom_function_find("CURL")) { 00533 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00534 return NULL; 00535 } 00536 00537 if (!(query = ast_str_thread_get(&query_buf, 100))) { 00538 return NULL; 00539 } 00540 00541 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00542 return NULL; 00543 } 00544 00545 ast_uri_encode(file, buf1, sizeof(buf1), EncodeSpecialChars); 00546 ast_str_set(&query, 0, "${CURL(%s/static?file=%s)}", url, buf1); 00547 00548 /* Do the CURL query */ 00549 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00550 00551 /* Line oriented output */ 00552 stringp = ast_str_buffer(buffer); 00553 cat = ast_config_get_current_category(cfg); 00554 00555 while ((line = strsep(&stringp, "\r\n"))) { 00556 if (ast_strlen_zero(line)) { 00557 continue; 00558 } 00559 00560 while ((pair = strsep(&line, "&"))) { 00561 key = strsep(&pair, "="); 00562 ast_uri_decode(key); 00563 if (pair) { 00564 ast_uri_decode(pair); 00565 } 00566 00567 if (!strcasecmp(key, "category")) { 00568 category = S_OR(pair, ""); 00569 } else if (!strcasecmp(key, "var_name")) { 00570 var_name = S_OR(pair, ""); 00571 } else if (!strcasecmp(key, "var_val")) { 00572 var_val = S_OR(pair, ""); 00573 } else if (!strcasecmp(key, "cat_metric")) { 00574 cat_metric = pair ? atoi(pair) : 0; 00575 } 00576 } 00577 00578 if (!strcmp(var_name, "#include")) { 00579 if (!ast_config_internal_load(var_val, cfg, loader_flags, "", who_asked)) 00580 return NULL; 00581 } 00582 00583 if (!cat || strcmp(category, cur_cat) || last_cat_metric != cat_metric) { 00584 if (!(cat = ast_category_new(category, "", 99999))) 00585 break; 00586 cur_cat = category; 00587 last_cat_metric = cat_metric; 00588 ast_category_append(cfg, cat); 00589 } 00590 ast_variable_append(cat, ast_variable_new(var_name, var_val, "")); 00591 } 00592 00593 return cfg; 00594 }
static int destroy_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | keyfield, | |||
const char * | lookup, | |||
va_list | ap | |||
) | [static] |
Execute an DELETE query.
url | ||
unused | ||
keyfield | where clause field | |
lookup | value of field for where clause | |
ap | list containing one or more field/value set(s) |
Delete a row from a database table, prepare the sql statement using keyfield and lookup control the number of records to change. Additional params to match rows are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected | |
-1 | on failure |
Definition at line 418 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), LOG_ERROR, query_buf, and result_buf.
00419 { 00420 struct ast_str *query, *buffer; 00421 char buf1[200], buf2[200]; 00422 const char *newparam, *newval; 00423 char *stringp; 00424 int i, rowcount = -1; 00425 const int EncodeSpecialChars = 1; 00426 00427 if (!ast_custom_function_find("CURL")) { 00428 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00429 return -1; 00430 } 00431 00432 if (!(query = ast_str_thread_get(&query_buf, 1000))) { 00433 return -1; 00434 } 00435 00436 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00437 return -1; 00438 } 00439 00440 ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); 00441 ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); 00442 ast_str_set(&query, 0, "${CURL(%s/destroy,%s=%s&", url, buf1, buf2); 00443 00444 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00445 newval = va_arg(ap, const char *); 00446 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00447 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00448 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00449 } 00450 00451 ast_str_append(&query, 0, ")}"); 00452 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00453 00454 /* Line oriented output */ 00455 stringp = ast_str_buffer(buffer); 00456 while (*stringp <= ' ') { 00457 stringp++; 00458 } 00459 sscanf(stringp, "%30d", &rowcount); 00460 00461 if (rowcount >= 0) { 00462 return (int)rowcount; 00463 } 00464 00465 return -1; 00466 }
static int load_module | ( | void | ) | [static] |
Definition at line 647 of file res_config_curl.c.
References ast_config_engine_register(), ast_load_resource(), ast_log(), ast_module_check(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_verb, LOG_ERROR, and reload_module().
00648 { 00649 if (!ast_module_check("res_curl.so")) { 00650 if (ast_load_resource("res_curl.so") != AST_MODULE_LOAD_SUCCESS) { 00651 ast_log(LOG_ERROR, "Cannot load res_curl, so res_config_curl cannot be loaded\n"); 00652 return AST_MODULE_LOAD_DECLINE; 00653 } 00654 } 00655 00656 if (!ast_module_check("func_curl.so")) { 00657 if (ast_load_resource("func_curl.so") != AST_MODULE_LOAD_SUCCESS) { 00658 ast_log(LOG_ERROR, "Cannot load func_curl, so res_config_curl cannot be loaded\n"); 00659 return AST_MODULE_LOAD_DECLINE; 00660 } 00661 } 00662 00663 reload_module(); 00664 00665 ast_config_engine_register(&curl_engine); 00666 ast_verb(1, "res_config_curl loaded.\n"); 00667 return 0; 00668 }
static struct ast_variable* realtime_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static, read] |
Execute a curl query and return ast_variable list.
url | The base URL from which to retrieve data | |
unused | Not currently used | |
ap | list containing one or more field/operator/value set. |
var | on success | |
NULL | on failure |
Definition at line 61 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_new(), LOG_ERROR, query_buf, result_buf, S_OR, and var.
00062 { 00063 struct ast_str *query, *buffer; 00064 char buf1[256], buf2[256]; 00065 const char *newparam, *newval; 00066 char *stringp, *pair, *key; 00067 int i; 00068 struct ast_variable *var = NULL, *prev = NULL; 00069 const int EncodeSpecialChars = 1; 00070 00071 if (!ast_custom_function_find("CURL")) { 00072 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00073 return NULL; 00074 } 00075 00076 if (!(query = ast_str_thread_get(&query_buf, 16))) { 00077 return NULL; 00078 } 00079 00080 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00081 return NULL; 00082 } 00083 00084 ast_str_set(&query, 0, "${CURL(%s/single,", url); 00085 00086 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00087 newval = va_arg(ap, const char *); 00088 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00089 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00090 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00091 } 00092 00093 ast_str_append(&query, 0, ")}"); 00094 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00095 00096 /* Remove any trailing newline characters */ 00097 if ((stringp = strchr(ast_str_buffer(buffer), '\r')) || (stringp = strchr(ast_str_buffer(buffer), '\n'))) { 00098 *stringp = '\0'; 00099 } 00100 00101 stringp = ast_str_buffer(buffer); 00102 while ((pair = strsep(&stringp, "&"))) { 00103 key = strsep(&pair, "="); 00104 ast_uri_decode(key); 00105 if (pair) { 00106 ast_uri_decode(pair); 00107 } 00108 00109 if (!ast_strlen_zero(key)) { 00110 if (prev) { 00111 prev->next = ast_variable_new(key, S_OR(pair, ""), ""); 00112 if (prev->next) { 00113 prev = prev->next; 00114 } 00115 } else { 00116 prev = var = ast_variable_new(key, S_OR(pair, ""), ""); 00117 } 00118 } 00119 } 00120 00121 return var; 00122 }
static struct ast_config* realtime_multi_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static, read] |
Excute an Select query and return ast_config list.
url | ||
unused | ||
ap | list containing one or more field/operator/value set. |
struct | ast_config pointer on success | |
NULL | on failure |
Definition at line 133 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_category_rename(), ast_config_new(), ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strdupa, ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, query_buf, result_buf, S_OR, and var.
00134 { 00135 struct ast_str *query, *buffer; 00136 char buf1[256], buf2[256]; 00137 const char *newparam, *newval; 00138 char *stringp, *line, *pair, *key, *initfield = NULL; 00139 int i; 00140 const int EncodeSpecialChars = 1; 00141 struct ast_variable *var = NULL; 00142 struct ast_config *cfg = NULL; 00143 struct ast_category *cat = NULL; 00144 00145 if (!ast_custom_function_find("CURL")) { 00146 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00147 return NULL; 00148 } 00149 00150 if (!(query = ast_str_thread_get(&query_buf, 16))) { 00151 return NULL; 00152 } 00153 00154 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00155 return NULL; 00156 } 00157 00158 ast_str_set(&query, 0, "${CURL(%s/multi,", url); 00159 00160 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00161 newval = va_arg(ap, const char *); 00162 if (i == 0) { 00163 char *op; 00164 initfield = ast_strdupa(newparam); 00165 if ((op = strchr(initfield, ' '))) 00166 *op = '\0'; 00167 } 00168 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00169 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00170 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00171 } 00172 00173 ast_str_append(&query, 0, ")}"); 00174 00175 /* Do the CURL query */ 00176 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00177 00178 if (!(cfg = ast_config_new())) { 00179 return NULL; 00180 } 00181 00182 /* Line oriented output */ 00183 stringp = ast_str_buffer(buffer); 00184 while ((line = strsep(&stringp, "\r\n"))) { 00185 if (ast_strlen_zero(line)) { 00186 continue; 00187 } 00188 00189 if (!(cat = ast_category_new("", "", 99999))) { 00190 continue; 00191 } 00192 00193 while ((pair = strsep(&line, "&"))) { 00194 key = strsep(&pair, "="); 00195 ast_uri_decode(key); 00196 if (pair) { 00197 ast_uri_decode(pair); 00198 } 00199 00200 if (!strcasecmp(key, initfield) && pair) { 00201 ast_category_rename(cat, pair); 00202 } 00203 00204 if (!ast_strlen_zero(key)) { 00205 var = ast_variable_new(key, S_OR(pair, ""), ""); 00206 ast_variable_append(cat, var); 00207 } 00208 } 00209 ast_category_append(cfg, cat); 00210 } 00211 00212 return cfg; 00213 }
static int reload_module | ( | void | ) | [static] |
Definition at line 608 of file res_config_curl.c.
References ast_config_destroy(), ast_config_load, ast_log(), ast_variable_browse(), CONFIG_FLAG_NOREALTIME, CONFIG_STATUS_FILEINVALID, LOG_WARNING, name, ast_variable::name, ast_variable::next, pbx_builtin_setvar_helper(), ast_variable::value, and var.
Referenced by load_module().
00609 { 00610 struct ast_flags flags = { CONFIG_FLAG_NOREALTIME }; 00611 struct ast_config *cfg; 00612 struct ast_variable *var; 00613 00614 if (!(cfg = ast_config_load("res_curl.conf", flags))) { 00615 return 0; 00616 } else if (cfg == CONFIG_STATUS_FILEINVALID) { 00617 ast_log(LOG_WARNING, "res_curl.conf could not be parsed!\n"); 00618 return 0; 00619 } 00620 00621 if (!(var = ast_variable_browse(cfg, "globals")) && !(var = ast_variable_browse(cfg, "global")) && !(var = ast_variable_browse(cfg, "general"))) { 00622 ast_log(LOG_WARNING, "[globals] not found in res_curl.conf\n"); 00623 ast_config_destroy(cfg); 00624 return 0; 00625 } 00626 00627 for (; var; var = var->next) { 00628 if (strncmp(var->name, "CURLOPT(", 8)) { 00629 char name[256]; 00630 snprintf(name, sizeof(name), "CURLOPT(%s)", var->name); 00631 pbx_builtin_setvar_helper(NULL, name, var->value); 00632 } else { 00633 pbx_builtin_setvar_helper(NULL, var->name, var->value); 00634 } 00635 } 00636 ast_config_destroy(cfg); 00637 return 0; 00638 }
static int require_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Definition at line 468 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), LOG_ERROR, query_buf, result_buf, RQ_CHAR, RQ_DATE, RQ_DATETIME, RQ_FLOAT, RQ_INTEGER1, RQ_INTEGER2, RQ_INTEGER3, RQ_INTEGER4, RQ_INTEGER8, RQ_UINTEGER1, RQ_UINTEGER2, RQ_UINTEGER3, RQ_UINTEGER4, RQ_UINTEGER8, and type.
00469 { 00470 struct ast_str *query, *buffer; 00471 char *elm, field[256]; 00472 int type, size, i = 0; 00473 const int EncodeSpecialChars = 1; 00474 00475 if (!ast_custom_function_find("CURL")) { 00476 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00477 return -1; 00478 } 00479 00480 if (!(query = ast_str_thread_get(&query_buf, 100))) { 00481 return -1; 00482 } 00483 00484 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00485 return -1; 00486 } 00487 00488 ast_str_set(&query, 0, "${CURL(%s/require,", url); 00489 00490 while ((elm = va_arg(ap, char *))) { 00491 type = va_arg(ap, require_type); 00492 size = va_arg(ap, int); 00493 ast_uri_encode(elm, field, sizeof(field), EncodeSpecialChars); 00494 ast_str_append(&query, 0, "%s%s=%s%%3A%d", 00495 i > 0 ? "&" : "", 00496 field, 00497 type == RQ_CHAR ? "char" : 00498 type == RQ_INTEGER1 ? "integer1" : 00499 type == RQ_UINTEGER1 ? "uinteger1" : 00500 type == RQ_INTEGER2 ? "integer2" : 00501 type == RQ_UINTEGER2 ? "uinteger2" : 00502 type == RQ_INTEGER3 ? "integer3" : 00503 type == RQ_UINTEGER3 ? "uinteger3" : 00504 type == RQ_INTEGER4 ? "integer4" : 00505 type == RQ_UINTEGER4 ? "uinteger4" : 00506 type == RQ_INTEGER8 ? "integer8" : 00507 type == RQ_UINTEGER8 ? "uinteger8" : 00508 type == RQ_DATE ? "date" : 00509 type == RQ_DATETIME ? "datetime" : 00510 type == RQ_FLOAT ? "float" : 00511 "unknown", size); 00512 i++; 00513 } 00514 00515 ast_str_append(&query, 0, ")}"); 00516 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00517 return atoi(ast_str_buffer(buffer)); 00518 }
static int store_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Execute an INSERT query.
url | ||
unused | ||
ap | list containing one or more field/value set(s) |
Insert a new record into database table, prepare the sql statement. All values to be changed are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected | |
-1 | on failure |
Definition at line 356 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), LOG_ERROR, query_buf, and result_buf.
00357 { 00358 struct ast_str *query, *buffer; 00359 char buf1[256], buf2[256]; 00360 const char *newparam, *newval; 00361 char *stringp; 00362 int i, rowcount = -1; 00363 const int EncodeSpecialChars = 1; 00364 00365 if (!ast_custom_function_find("CURL")) { 00366 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00367 return -1; 00368 } 00369 00370 if (!(query = ast_str_thread_get(&query_buf, 1000))) { 00371 return -1; 00372 } 00373 00374 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00375 return -1; 00376 } 00377 00378 ast_str_set(&query, 0, "${CURL(%s/store,", url); 00379 00380 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00381 newval = va_arg(ap, const char *); 00382 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00383 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00384 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00385 } 00386 00387 ast_str_append(&query, 0, ")}"); 00388 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00389 00390 stringp = ast_str_buffer(buffer); 00391 while (*stringp <= ' ') { 00392 stringp++; 00393 } 00394 sscanf(stringp, "%30d", &rowcount); 00395 00396 if (rowcount >= 0) { 00397 return rowcount; 00398 } 00399 00400 return -1; 00401 }
static int unload_module | ( | void | ) | [static] |
Definition at line 640 of file res_config_curl.c.
References ast_config_engine_deregister(), and ast_verb.
00641 { 00642 ast_config_engine_deregister(&curl_engine); 00643 ast_verb(1, "res_config_curl unloaded.\n"); 00644 return 0; 00645 }
static int update2_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Definition at line 280 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), first, LOG_ERROR, query_buf, result_buf, and SENTINEL.
00281 { 00282 struct ast_str *query, *buffer; 00283 char buf1[200], buf2[200]; 00284 const char *newparam, *newval; 00285 char *stringp; 00286 int rowcount = -1, lookup = 1, first = 1; 00287 const int EncodeSpecialChars = 1; 00288 00289 if (!ast_custom_function_find("CURL")) { 00290 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00291 return -1; 00292 } 00293 00294 if (!(query = ast_str_thread_get(&query_buf, 1000))) 00295 return -1; 00296 00297 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00298 return -1; 00299 } 00300 00301 ast_str_set(&query, 0, "${CURL(%s/update?", url); 00302 00303 for (;;) { 00304 if ((newparam = va_arg(ap, const char *)) == SENTINEL) { 00305 if (lookup) { 00306 lookup = 0; 00307 ast_str_append(&query, 0, ","); 00308 /* Back to the first parameter; we don't need a starting '&' */ 00309 first = 1; 00310 continue; 00311 } else { 00312 break; 00313 } 00314 } 00315 newval = va_arg(ap, const char *); 00316 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00317 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00318 ast_str_append(&query, 0, "%s%s=%s", first ? "" : "&", buf1, buf2); 00319 first = 0; 00320 } 00321 00322 ast_str_append(&query, 0, ")}"); 00323 /* Proxies work, by setting CURLOPT options in the [globals] section of 00324 * extensions.conf. Unfortunately, this means preloading pbx_config.so 00325 * so that they have an opportunity to be set prior to startup realtime 00326 * queries. */ 00327 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00328 00329 /* Line oriented output */ 00330 stringp = ast_str_buffer(buffer); 00331 while (*stringp <= ' ') { 00332 stringp++; 00333 } 00334 sscanf(stringp, "%30d", &rowcount); 00335 00336 if (rowcount >= 0) { 00337 return (int)rowcount; 00338 } 00339 00340 return -1; 00341 }
static int update_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | keyfield, | |||
const char * | lookup, | |||
va_list | ap | |||
) | [static] |
Execute an UPDATE query.
url | ||
unused | ||
keyfield | where clause field | |
lookup | value of field for where clause | |
ap | list containing one or more field/value set(s). |
Update a database table, prepare the sql statement using keyfield and lookup control the number of records to change. All values to be changed are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected | |
-1 | on failure |
Definition at line 230 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), LOG_ERROR, query_buf, and result_buf.
00231 { 00232 struct ast_str *query, *buffer; 00233 char buf1[256], buf2[256]; 00234 const char *newparam, *newval; 00235 char *stringp; 00236 int i, rowcount = -1; 00237 const int EncodeSpecialChars = 1; 00238 00239 if (!ast_custom_function_find("CURL")) { 00240 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00241 return -1; 00242 } 00243 00244 if (!(query = ast_str_thread_get(&query_buf, 16))) { 00245 return -1; 00246 } 00247 00248 if (!(buffer = ast_str_thread_get(&result_buf, 16))) { 00249 return -1; 00250 } 00251 00252 ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); 00253 ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); 00254 ast_str_set(&query, 0, "${CURL(%s/update?%s=%s,", url, buf1, buf2); 00255 00256 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00257 newval = va_arg(ap, const char *); 00258 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00259 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00260 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00261 } 00262 00263 ast_str_append(&query, 0, ")}"); 00264 ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); 00265 00266 /* Line oriented output */ 00267 stringp = ast_str_buffer(buffer); 00268 while (*stringp <= ' ') { 00269 stringp++; 00270 } 00271 sscanf(stringp, "%30d", &rowcount); 00272 00273 if (rowcount >= 0) { 00274 return (int)rowcount; 00275 } 00276 00277 return -1; 00278 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, } [static] |
Definition at line 675 of file res_config_curl.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 675 of file res_config_curl.c.
struct ast_config_engine curl_engine [static] |
Definition at line 596 of file res_config_curl.c.
struct ast_threadstorage query_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_query_buf , .custom_init = NULL , } [static] |
Definition at line 49 of file res_config_curl.c.
Referenced by config_curl(), destroy_curl(), realtime_curl(), realtime_multi_curl(), require_curl(), store_curl(), update2_curl(), and update_curl().
struct ast_threadstorage result_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_result_buf , .custom_init = NULL , } [static] |
Definition at line 50 of file res_config_curl.c.
Referenced by config_curl(), destroy_curl(), function_fieldnum_helper(), function_fieldqty_helper(), listfilter(), realtime_curl(), realtime_multi_curl(), replace(), require_curl(), shift_pop(), store_curl(), unshift_push(), update2_curl(), and update_curl().