Mon Mar 20 08:25:47 2006

Asterisk developer's documentation


Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

app_realtime.c File Reference

RealTime App. More...

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/options.h"
#include "asterisk/pbx.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/cli.h"

Go to the source code of this file.

Defines

#define crop_data(str)   { *(str) = '\0' ; (str)++; }
#define next_one(var)   var = var->next

Functions

int cli_load_realtime (int fd, int argc, char **argv)
int cli_update_realtime (int fd, int argc, char **argv)
char * description (void)
 Provides a description of the module.
char * key ()
 Returns the ASTERISK_GPL_KEY.
int load_module (void)
 Initialize the module.
int realtime_exec (struct ast_channel *chan, void *data)
int realtime_update_exec (struct ast_channel *chan, void *data)
int unload_module (void)
 Cleanup all module structures, sockets, etc.
int usecount (void)
 Provides a usecount.

Variables

char * app = "RealTime"
ast_cli_entry cli_load_realtime_cmd
char cli_load_realtime_usage []
ast_cli_entry cli_update_realtime_cmd
char cli_update_realtime_usage []
char * desc
 LOCAL_USER_DECL
 STANDARD_LOCAL_USER
char * synopsis = "Realtime Data Lookup"
char * tdesc = "Realtime Data Lookup/Rewrite"
char * uapp = "RealTimeUpdate"
char * udesc
char * USAGE = "RealTime(<family>|<colmatch>|<value>[|<prefix>])"
char * usynopsis = "Realtime Data Rewrite"
char * UUSAGE = "RealTimeUpdate(<family>|<colmatch>|<value>|<newcol>|<newval>)"


Detailed Description

RealTime App.

Definition in file app_realtime.c.


Define Documentation

#define crop_data str   )     { *(str) = '\0' ; (str)++; }
 

Definition at line 47 of file app_realtime.c.

Referenced by realtime_exec(), and realtime_update_exec().

#define next_one var   )     var = var->next
 

Definition at line 46 of file app_realtime.c.


Function Documentation

int cli_load_realtime int  fd,
int  argc,
char **  argv
[static]
 

Definition at line 67 of file app_realtime.c.

References ast_cli(), ast_load_realtime(), ast_variable::name, ast_variable::next, ast_variable::value, and var.

00068 {
00069    char *header_format = "%30s  %-30s\n";
00070    struct ast_variable *var=NULL;
00071 
00072    if(argc<5) {
00073       ast_cli(fd, "You must supply a family name, a column to match on, and a value to match to.\n");
00074       return RESULT_FAILURE;
00075    }
00076 
00077    var = ast_load_realtime(argv[2], argv[3], argv[4], NULL);
00078 
00079    if(var) {
00080       ast_cli(fd, header_format, "Column Name", "Column Value");
00081       ast_cli(fd, header_format, "--------------------", "--------------------");
00082       while(var) {
00083          ast_cli(fd, header_format, var->name, var->value);
00084          var = var->next;
00085       }
00086    } else {
00087       ast_cli(fd, "No rows found matching search criteria.\n");
00088    }
00089    return RESULT_SUCCESS;
00090 }

int cli_update_realtime int  fd,
int  argc,
char **  argv
[static]
 

Definition at line 92 of file app_realtime.c.

References ast_cli(), and ast_update_realtime().

00092                                                               {
00093    int res = 0;
00094 
00095    if(argc<7) {
00096       ast_cli(fd, "You must supply a family name, a column to update on, a new value, column to match, and value to to match.\n");
00097       ast_cli(fd, "Ex: realtime update sipfriends name bobsphone port 4343\n will execute SQL as UPDATE sipfriends SET port = 4343 WHERE name = bobsphone\n");
00098       return RESULT_FAILURE;
00099    }
00100 
00101    res = ast_update_realtime(argv[2], argv[3], argv[4], argv[5], argv[6], NULL);
00102 
00103    if(res < 0) {
00104       ast_cli(fd, "Failed to update. Check the debug log for possible SQL related entries.\n");
00105       return RESULT_SUCCESS;
00106    }
00107 
00108        ast_cli(fd, "Updated %d RealTime record%s.\n", res, (res != 1) ? "s" : "");
00109 
00110    return RESULT_SUCCESS;
00111 }

char* description void   ) 
 

Provides a description of the module.

Returns:
a short description of your module

Definition at line 246 of file app_realtime.c.

00247 {
00248    return tdesc;
00249 }

char* key void   ) 
 

Returns the ASTERISK_GPL_KEY.

This returns the ASTERISK_GPL_KEY, signifiying that you agree to the terms of the GPL stated in the ASTERISK_GPL_KEY. Your module will not load if it does not return the EXACT message:

 char *key(void) {
         return ASTERISK_GPL_KEY;
 }

Returns:
ASTERISK_GPL_KEY

Definition at line 258 of file app_realtime.c.

00259 {
00260    return ASTERISK_GPL_KEY;
00261 }

int load_module void   ) 
 

Initialize the module.

Initialize the Agents module. This function is being called by Asterisk when loading the module. Among other thing it registers applications, cli commands and reads the cofiguration file.

Returns:
int Always 0.

Definition at line 234 of file app_realtime.c.

References app, ast_cli_register(), ast_register_application(), cli_load_realtime_cmd, cli_update_realtime_cmd, desc, realtime_exec(), realtime_update_exec(), synopsis, uapp, udesc, and usynopsis.

00235 {
00236    int res;
00237 
00238    res = ast_cli_register(&cli_load_realtime_cmd);
00239    res |= ast_cli_register(&cli_update_realtime_cmd);
00240    res |= ast_register_application(uapp, realtime_update_exec, usynopsis, udesc);
00241    res |= ast_register_application(app, realtime_exec, synopsis, desc);
00242 
00243    return res;
00244 }

int realtime_exec struct ast_channel chan,
void *  data
[static]
 

Definition at line 168 of file app_realtime.c.

References ast_load_realtime(), ast_log(), ast_strdupa, ast_strlen_zero(), ast_variables_destroy(), ast_verbose(), crop_data, LOCAL_USER_ADD, LOCAL_USER_REMOVE, LOG_ERROR, ast_variable::name, ast_variable::next, option_verbose, pbx_builtin_setvar_helper(), USAGE, ast_variable::value, var, and VERBOSE_PREFIX_4.

Referenced by load_module().

00169 {
00170    int res=0;
00171    struct localuser *u;
00172    struct ast_variable *var, *itt;
00173    char *family=NULL, *colmatch=NULL, *value=NULL, *prefix=NULL, *vname=NULL;
00174    size_t len;
00175       
00176    if (ast_strlen_zero(data)) {
00177       ast_log(LOG_ERROR,"Invalid input: usage %s\n",USAGE);
00178       return -1;
00179    }
00180    
00181    LOCAL_USER_ADD(u);
00182 
00183    if ((family = ast_strdupa(data))) {
00184       if ((colmatch = strchr(family,'|'))) {
00185          crop_data(colmatch);
00186          if ((value = strchr(colmatch,'|'))) {
00187             crop_data(value);
00188             if ((prefix = strchr(value,'|')))
00189                crop_data(prefix);
00190          }
00191       }
00192    }
00193    if (! (family && value && colmatch) ) {
00194       ast_log(LOG_ERROR,"Invalid input: usage %s\n",USAGE);
00195       res = -1;
00196    } else {
00197       if (option_verbose > 3)
00198          ast_verbose(VERBOSE_PREFIX_4"Realtime Lookup: family:'%s' colmatch:'%s' value:'%s'\n",family,colmatch,value);
00199       if ((var = ast_load_realtime(family, colmatch, value, NULL))) {
00200          for (itt = var; itt; itt = itt->next) {
00201             if(prefix) {
00202                len = strlen(prefix) + strlen(itt->name) + 2;
00203                vname = alloca(len);
00204                snprintf(vname,len,"%s%s",prefix,itt->name);
00205                
00206             } else 
00207                vname = itt->name;
00208 
00209             pbx_builtin_setvar_helper(chan, vname, itt->value);
00210          }
00211          ast_variables_destroy(var);
00212       } else if (option_verbose > 3)
00213          ast_verbose(VERBOSE_PREFIX_4"No Realtime Matches Found.\n");
00214    }
00215    
00216    LOCAL_USER_REMOVE(u);
00217    return res;
00218 }

int realtime_update_exec struct ast_channel chan,
void *  data
[static]
 

Definition at line 129 of file app_realtime.c.

References ast_log(), ast_strdupa, ast_strlen_zero(), ast_update_realtime(), crop_data, LOCAL_USER_ADD, LOCAL_USER_REMOVE, LOG_ERROR, and UUSAGE.

Referenced by load_module().

00130 {
00131    char *family=NULL, *colmatch=NULL, *value=NULL, *newcol=NULL, *newval=NULL;
00132    struct localuser *u;
00133    int res = 0;
00134 
00135    if (ast_strlen_zero(data)) {
00136       ast_log(LOG_ERROR,"Invalid input: usage %s\n",UUSAGE);
00137       return -1;
00138    }
00139    
00140    LOCAL_USER_ADD(u);
00141 
00142    if ((family = ast_strdupa(data))) {
00143       if ((colmatch = strchr(family,'|'))) {
00144          crop_data(colmatch);
00145          if ((value = strchr(colmatch,'|'))) {
00146             crop_data(value);
00147             if ((newcol = strchr(value,'|'))) {
00148                crop_data(newcol);
00149                if ((newval = strchr(newcol,'|'))) 
00150                   crop_data(newval);
00151             }
00152          }
00153       }
00154    }
00155    if (! (family && value && colmatch && newcol && newval) ) {
00156       ast_log(LOG_ERROR,"Invalid input: usage %s\n",UUSAGE);
00157       res = -1;
00158    } else {
00159       ast_update_realtime(family,colmatch,value,newcol,newval,NULL);
00160    }
00161 
00162    LOCAL_USER_REMOVE(u);
00163    
00164    return res;
00165 }

int unload_module void   ) 
 

Cleanup all module structures, sockets, etc.

This is called at exit. Any registrations and memory allocations need to be unregistered and free'd here. Nothing else will do these for you (until exit).

Returns:
Zero on success, or non-zero on error.

Definition at line 220 of file app_realtime.c.

References app, ast_cli_unregister(), ast_unregister_application(), cli_load_realtime_cmd, cli_update_realtime_cmd, and uapp.

00221 {
00222    int res;
00223 
00224    res = ast_cli_unregister(&cli_load_realtime_cmd);
00225    res |= ast_cli_unregister(&cli_update_realtime_cmd);
00226    res |= ast_unregister_application(uapp);
00227    res |= ast_unregister_application(app);
00228 
00229    STANDARD_HANGUP_LOCALUSERS;
00230 
00231    return res;
00232 }

int usecount void   ) 
 

Provides a usecount.

This function will be called by various parts of asterisk. Basically, all it has to do is to return a usecount when called. You will need to maintain your usecount within the module somewhere. The usecount should be how many channels provided by this module are in use.

Returns:
The module's usecount.

Definition at line 251 of file app_realtime.c.

References STANDARD_USECOUNT.

00252 {
00253    int res;
00254    STANDARD_USECOUNT(res);
00255    return res;
00256 }


Variable Documentation

char* app = "RealTime" [static]
 

Definition at line 50 of file app_realtime.c.

Referenced by load_module(), and unload_module().

struct ast_cli_entry cli_load_realtime_cmd [static]
 

Initial value:

 {
        { "realtime", "load", NULL, NULL }, cli_load_realtime,
        "Used to print out RealTime variables.", cli_load_realtime_usage, NULL }

Definition at line 117 of file app_realtime.c.

Referenced by load_module(), and unload_module().

char cli_load_realtime_usage[] [static]
 

Initial value:

"Usage: realtime load <family> <colmatch> <value>\n"
"       Prints out a list of variables using the RealTime driver.\n"

Definition at line 113 of file app_realtime.c.

struct ast_cli_entry cli_update_realtime_cmd [static]
 

Initial value:

 {
        { "realtime", "update", NULL, NULL }, cli_update_realtime,
        "Used to update RealTime variables.", cli_update_realtime_usage, NULL }

Definition at line 125 of file app_realtime.c.

Referenced by load_module(), and unload_module().

char cli_update_realtime_usage[] [static]
 

Initial value:

"Usage: realtime update <family> <colmatch> <value>\n"
"       Update a single variable using the RealTime driver.\n"

Definition at line 121 of file app_realtime.c.

char* desc [static]
 

Initial value:

 "Use the RealTime config handler system to read data into channel variables.\n"
"RealTime(<family>|<colmatch>|<value>[|<prefix>])\n\n"
"All unique column names will be set as channel variables with optional prefix to the name.\n"
"e.g. prefix of 'var_' would make the column 'name' become the variable ${var_name}\n\n"

Definition at line 56 of file app_realtime.c.

Referenced by load_module().

LOCAL_USER_DECL
 

Definition at line 65 of file app_realtime.c.

STANDARD_LOCAL_USER
 

Definition at line 64 of file app_realtime.c.

char* synopsis = "Realtime Data Lookup" [static]
 

Definition at line 52 of file app_realtime.c.

Referenced by load_module().

char* tdesc = "Realtime Data Lookup/Rewrite" [static]
 

Definition at line 49 of file app_realtime.c.

char* uapp = "RealTimeUpdate" [static]
 

Definition at line 51 of file app_realtime.c.

Referenced by load_module(), and unload_module().

char* udesc [static]
 

Initial value:

 "Use the RealTime config handler system to update a value\n"
"RealTimeUpdate(<family>|<colmatch>|<value>|<newcol>|<newval>)\n\n"
"The column <newcol> in 'family' matching column <colmatch>=<value> will be updated to <newval>\n"

Definition at line 60 of file app_realtime.c.

Referenced by load_module().

char* USAGE = "RealTime(<family>|<colmatch>|<value>[|<prefix>])" [static]
 

Definition at line 54 of file app_realtime.c.

Referenced by realtime_exec().

char* usynopsis = "Realtime Data Rewrite" [static]
 

Definition at line 53 of file app_realtime.c.

Referenced by load_module().

char* UUSAGE = "RealTimeUpdate(<family>|<colmatch>|<value>|<newcol>|<newval>)" [static]
 

Definition at line 55 of file app_realtime.c.

Referenced by realtime_update_exec().


Generated on Mon Mar 20 08:25:47 2006 for Asterisk - the Open Source PBX by  doxygen 1.3.9.1