#include "asterisk.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/app.h"
Go to the source code of this file.
Functions | |
static void | __init_buf1 (void) |
static void | __init_buf2 (void) |
static void | __init_buf3 (void) |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | function_realtime_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | function_realtime_readdestroy (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | function_realtime_store (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
static int | function_realtime_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
static int | load_module (void) |
static int | realtimefield_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Read/Write/Store/Destroy values from a RealTime repository" , .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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_threadstorage | buf1 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf1 , .custom_init = NULL , } |
static struct ast_threadstorage | buf2 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf2 , .custom_init = NULL , } |
static struct ast_threadstorage | buf3 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf3 , .custom_init = NULL , } |
static struct ast_custom_function | realtime_destroy_function |
static struct ast_custom_function | realtime_function |
static struct ast_custom_function | realtime_store_function |
static struct ast_custom_function | realtimefield_function |
static struct ast_custom_function | realtimehash_function |
Definition in file func_realtime.c.
static void __init_buf1 | ( | void | ) | [static] |
static void __init_buf2 | ( | void | ) | [static] |
static void __init_buf3 | ( | void | ) | [static] |
static void __reg_module | ( | void | ) | [static] |
Definition at line 465 of file func_realtime.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 465 of file func_realtime.c.
static int function_realtime_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 144 of file func_realtime.c.
References args, AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), ast_copy_string(), AST_DECLARE_APP_ARGS, ast_load_realtime_all(), ast_log(), AST_STANDARD_APP_ARGS, ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_strlen_zero(), ast_variables_destroy(), LOG_WARNING, ast_variable::next, SENTINEL, value, and var.
00145 { 00146 struct ast_variable *var, *head; 00147 struct ast_str *out; 00148 size_t resultslen; 00149 int n; 00150 AST_DECLARE_APP_ARGS(args, 00151 AST_APP_ARG(family); 00152 AST_APP_ARG(fieldmatch); 00153 AST_APP_ARG(value); 00154 AST_APP_ARG(delim1); 00155 AST_APP_ARG(delim2); 00156 ); 00157 00158 if (ast_strlen_zero(data)) { 00159 ast_log(LOG_WARNING, "Syntax: REALTIME(family,fieldmatch[,value[,delim1[,delim2]]]) - missing argument!\n"); 00160 return -1; 00161 } 00162 00163 AST_STANDARD_APP_ARGS(args, data); 00164 00165 if (!args.delim1) 00166 args.delim1 = ","; 00167 if (!args.delim2) 00168 args.delim2 = "="; 00169 00170 if (chan) 00171 ast_autoservice_start(chan); 00172 00173 head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL); 00174 00175 if (!head) { 00176 if (chan) 00177 ast_autoservice_stop(chan); 00178 return -1; 00179 } 00180 00181 resultslen = 0; 00182 n = 0; 00183 for (var = head; var; n++, var = var->next) 00184 resultslen += strlen(var->name) + strlen(var->value); 00185 /* add space for delimiters and final '\0' */ 00186 resultslen += n * (strlen(args.delim1) + strlen(args.delim2)) + 1; 00187 00188 out = ast_str_alloca(resultslen); 00189 for (var = head; var; var = var->next) 00190 ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1); 00191 ast_copy_string(buf, ast_str_buffer(out), len); 00192 00193 ast_variables_destroy(head); 00194 00195 if (chan) 00196 ast_autoservice_stop(chan); 00197 00198 return 0; 00199 }
static int function_realtime_readdestroy | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 357 of file func_realtime.c.
References args, AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), ast_copy_string(), AST_DECLARE_APP_ARGS, ast_destroy_realtime(), ast_load_realtime_all(), ast_log(), AST_STANDARD_APP_ARGS, ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_strlen_zero(), ast_variables_destroy(), LOG_WARNING, ast_variable::next, SENTINEL, value, and var.
00358 { 00359 struct ast_variable *var, *head; 00360 struct ast_str *out; 00361 size_t resultslen; 00362 int n; 00363 AST_DECLARE_APP_ARGS(args, 00364 AST_APP_ARG(family); 00365 AST_APP_ARG(fieldmatch); 00366 AST_APP_ARG(value); 00367 AST_APP_ARG(delim1); 00368 AST_APP_ARG(delim2); 00369 ); 00370 00371 if (ast_strlen_zero(data)) { 00372 ast_log(LOG_WARNING, "Syntax: REALTIME_DESTROY(family,fieldmatch[,value[,delim1[,delim2]]]) - missing argument!\n"); 00373 return -1; 00374 } 00375 00376 AST_STANDARD_APP_ARGS(args, data); 00377 00378 if (!args.delim1) 00379 args.delim1 = ","; 00380 if (!args.delim2) 00381 args.delim2 = "="; 00382 00383 if (chan) 00384 ast_autoservice_start(chan); 00385 00386 head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL); 00387 00388 if (!head) { 00389 if (chan) 00390 ast_autoservice_stop(chan); 00391 return -1; 00392 } 00393 00394 resultslen = 0; 00395 n = 0; 00396 for (var = head; var; n++, var = var->next) 00397 resultslen += strlen(var->name) + strlen(var->value); 00398 /* add space for delimiters and final '\0' */ 00399 resultslen += n * (strlen(args.delim1) + strlen(args.delim2)) + 1; 00400 00401 out = ast_str_alloca(resultslen); 00402 for (var = head; var; var = var->next) { 00403 ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1); 00404 } 00405 ast_copy_string(buf, ast_str_buffer(out), len); 00406 00407 ast_destroy_realtime(args.family, args.fieldmatch, args.value, SENTINEL); 00408 ast_variables_destroy(head); 00409 00410 if (chan) 00411 ast_autoservice_stop(chan); 00412 00413 return 0; 00414 }
static int function_realtime_store | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
Definition at line 309 of file func_realtime.c.
References AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, ast_store_realtime(), ast_strdupa, ast_strlen_zero(), f, LOG_WARNING, pbx_builtin_setvar_helper(), and SENTINEL.
00310 { 00311 int res = 0; 00312 char storeid[32]; 00313 char *valcopy; 00314 AST_DECLARE_APP_ARGS(a, 00315 AST_APP_ARG(family); 00316 AST_APP_ARG(f)[30]; /* fields */ 00317 ); 00318 00319 AST_DECLARE_APP_ARGS(v, 00320 AST_APP_ARG(v)[30]; /* values */ 00321 ); 00322 00323 if (ast_strlen_zero(data)) { 00324 ast_log(LOG_WARNING, "Syntax: REALTIME_STORE(family,field1,field2,...,field30) - missing argument!\n"); 00325 return -1; 00326 } 00327 00328 if (chan) 00329 ast_autoservice_start(chan); 00330 00331 valcopy = ast_strdupa(value); 00332 AST_STANDARD_APP_ARGS(a, data); 00333 AST_STANDARD_APP_ARGS(v, valcopy); 00334 00335 res = ast_store_realtime(a.family, 00336 a.f[0], v.v[0], a.f[1], v.v[1], a.f[2], v.v[2], a.f[3], v.v[3], a.f[4], v.v[4], 00337 a.f[5], v.v[5], a.f[6], v.v[6], a.f[7], v.v[7], a.f[8], v.v[8], a.f[9], v.v[9], 00338 a.f[10], v.v[10], a.f[11], v.v[11], a.f[12], v.v[12], a.f[13], v.v[13], a.f[14], v.v[14], 00339 a.f[15], v.v[15], a.f[16], v.v[16], a.f[17], v.v[17], a.f[18], v.v[18], a.f[19], v.v[19], 00340 a.f[20], v.v[20], a.f[21], v.v[21], a.f[22], v.v[22], a.f[23], v.v[23], a.f[24], v.v[24], 00341 a.f[25], v.v[25], a.f[26], v.v[26], a.f[27], v.v[27], a.f[28], v.v[28], a.f[29], v.v[29], SENTINEL 00342 ); 00343 00344 if (res < 0) { 00345 ast_log(LOG_WARNING, "Failed to store. Check the debug log for possible data repository related entries.\n"); 00346 } else { 00347 snprintf(storeid, sizeof(storeid), "%d", res); 00348 pbx_builtin_setvar_helper(chan, "RTSTOREID", storeid); 00349 } 00350 00351 if (chan) 00352 ast_autoservice_stop(chan); 00353 00354 return 0; 00355 }
static int function_realtime_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
Definition at line 201 of file func_realtime.c.
References args, AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_update_realtime(), LOG_WARNING, and SENTINEL.
00202 { 00203 int res = 0; 00204 AST_DECLARE_APP_ARGS(args, 00205 AST_APP_ARG(family); 00206 AST_APP_ARG(fieldmatch); 00207 AST_APP_ARG(value); 00208 AST_APP_ARG(field); 00209 ); 00210 00211 if (ast_strlen_zero(data)) { 00212 ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,value,newcol) - missing argument!\n", cmd); 00213 return -1; 00214 } 00215 00216 if (chan) 00217 ast_autoservice_start(chan); 00218 00219 AST_STANDARD_APP_ARGS(args, data); 00220 00221 res = ast_update_realtime(args.family, args.fieldmatch, args.value, args.field, (char *)value, SENTINEL); 00222 00223 if (res < 0) { 00224 ast_log(LOG_WARNING, "Failed to update. Check the debug log for possible data repository related entries.\n"); 00225 } 00226 00227 if (chan) 00228 ast_autoservice_stop(chan); 00229 00230 return 0; 00231 }
static int load_module | ( | void | ) | [static] |
Definition at line 454 of file func_realtime.c.
References ast_custom_function_register, realtime_destroy_function, realtime_function, realtime_store_function, realtimefield_function, and realtimehash_function.
00455 { 00456 int res = 0; 00457 res |= ast_custom_function_register(&realtime_function); 00458 res |= ast_custom_function_register(&realtime_store_function); 00459 res |= ast_custom_function_register(&realtime_destroy_function); 00460 res |= ast_custom_function_register(&realtimefield_function); 00461 res |= ast_custom_function_register(&realtimehash_function); 00462 return res; 00463 }
static int realtimefield_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 233 of file func_realtime.c.
References args, AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), ast_copy_string(), ast_debug, AST_DECLARE_APP_ARGS, ast_load_realtime_all(), ast_log(), AST_STANDARD_APP_ARGS, ast_str_append(), ast_str_reset(), ast_str_set_escapecommas(), ast_str_thread_get(), ast_strlen_zero(), buf1, buf2, buf3, first, LOG_WARNING, SENTINEL, value, and var.
00234 { 00235 struct ast_variable *var, *head; 00236 struct ast_str *escapebuf = ast_str_thread_get(&buf1, 16); 00237 struct ast_str *fields = ast_str_thread_get(&buf2, 16); 00238 struct ast_str *values = ast_str_thread_get(&buf3, 16); 00239 int first = 0; 00240 enum { rtfield, rthash } which; 00241 AST_DECLARE_APP_ARGS(args, 00242 AST_APP_ARG(family); 00243 AST_APP_ARG(fieldmatch); 00244 AST_APP_ARG(value); 00245 AST_APP_ARG(fieldname); 00246 ); 00247 00248 if (!strcmp(cmd, "REALTIME_FIELD")) { 00249 which = rtfield; 00250 } else { 00251 which = rthash; 00252 } 00253 00254 if (ast_strlen_zero(data)) { 00255 ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,value%s) - missing argument!\n", cmd, which == rtfield ? ",fieldname" : ""); 00256 return -1; 00257 } 00258 00259 AST_STANDARD_APP_ARGS(args, data); 00260 00261 if ((which == rtfield && args.argc != 4) || (which == rthash && args.argc != 3)) { 00262 ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,value%s) - missing argument!\n", cmd, which == rtfield ? ",fieldname" : ""); 00263 return -1; 00264 } 00265 00266 if (chan) { 00267 ast_autoservice_start(chan); 00268 } 00269 00270 if (!(head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL))) { 00271 if (chan) { 00272 ast_autoservice_stop(chan); 00273 } 00274 return -1; 00275 } 00276 00277 ast_str_reset(fields); 00278 ast_str_reset(values); 00279 00280 for (var = head; var; var = var->next) { 00281 if (which == rtfield) { 00282 ast_debug(1, "Comparing %s to %s\n", var->name, args.fieldname); 00283 if (!strcasecmp(var->name, args.fieldname)) { 00284 ast_debug(1, "Match! Value is %s\n", var->value); 00285 ast_copy_string(buf, var->value, len); 00286 break; 00287 } 00288 } else if (which == rthash) { 00289 ast_debug(1, "Setting hash key %s to value %s\n", var->name, var->value); 00290 ast_str_append(&fields, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->name, INT_MAX)); 00291 ast_str_append(&values, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->value, INT_MAX)); 00292 first = 0; 00293 } 00294 } 00295 ast_variables_destroy(head); 00296 00297 if (which == rthash) { 00298 pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", ast_str_buffer(fields)); 00299 ast_copy_string(buf, ast_str_buffer(values), len); 00300 } 00301 00302 if (chan) { 00303 ast_autoservice_stop(chan); 00304 } 00305 00306 return 0; 00307 }
static int unload_module | ( | void | ) | [static] |
Definition at line 443 of file func_realtime.c.
References ast_custom_function_unregister(), realtime_destroy_function, realtime_function, realtime_store_function, realtimefield_function, and realtimehash_function.
00444 { 00445 int res = 0; 00446 res |= ast_custom_function_unregister(&realtime_function); 00447 res |= ast_custom_function_unregister(&realtime_store_function); 00448 res |= ast_custom_function_unregister(&realtime_destroy_function); 00449 res |= ast_custom_function_unregister(&realtimefield_function); 00450 res |= ast_custom_function_unregister(&realtimehash_function); 00451 return res; 00452 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Read/Write/Store/Destroy values from a RealTime repository" , .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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 465 of file func_realtime.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 465 of file func_realtime.c.
struct ast_threadstorage buf1 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf1 , .custom_init = NULL , } [static] |
Definition at line 140 of file func_realtime.c.
Referenced by adsi_message(), audiohook_read_frame_both(), config_curl(), destroy_curl(), destroy_pgsql(), fix_gotos_in_extensions(), gen_prios(), realtime_curl(), realtime_multi_curl(), realtimefield_read(), store_curl(), update2_curl(), and update_curl().
struct ast_threadstorage buf2 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf2 , .custom_init = NULL , } [static] |
Definition at line 141 of file func_realtime.c.
Referenced by adsi_message(), ast_compile_ael2(), audiohook_read_frame_both(), destroy_curl(), destroy_pgsql(), gen_prios(), HandleSelectCodec(), read_config(), realtime_curl(), realtime_multi_curl(), realtimefield_read(), rpt_exec(), show_dialplan_helper(), store_curl(), update2_curl(), and update_curl().
struct ast_threadstorage buf3 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf3 , .custom_init = NULL , } [static] |
struct ast_custom_function realtime_destroy_function [static] |
Initial value:
{ .name = "REALTIME_DESTROY", .read = function_realtime_readdestroy, }
Definition at line 438 of file func_realtime.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function realtime_function [static] |
Initial value:
{ .name = "REALTIME", .read = function_realtime_read, .write = function_realtime_write, }
Definition at line 416 of file func_realtime.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function realtime_store_function [static] |
Initial value:
{ .name = "REALTIME_STORE", .write = function_realtime_store, }
Definition at line 433 of file func_realtime.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function realtimefield_function [static] |
Initial value:
{ .name = "REALTIME_FIELD", .read = realtimefield_read, .write = function_realtime_write, }
Definition at line 422 of file func_realtime.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function realtimehash_function [static] |
Initial value:
{ .name = "REALTIME_HASH", .read = realtimefield_read, }
Definition at line 428 of file func_realtime.c.
Referenced by load_module(), and unload_module().