asterisk cdr写入mysql为空的解决办法
2013-09-25 17:55
567 查看
static int mysql_log(struct ast_cdr *cdr) { …… db_reconnect: if ((!connected) && (hostname || dbsock) && dbuser && password && dbname && dbtable ) { …… if (mysql_real_connect(&mysql, ast_str_buffer(hostname), ast_str_buffer(dbuser), ast_str_buffer(password), ast_str_buffer(dbname), dbport, dbsock && ast_str_strlen(dbsock) ? ast_str_buffer(dbsock) : NULL, ssl_ca ? CLIENT_SSL : 0)) { connected = 1; connect_time = time(NULL); records = 0; if (dbcharset) { ast_str_set(&sql1, 0, "SET NAMES '%s'", ast_str_buffer(dbcharset)); mysql_real_query(&mysql, ast_str_buffer(sql1), ast_str_strlen(sql1)); ast_debug(1, "SQL command as follows: %s\n", ast_str_buffer(sql1)); } 【新加代码处】 } else { ast_log(LOG_ERROR, "Cannot connect to database server %s: (%d) %s\n", ast_str_buffer(hostname), mysql_errno(&mysql), mysql_error(&mysql)); connected = 0; } } …… }
环境:asterisk11.5.0 + xampp.1.8.3-1
安装完成后 一切配置正常。
linux重启之后,cdr写入为空
跟踪debug发现执行的语句为:insert into cdr()values()。
原因:
cdr_mysql.so模块先于mysql加载。
即:当cdr_mysql.so加载时mysql数据库还没启动起来。
当通话结束记录cdr时,asterisk只是检测连接,但不重新初始化cdr表信息。
cdr_mysql.c相关代码如下:
由上可见 asterisk主要是初始化connected变量而没有进行表信息的初始化。
现在在【新加代码处】加入如果下代码
////////////////////////////////////////// int res; struct ast_config *cfg; struct ast_variable *var; struct ast_flags config_flags = { 0 }; MYSQL_ROW row; MYSQL_RES *result; char sqldesc[128]; ast_log(LOG_WARNING, "CDR for mysql reconnected successfully!\n"); /* Get table description */ snprintf(sqldesc, sizeof(sqldesc), "DESC %s", dbtable ? ast_str_buffer(dbtable) : "cdr"); if (mysql_query(&mysql, sqldesc)) { ast_log(LOG_ERROR, "Unable to query table description!! Logging disabled.\n"); mysql_close(&mysql); connected = 0; goto db_reconnect; } if (!(result = mysql_store_result(&mysql))) { ast_log(LOG_ERROR, "Unable to query table description!! Logging disabled.\n"); mysql_close(&mysql); connected = 0; goto db_reconnect; } cfg = ast_config_load(config, config_flags); while ((row = mysql_fetch_row(result))) { struct column *entry; char *cdrvar = "", *staticvalue = ""; ast_debug(1, "Got a field '%s' of type '%s'\n", row[0], row[1]); /* Check for an alias or a static value */ for (var = ast_variable_browse(cfg, "columns"); var; var = var->next) { if (strncmp(var->name, "alias", 5) == 0 && strcasecmp(var->value, row[0]) == 0 ) { char *alias = ast_strdupa(var->name + 5); cdrvar = ast_strip(alias); ast_verb(3, "Found alias %s for column %s\n", cdrvar, row[0]); break; } else if (strncmp(var->name, "static", 6) == 0 && strcasecmp(var->value, row[0]) == 0) { char *item = ast_strdupa(var->name + 6); item = ast_strip(item); if (item[0] == '"' && item[strlen(item) - 1] == '"') { /* Remove surrounding quotes */ item[strlen(item) - 1] = '\0'; item++; } staticvalue = item; } } entry = ast_calloc(sizeof(char), sizeof(*entry) + strlen(row[0]) + 1 + strlen(cdrvar) + 1 + strlen(staticvalue) + 1 + strlen(row[1]) + 1); if (!entry) { ast_log(LOG_ERROR, "Out of memory creating entry for column '%s'\n", row[0]); res = -1; break; } entry->name = (char *)entry + sizeof(*entry); strcpy(entry->name, row[0]); if (!ast_strlen_zero(cdrvar)) { entry->cdrname = entry->name + strlen(row[0]) + 1; strcpy(entry->cdrname, cdrvar); } else { /* Point to same place as the column name */ entry->cdrname = (char *)entry + sizeof(*entry); } if (!ast_strlen_zero(staticvalue)) { entry->staticvalue = entry->cdrname + strlen(entry->cdrname) + 1; strcpy(entry->staticvalue, staticvalue); ast_debug(1, "staticvalue length: %d\n", (int) strlen(staticvalue) ); entry->type = entry->staticvalue + strlen(entry->staticvalue) + 1; } else { entry->type = entry->cdrname + strlen(entry->cdrname) + 1; } strcpy(entry->type, row[1]); ast_debug(1, "Entry name '%s'\n", entry->name); ast_debug(1, " cdrname '%s'\n", entry->cdrname); ast_debug(1, " static '%s'\n", entry->staticvalue); ast_debug(1, " type '%s'\n", entry->type); AST_LIST_INSERT_TAIL(&columns, entry, list); } mysql_free_result(result); ast_config_destroy(cfg); ////////////////////////////////
重新生成cdr_mysql.so模块,OK!
相关文章推荐
- MYSQL导入和写入中文数据乱码解决办法
- AutoIT操作Mysql,写入数据,不支持中文的解决办法。
- python将数据写入mysql乱码的解决办法
- mysql主从不同步、数据不一致解决办法
- Can’t connect to local MySQL server through socket 解决办法
- mac下mysql忘记root密码的解决办法
- mysql中文乱码问题解决办法
- php解决微信开发中用户昵称中的特殊字符与emoji表情写入mysql错误的问题
- linux下用c语言调用mysql缺少mysql.h的解决办法
- mysql保存中文乱码的原因和解决办法
- mysql忘记密码的解决办法
- MySQL提示:The server quit without updating PID file问题的解决办法
- MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
- MySQL导入数据错误error: 13 及解决办法
- mysql驱动取别名报Column ×× not found 解决办法
- navicat for mysql 显示中文乱码解决办法
- MySQL提示:The server quit without updating PID file问题的解决办法
- windows下MySQL出现2003错误解决办法
- ambari-server启动出现Caused by: java.lang.RuntimeException:java.lang.ClassNotFoundEception:com.mysql.jdbc.Driver问题解决办法(图文详解)
- hibernate+mysql 连接超时解决办法一,(网上找的)