asterisk cdr写入mysql为空的解决办法

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!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值