Store CDR records in a SQLite database. More...
#include "asterisk.h"#include <sqlite.h>#include "asterisk/channel.h"#include "asterisk/module.h"#include "asterisk/utils.h"#include "asterisk/paths.h"
Go to the source code of this file.
Defines | |
| #define | DATE_FORMAT "%Y-%m-%d %T" |
| #define | LOG_UNIQUEID 0 |
| #define | LOG_USERFIELD 0 |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static void | format_date (char *buffer, size_t length, struct timeval *when) |
| static int | load_module (void) |
| static int | sqlite_log (struct ast_cdr *cdr) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "SQLite CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static sqlite * | db = NULL |
| static char * | name = "sqlite" |
| static char | sql_create_table [] = ");" |
| SQL table format. | |
| static ast_mutex_t | sqlite_lock = AST_MUTEX_INIT_VALUE |
Store CDR records in a SQLite database.
See also
Creates the database and table on-the-fly
Definition in file cdr_sqlite.c.
| #define DATE_FORMAT "%Y-%m-%d %T" |
Definition at line 56 of file cdr_sqlite.c.
Referenced by format_date().
| #define LOG_UNIQUEID 0 |
Definition at line 52 of file cdr_sqlite.c.
Referenced by sqlite_log().
| #define LOG_USERFIELD 0 |
Definition at line 53 of file cdr_sqlite.c.
Referenced by sqlite_log().
| static void __reg_module | ( | void | ) | [static] |
Definition at line 217 of file cdr_sqlite.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 217 of file cdr_sqlite.c.
| static void format_date | ( | char * | buffer, |
| size_t | length, | ||
| struct timeval * | when | ||
| ) | [static] |
Definition at line 90 of file cdr_sqlite.c.
References ast_localtime(), ast_strftime(), and DATE_FORMAT.
Referenced by sqlite_log().
{
struct ast_tm tm;
ast_localtime(when, &tm, NULL);
ast_strftime(buffer, length, DATE_FORMAT, &tm);
}
| static int load_module | ( | void | ) | [static] |
Definition at line 173 of file cdr_sqlite.c.
References ast_cdr_register(), ast_config_AST_LOG_DIR, AST_FILE_MODE, ast_free, ast_log(), ast_module_info::description, LOG_ERROR, LOG_NOTICE, and sqlite_log().
{
char *zErr;
char fn[PATH_MAX];
int res;
ast_log(LOG_NOTICE, "This module has been marked deprecated in favor of "
"using cdr_sqlite3_custom.\n");
/* is the database there? */
snprintf(fn, sizeof(fn), "%s/cdr.db", ast_config_AST_LOG_DIR);
db = sqlite_open(fn, AST_FILE_MODE, &zErr);
if (!db) {
ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr);
ast_free(zErr);
return -1;
}
/* is the table there? */
res = sqlite_exec(db, "SELECT COUNT(AcctId) FROM cdr;", NULL, NULL, NULL);
if (res) {
res = sqlite_exec(db, sql_create_table, NULL, NULL, &zErr);
if (res) {
ast_log(LOG_ERROR, "cdr_sqlite: Unable to create table 'cdr': %s\n", zErr);
ast_free(zErr);
goto err;
}
/* TODO: here we should probably create an index */
}
res = ast_cdr_register(name, ast_module_info->description, sqlite_log);
if (res) {
ast_log(LOG_ERROR, "Unable to register SQLite CDR handling\n");
return -1;
}
return 0;
err:
if (db)
sqlite_close(db);
return -1;
}
| static int sqlite_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 98 of file cdr_sqlite.c.
References ast_cdr::accountcode, ast_cdr::amaflags, ast_cdr::answer, ast_free, ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_cdr::billsec, ast_cdr::channel, ast_cdr::clid, ast_cdr::dcontext, ast_cdr::disposition, ast_cdr::dst, ast_cdr::dstchannel, ast_cdr::duration, ast_cdr::end, format_date(), ast_cdr::lastapp, ast_cdr::lastdata, LOG_ERROR, LOG_UNIQUEID, LOG_USERFIELD, sqlite_lock, ast_cdr::src, ast_cdr::start, ast_cdr::uniqueid, and ast_cdr::userfield.
Referenced by load_module().
{
int res = 0;
char *zErr = 0;
char startstr[80], answerstr[80], endstr[80];
int count;
ast_mutex_lock(&sqlite_lock);
format_date(startstr, sizeof(startstr), &cdr->start);
format_date(answerstr, sizeof(answerstr), &cdr->answer);
format_date(endstr, sizeof(endstr), &cdr->end);
for(count=0; count<5; count++) {
res = sqlite_exec_printf(db,
"INSERT INTO cdr ("
"clid,src,dst,dcontext,"
"channel,dstchannel,lastapp,lastdata, "
"start,answer,end,"
"duration,billsec,disposition,amaflags, "
"accountcode"
# if LOG_UNIQUEID
",uniqueid"
# endif
# if LOG_USERFIELD
",userfield"
# endif
") VALUES ("
"'%q', '%q', '%q', '%q', "
"'%q', '%q', '%q', '%q', "
"'%q', '%q', '%q', "
"%d, %d, %d, %d, "
"'%q'"
# if LOG_UNIQUEID
",'%q'"
# endif
# if LOG_USERFIELD
",'%q'"
# endif
")", NULL, NULL, &zErr,
cdr->clid, cdr->src, cdr->dst, cdr->dcontext,
cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,
startstr, answerstr, endstr,
cdr->duration, cdr->billsec, cdr->disposition, cdr->amaflags,
cdr->accountcode
# if LOG_UNIQUEID
,cdr->uniqueid
# endif
# if LOG_USERFIELD
,cdr->userfield
# endif
);
if (res != SQLITE_BUSY && res != SQLITE_LOCKED)
break;
usleep(200);
}
if (zErr) {
ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr);
ast_free(zErr);
}
ast_mutex_unlock(&sqlite_lock);
return res;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 164 of file cdr_sqlite.c.
References ast_cdr_unregister().
{
ast_cdr_unregister(name);
if (db) {
sqlite_close(db);
}
return 0;
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "SQLite CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 217 of file cdr_sqlite.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 217 of file cdr_sqlite.c.
sqlite* db = NULL [static] |
Definition at line 59 of file cdr_sqlite.c.
Referenced by ast_config_internal_load(), ast_destroy_realtime(), ast_load_realtime_helper(), ast_load_realtime_multientry(), ast_realtime_require_field(), ast_store_realtime(), ast_unload_realtime(), ast_update2_realtime(), and ast_update_realtime().
char* name = "sqlite" [static] |
Definition at line 58 of file cdr_sqlite.c.
char sql_create_table[] = ");" [static] |
SQL table format.
Definition at line 64 of file cdr_sqlite.c.
ast_mutex_t sqlite_lock = AST_MUTEX_INIT_VALUE [static] |
Definition at line 61 of file cdr_sqlite.c.
Referenced by sqlite_log().