Mon Oct 8 12:39:23 2012

Asterisk developer's documentation


func_realtime.c File Reference

REALTIME dialplan function. More...

#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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_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


Detailed Description

REALTIME dialplan function.

Author:
BJ Weschke <bweschke@btwtech.com>

Definition in file func_realtime.c.


Function Documentation

static void __init_buf1 ( void   )  [static]

Definition at line 174 of file func_realtime.c.

00179 {

static void __init_buf2 ( void   )  [static]

Definition at line 175 of file func_realtime.c.

00179 {

static void __init_buf3 ( void   )  [static]

Definition at line 176 of file func_realtime.c.

00179 {

static void __reg_module ( void   )  [static]

Definition at line 506 of file func_realtime.c.

static void __unreg_module ( void   )  [static]

Definition at line 506 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 178 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.

00179 {
00180    struct ast_variable *var, *head;
00181    struct ast_str *out;
00182    size_t resultslen;
00183    int n;
00184    AST_DECLARE_APP_ARGS(args,
00185       AST_APP_ARG(family);
00186       AST_APP_ARG(fieldmatch);
00187       AST_APP_ARG(value);
00188       AST_APP_ARG(delim1);
00189       AST_APP_ARG(delim2);
00190    );
00191 
00192    if (ast_strlen_zero(data)) {
00193       ast_log(LOG_WARNING, "Syntax: REALTIME(family,fieldmatch[,matchvalue[,delim1[,delim2]]]) - missing argument!\n");
00194       return -1;
00195    }
00196 
00197    AST_STANDARD_APP_ARGS(args, data);
00198 
00199    if (!args.delim1)
00200       args.delim1 = ",";
00201    if (!args.delim2)
00202       args.delim2 = "=";
00203 
00204    if (chan)
00205       ast_autoservice_start(chan);
00206 
00207    head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL);
00208 
00209    if (!head) {
00210       if (chan)
00211          ast_autoservice_stop(chan);
00212       return -1;
00213    }
00214 
00215    resultslen = 0;
00216    n = 0;
00217    for (var = head; var; n++, var = var->next)
00218       resultslen += strlen(var->name) + strlen(var->value);
00219    /* add space for delimiters and final '\0' */
00220    resultslen += n * (strlen(args.delim1) + strlen(args.delim2)) + 1;
00221 
00222    out = ast_str_alloca(resultslen);
00223    for (var = head; var; var = var->next)
00224       ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
00225    ast_copy_string(buf, ast_str_buffer(out), len);
00226 
00227    ast_variables_destroy(head);
00228 
00229    if (chan)
00230       ast_autoservice_stop(chan);
00231 
00232    return 0;
00233 }

static int function_realtime_readdestroy ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 398 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.

00399 {
00400    struct ast_variable *var, *head;
00401    struct ast_str *out;
00402    size_t resultslen;
00403    int n;
00404    AST_DECLARE_APP_ARGS(args,
00405       AST_APP_ARG(family);
00406       AST_APP_ARG(fieldmatch);
00407       AST_APP_ARG(value);
00408       AST_APP_ARG(delim1);
00409       AST_APP_ARG(delim2);
00410    );
00411 
00412    if (ast_strlen_zero(data)) {
00413       ast_log(LOG_WARNING, "Syntax: REALTIME_DESTROY(family,fieldmatch[,matchvalue[,delim1[,delim2]]]) - missing argument!\n");
00414       return -1;
00415    }
00416 
00417    AST_STANDARD_APP_ARGS(args, data);
00418 
00419    if (!args.delim1)
00420       args.delim1 = ",";
00421    if (!args.delim2)
00422       args.delim2 = "=";
00423 
00424    if (chan)
00425       ast_autoservice_start(chan);
00426 
00427    head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL);
00428 
00429    if (!head) {
00430       if (chan)
00431          ast_autoservice_stop(chan);
00432       return -1;
00433    }
00434 
00435    resultslen = 0;
00436    n = 0;
00437    for (var = head; var; n++, var = var->next)
00438       resultslen += strlen(var->name) + strlen(var->value);
00439    /* add space for delimiters and final '\0' */
00440    resultslen += n * (strlen(args.delim1) + strlen(args.delim2)) + 1;
00441 
00442    out = ast_str_alloca(resultslen);
00443    for (var = head; var; var = var->next) {
00444       ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
00445    }
00446    ast_copy_string(buf, ast_str_buffer(out), len);
00447 
00448    ast_destroy_realtime(args.family, args.fieldmatch, args.value, SENTINEL);
00449    ast_variables_destroy(head);
00450 
00451    if (chan)
00452       ast_autoservice_stop(chan);
00453 
00454    return 0;
00455 }

static int function_realtime_store ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 350 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.

00351 {
00352    int res = 0;
00353    char storeid[32];
00354    char *valcopy;
00355    AST_DECLARE_APP_ARGS(a,
00356       AST_APP_ARG(family);
00357       AST_APP_ARG(f)[30]; /* fields */
00358    );
00359 
00360    AST_DECLARE_APP_ARGS(v,
00361       AST_APP_ARG(v)[30]; /* values */
00362    );
00363 
00364    if (ast_strlen_zero(data)) {
00365       ast_log(LOG_WARNING, "Syntax: REALTIME_STORE(family,field1,field2,...,field30) - missing argument!\n");
00366       return -1;
00367    }
00368 
00369    if (chan)
00370       ast_autoservice_start(chan);
00371 
00372    valcopy = ast_strdupa(value);
00373    AST_STANDARD_APP_ARGS(a, data);
00374    AST_STANDARD_APP_ARGS(v, valcopy);
00375 
00376    res = ast_store_realtime(a.family,
00377       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],
00378       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],
00379       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],
00380       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],
00381       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],
00382       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
00383    );
00384 
00385    if (res < 0) {
00386       ast_log(LOG_WARNING, "Failed to store. Check the debug log for possible data repository related entries.\n");
00387    } else {
00388       snprintf(storeid, sizeof(storeid), "%d", res);
00389       pbx_builtin_setvar_helper(chan, "RTSTOREID", storeid);
00390    }
00391 
00392    if (chan)
00393       ast_autoservice_stop(chan);
00394 
00395    return 0;
00396 }

static int function_realtime_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 235 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.

00236 {
00237    int res = 0;
00238    AST_DECLARE_APP_ARGS(args,
00239       AST_APP_ARG(family);
00240       AST_APP_ARG(fieldmatch);
00241       AST_APP_ARG(value);
00242       AST_APP_ARG(field);
00243    );
00244 
00245    if (ast_strlen_zero(data)) {
00246       ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,matchvalue,updatecol) - missing argument!\n", cmd);
00247       return -1;
00248    }
00249 
00250    AST_STANDARD_APP_ARGS(args, data);
00251 
00252    if (ast_strlen_zero(args.fieldmatch) || ast_strlen_zero(args.field)) {
00253       ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,matchvalue,updatecol) - missing argument!\n", cmd);
00254       return -1;
00255    }
00256 
00257    if (chan) {
00258       ast_autoservice_start(chan);
00259    }
00260 
00261    res = ast_update_realtime(args.family, args.fieldmatch, args.value, args.field, (char *)value, SENTINEL);
00262 
00263    if (res < 0) {
00264       ast_log(LOG_WARNING, "Failed to update. Check the debug log for possible data repository related entries.\n");
00265    }
00266 
00267    if (chan) {
00268       ast_autoservice_stop(chan);
00269    }
00270 
00271    return res;
00272 }

static int load_module ( void   )  [static]

Definition at line 495 of file func_realtime.c.

References ast_custom_function_register, realtime_destroy_function, realtime_function, realtime_store_function, realtimefield_function, and realtimehash_function.

static int realtimefield_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 274 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.

00275 {
00276    struct ast_variable *var, *head;
00277    struct ast_str *escapebuf = ast_str_thread_get(&buf1, 16);
00278    struct ast_str *fields = ast_str_thread_get(&buf2, 16);
00279    struct ast_str *values = ast_str_thread_get(&buf3, 16);
00280    int first = 0;
00281    enum { rtfield, rthash } which;
00282    AST_DECLARE_APP_ARGS(args,
00283       AST_APP_ARG(family);
00284       AST_APP_ARG(fieldmatch);
00285       AST_APP_ARG(value);
00286       AST_APP_ARG(fieldname);
00287    );
00288 
00289    if (!strcmp(cmd, "REALTIME_FIELD")) {
00290       which = rtfield;
00291    } else {
00292       which = rthash;
00293    }
00294 
00295    if (ast_strlen_zero(data)) {
00296       ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,matchvalue%s) - missing argument!\n", cmd, which == rtfield ? ",fieldname" : "");
00297       return -1;
00298    }
00299 
00300    AST_STANDARD_APP_ARGS(args, data);
00301 
00302    if ((which == rtfield && args.argc != 4) || (which == rthash && args.argc != 3)) {
00303       ast_log(LOG_WARNING, "Syntax: %s(family,fieldmatch,matchvalue%s) - missing argument!\n", cmd, which == rtfield ? ",fieldname" : "");
00304       return -1;
00305    }
00306 
00307    if (chan) {
00308       ast_autoservice_start(chan);
00309    }
00310 
00311    if (!(head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, SENTINEL))) {
00312       if (chan) {
00313          ast_autoservice_stop(chan);
00314       }
00315       return -1;
00316    }
00317 
00318    ast_str_reset(fields);
00319    ast_str_reset(values);
00320 
00321    for (var = head; var; var = var->next) {
00322       if (which == rtfield) {
00323          ast_debug(1, "Comparing %s to %s\n", var->name, args.fieldname);
00324          if (!strcasecmp(var->name, args.fieldname)) {
00325             ast_debug(1, "Match! Value is %s\n", var->value);
00326             ast_copy_string(buf, var->value, len);
00327             break;
00328          }
00329       } else if (which == rthash) {
00330          ast_debug(1, "Setting hash key %s to value %s\n", var->name, var->value);
00331          ast_str_append(&fields, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->name, INT_MAX));
00332          ast_str_append(&values, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->value, INT_MAX));
00333          first = 0;
00334       }
00335    }
00336    ast_variables_destroy(head);
00337 
00338    if (which == rthash) {
00339       pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", ast_str_buffer(fields));
00340       ast_copy_string(buf, ast_str_buffer(values), len);
00341    }
00342 
00343    if (chan) {
00344       ast_autoservice_stop(chan);
00345    }
00346 
00347    return 0;
00348 }

static int unload_module ( void   )  [static]

Definition at line 484 of file func_realtime.c.

References ast_custom_function_unregister(), realtime_destroy_function, realtime_function, realtime_store_function, realtimefield_function, and realtimehash_function.


Variable Documentation

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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 506 of file func_realtime.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 506 of file func_realtime.c.

struct ast_threadstorage buf1 = { .once = PTHREAD_ONCE_INIT , .key_init = __init_buf1 , .custom_init = NULL , } [static]

Definition at line 174 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 175 of file func_realtime.c.

Referenced by adsi_message(), adsi_status(), adsi_status2(), ast_compile_ael2(), audiohook_read_frame_both(), destroy_curl(), destroy_pgsql(), gen_prios(), HandleSelectCodec(), read_config(), realtime_curl(), realtime_multi_curl(), realtimefield_read(), 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]

Definition at line 176 of file func_realtime.c.

Referenced by realtimefield_read().

struct ast_custom_function realtime_destroy_function [static]

Initial value:

 {
   .name = "REALTIME_DESTROY",
   .read = function_realtime_readdestroy,
}

Definition at line 479 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 457 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 474 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 463 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 469 of file func_realtime.c.

Referenced by load_module(), and unload_module().


Generated on Mon Oct 8 12:39:23 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7