#include "asterisk.h"
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sqlite.h>
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/logger.h"
#include "asterisk/utils.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 int | load_module (void) |
static int | sqlite_log (struct ast_cdr *cdr) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "SQLite CDR Backend" , .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 = "6989f2ec67f8497e38c12890500c525b" , .load = load_module, .unload = unload_module, } |
static const 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 = { PTHREAD_MUTEX_INITIALIZER , 1, { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INITIALIZER } |
Definition in file cdr_sqlite.c.
#define DATE_FORMAT "%Y-%m-%d %T" |
Definition at line 58 of file cdr_sqlite.c.
#define LOG_UNIQUEID 0 |
#define LOG_USERFIELD 0 |
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 int load_module | ( | void | ) | [static] |
Definition at line 176 of file cdr_sqlite.c.
References ast_cdr_register(), ast_config_AST_LOG_DIR, ast_log(), free, LOG_ERROR, and sqlite_log().
00177 { 00178 char *zErr; 00179 char fn[PATH_MAX]; 00180 int res; 00181 00182 /* is the database there? */ 00183 snprintf(fn, sizeof(fn), "%s/cdr.db", ast_config_AST_LOG_DIR); 00184 db = sqlite_open(fn, 0660, &zErr); 00185 if (!db) { 00186 ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr); 00187 free(zErr); 00188 return -1; 00189 } 00190 00191 /* is the table there? */ 00192 res = sqlite_exec(db, "SELECT COUNT(AcctId) FROM cdr;", NULL, NULL, NULL); 00193 if (res) { 00194 res = sqlite_exec(db, sql_create_table, NULL, NULL, &zErr); 00195 if (res) { 00196 ast_log(LOG_ERROR, "cdr_sqlite: Unable to create table 'cdr': %s\n", zErr); 00197 free(zErr); 00198 goto err; 00199 } 00200 00201 /* TODO: here we should probably create an index */ 00202 } 00203 00204 res = ast_cdr_register(name, ast_module_info->description, sqlite_log); 00205 if (res) { 00206 ast_log(LOG_ERROR, "Unable to register SQLite CDR handling\n"); 00207 return -1; 00208 } 00209 return 0; 00210 00211 err: 00212 if (db) 00213 sqlite_close(db); 00214 return -1; 00215 }
static int sqlite_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 92 of file cdr_sqlite.c.
References ast_cdr::accountcode, ast_cdr::amaflags, ast_cdr::answer, ast_localtime(), ast_log(), ast_mutex_lock, ast_mutex_unlock, ast_cdr::billsec, ast_cdr::channel, ast_cdr::clid, DATE_FORMAT, ast_cdr::dcontext, ast_cdr::disposition, ast_cdr::dst, ast_cdr::dstchannel, ast_cdr::duration, ast_cdr::end, free, ast_cdr::lastapp, ast_cdr::lastdata, LOG_ERROR, LOG_UNIQUEID, LOG_USERFIELD, sqlite_lock, ast_cdr::src, ast_cdr::start, t, ast_cdr::uniqueid, and ast_cdr::userfield.
Referenced by load_module().
00093 { 00094 int res = 0; 00095 char *zErr = 0; 00096 struct tm tm; 00097 time_t t; 00098 char startstr[80], answerstr[80], endstr[80]; 00099 int count; 00100 00101 ast_mutex_lock(&sqlite_lock); 00102 00103 t = cdr->start.tv_sec; 00104 ast_localtime(&t, &tm, NULL); 00105 strftime(startstr, sizeof(startstr), DATE_FORMAT, &tm); 00106 00107 t = cdr->answer.tv_sec; 00108 ast_localtime(&t, &tm, NULL); 00109 strftime(answerstr, sizeof(answerstr), DATE_FORMAT, &tm); 00110 00111 t = cdr->end.tv_sec; 00112 ast_localtime(&t, &tm, NULL); 00113 strftime(endstr, sizeof(endstr), DATE_FORMAT, &tm); 00114 00115 for(count=0; count<5; count++) { 00116 res = sqlite_exec_printf(db, 00117 "INSERT INTO cdr (" 00118 "clid,src,dst,dcontext," 00119 "channel,dstchannel,lastapp,lastdata, " 00120 "start,answer,end," 00121 "duration,billsec,disposition,amaflags, " 00122 "accountcode" 00123 # if LOG_UNIQUEID 00124 ",uniqueid" 00125 # endif 00126 # if LOG_USERFIELD 00127 ",userfield" 00128 # endif 00129 ") VALUES (" 00130 "'%q', '%q', '%q', '%q', " 00131 "'%q', '%q', '%q', '%q', " 00132 "'%q', '%q', '%q', " 00133 "%d, %d, %d, %d, " 00134 "'%q'" 00135 # if LOG_UNIQUEID 00136 ",'%q'" 00137 # endif 00138 # if LOG_USERFIELD 00139 ",'%q'" 00140 # endif 00141 ")", NULL, NULL, &zErr, 00142 cdr->clid, cdr->src, cdr->dst, cdr->dcontext, 00143 cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata, 00144 startstr, answerstr, endstr, 00145 cdr->duration, cdr->billsec, cdr->disposition, cdr->amaflags, 00146 cdr->accountcode 00147 # if LOG_UNIQUEID 00148 ,cdr->uniqueid 00149 # endif 00150 # if LOG_USERFIELD 00151 ,cdr->userfield 00152 # endif 00153 ); 00154 if (res != SQLITE_BUSY && res != SQLITE_LOCKED) 00155 break; 00156 usleep(200); 00157 } 00158 00159 if (zErr) { 00160 ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr); 00161 free(zErr); 00162 } 00163 00164 ast_mutex_unlock(&sqlite_lock); 00165 return res; 00166 }
static int unload_module | ( | void | ) | [static] |
Definition at line 168 of file cdr_sqlite.c.
References ast_cdr_unregister().
00169 { 00170 if (db) 00171 sqlite_close(db); 00172 ast_cdr_unregister(name); 00173 return 0; 00174 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "SQLite CDR Backend" , .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 = "6989f2ec67f8497e38c12890500c525b" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 217 of file cdr_sqlite.c.
const 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 61 of file cdr_sqlite.c.
Referenced by ast_config_internal_load(), ast_load_realtime(), ast_load_realtime_multientry(), and ast_update_realtime().
char* name = "sqlite" [static] |
Definition at line 60 of file cdr_sqlite.c.
char sql_create_table[] [static] |
ast_mutex_t sqlite_lock = { PTHREAD_MUTEX_INITIALIZER , 1, { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INITIALIZER } [static] |