#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_HRTIME 0 |
| #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 | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CDR_DRIVER, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static sqlite * | db = NULL |
| static const char | name [] = "sqlite" |
| static const char | sql_create_table [] |
| SQL table format. | |
| static ast_mutex_t | sqlite_lock = { PTHREAD_MUTEX_INITIALIZER , NULL, 1 } |
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 60 of file cdr_sqlite.c.
| #define LOG_HRTIME 0 |
| #define LOG_UNIQUEID 0 |
| #define LOG_USERFIELD 0 |
| static void __reg_module | ( | void | ) | [static] |
Definition at line 249 of file cdr_sqlite.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 249 of file cdr_sqlite.c.
| static void format_date | ( | char * | buffer, | |
| size_t | length, | |||
| struct timeval * | when | |||
| ) | [static] |
Definition at line 99 of file cdr_sqlite.c.
References ast_localtime(), ast_strftime(), and DATE_FORMAT.
Referenced by sqlite_log().
00100 { 00101 struct ast_tm tm; 00102 00103 ast_localtime(when, &tm, NULL); 00104 ast_strftime(buffer, length, DATE_FORMAT, &tm); 00105 }
| static int load_module | ( | void | ) | [static] |
Definition at line 201 of file cdr_sqlite.c.
References ast_cdr_register(), ast_config_AST_LOG_DIR, AST_FILE_MODE, ast_free, ast_log(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, LOG_ERROR, LOG_NOTICE, and sqlite_log().
00202 { 00203 char *zErr; 00204 char fn[PATH_MAX]; 00205 int res; 00206 00207 ast_log(LOG_NOTICE, "This module has been marked deprecated in favor of " 00208 "using cdr_sqlite3_custom.\n"); 00209 00210 /* is the database there? */ 00211 snprintf(fn, sizeof(fn), "%s/cdr.db", ast_config_AST_LOG_DIR); 00212 db = sqlite_open(fn, AST_FILE_MODE, &zErr); 00213 if (!db) { 00214 ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr); 00215 ast_free(zErr); 00216 return AST_MODULE_LOAD_DECLINE; 00217 } 00218 00219 /* is the table there? */ 00220 res = sqlite_exec(db, "SELECT COUNT(AcctId) FROM cdr;", NULL, NULL, NULL); 00221 if (res) { 00222 res = sqlite_exec(db, sql_create_table, NULL, NULL, &zErr); 00223 if (res) { 00224 ast_log(LOG_ERROR, "cdr_sqlite: Unable to create table 'cdr': %s\n", zErr); 00225 ast_free(zErr); 00226 goto err; 00227 } 00228 00229 /* TODO: here we should probably create an index */ 00230 } 00231 00232 res = ast_cdr_register(name, ast_module_info->description, sqlite_log); 00233 if (res) { 00234 ast_log(LOG_ERROR, "Unable to register SQLite CDR handling\n"); 00235 return AST_MODULE_LOAD_DECLINE; 00236 } 00237 return AST_MODULE_LOAD_SUCCESS; 00238 00239 err: 00240 if (db) 00241 sqlite_close(db); 00242 return AST_MODULE_LOAD_DECLINE; 00243 }
| static int sqlite_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 107 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_tvdiff_us(), ast_tvzero(), 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_HRTIME, LOG_UNIQUEID, LOG_USERFIELD, sqlite_lock, ast_cdr::src, ast_cdr::start, ast_cdr::uniqueid, and ast_cdr::userfield.
Referenced by load_module().
00108 { 00109 int res = 0; 00110 char *zErr = 0; 00111 char startstr[80], answerstr[80], endstr[80]; 00112 int count; 00113 #if LOG_HRTIME 00114 double hrbillsec = 0.0; 00115 double hrduration; 00116 #endif 00117 00118 ast_mutex_lock(&sqlite_lock); 00119 00120 format_date(startstr, sizeof(startstr), &cdr->start); 00121 format_date(answerstr, sizeof(answerstr), &cdr->answer); 00122 format_date(endstr, sizeof(endstr), &cdr->end); 00123 00124 #if LOG_HRTIME 00125 if (!ast_tvzero(cdr->answer)) { 00126 hrbillsec = (double) ast_tvdiff_us(cdr->end, cdr->answer) / 1000000.0; 00127 } 00128 hrduration = (double) ast_tvdiff_us(cdr->end, cdr->start) / 1000000.0; 00129 #endif 00130 00131 for(count=0; count<5; count++) { 00132 res = sqlite_exec_printf(db, 00133 "INSERT INTO cdr (" 00134 "clid,src,dst,dcontext," 00135 "channel,dstchannel,lastapp,lastdata, " 00136 "start,answer,end," 00137 "duration,billsec,disposition,amaflags, " 00138 "accountcode" 00139 # if LOG_UNIQUEID 00140 ",uniqueid" 00141 # endif 00142 # if LOG_USERFIELD 00143 ",userfield" 00144 # endif 00145 ") VALUES (" 00146 "'%q', '%q', '%q', '%q', " 00147 "'%q', '%q', '%q', '%q', " 00148 "'%q', '%q', '%q', " 00149 #if LOG_HRTIME 00150 "%f, %f, %d, %d, " 00151 #else 00152 "%d, %d, %d, %d, " 00153 #endif 00154 "'%q'" 00155 # if LOG_UNIQUEID 00156 ",'%q'" 00157 # endif 00158 # if LOG_USERFIELD 00159 ",'%q'" 00160 # endif 00161 ")", NULL, NULL, &zErr, 00162 cdr->clid, cdr->src, cdr->dst, cdr->dcontext, 00163 cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata, 00164 startstr, answerstr, endstr, 00165 #if LOG_HRTIME 00166 hrduration, hrbillsec, cdr->disposition, cdr->amaflags, 00167 #else 00168 cdr->duration, cdr->billsec, cdr->disposition, cdr->amaflags, 00169 #endif 00170 cdr->accountcode 00171 # if LOG_UNIQUEID 00172 ,cdr->uniqueid 00173 # endif 00174 # if LOG_USERFIELD 00175 ,cdr->userfield 00176 # endif 00177 ); 00178 if (res != SQLITE_BUSY && res != SQLITE_LOCKED) 00179 break; 00180 usleep(200); 00181 } 00182 00183 if (zErr) { 00184 ast_log(LOG_ERROR, "cdr_sqlite: %s\n", zErr); 00185 ast_free(zErr); 00186 } 00187 00188 ast_mutex_unlock(&sqlite_lock); 00189 return res; 00190 }
| static int unload_module | ( | void | ) | [static] |
Definition at line 192 of file cdr_sqlite.c.
References ast_cdr_unregister().
00193 { 00194 ast_cdr_unregister(name); 00195 if (db) { 00196 sqlite_close(db); 00197 } 00198 return 0; 00199 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CDR_DRIVER, } [static] |
Definition at line 249 of file cdr_sqlite.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 249 of file cdr_sqlite.c.
sqlite* db = NULL [static] |
Definition at line 63 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(), ast_update_realtime(), and my_swap_subchannels().
const char name[] = "sqlite" [static] |
Definition at line 62 of file cdr_sqlite.c.
const char sql_create_table[] [static] |
ast_mutex_t sqlite_lock = { PTHREAD_MUTEX_INITIALIZER , NULL, 1 } [static] |
1.5.6