zabbix源代码分析之ODBC

发布于 2022-10-15 04:06:29 字数 4160 浏览 22 评论 0

本帖最后由 dagun 于 2011-06-20 16:06 编辑

本人在研究ZABBIX过程中,通过ODBC监控MYSQL,但是有ZABBIX子进程退出问题,问题出现在(日志内容:ODBC fetch这里)
看了一下代码,如下:
ZBX_ODBC_RESULT        odbc_DBselect(ZBX_ODBC_DBH *pdbh, const char *query)
{
        SQLCHAR
                err_stat[10],
                err_msg[100];

        SQLINTEGER
                err_int;

        SQLSMALLINT
                err_msg_len;

        SQLRETURN        retcode;
        SQLSMALLINT
                i = 0,
                col_num = 0;

        clean_odbc_strerror();

        odbc_free_row_data(pdbh);

        zabbix_log(LOG_LEVEL_DEBUG, "ODBC select [%s]", query);

        retcode = SQLExecDirect(pdbh->hstmt, (SQLCHAR*) query, SQL_NTS);

        if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) goto lbl_err_exit;

        retcode = SQLNumResultCols(pdbh->hstmt, &col_num);//为什么这里col_num值为0呢,我把ODBC这段代码剥离出来,单独形成程序测试,是可以获取到结果的,并且这个参数为2,
        if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) goto lbl_err_exit;

        pdbh->col_num  = col_num;

        pdbh->row_data = zbx_malloc(pdbh->row_data, sizeof(char*) * col_num);
        memset(pdbh->row_data, 0, sizeof(char*) * col_num);

        pdbh->data_len = zbx_malloc(pdbh->data_len, sizeof(SQLINTEGER) * col_num);
        memset(pdbh->data_len, 0, sizeof(SQLINTEGER) * col_num);

        for(i=0; i < col_num; i++)
        {
                pdbh->row_data = zbx_malloc(pdbh->row_data, MAX_STRING_LEN);
                SQLBindCol(pdbh->hstmt, i+1, SQL_C_CHAR, pdbh->row_data, MAX_STRING_LEN, &pdbh->data_len);
        }

        zabbix_log(LOG_LEVEL_DEBUG, "selected %i cols", col_num);

        return (ZBX_ODBC_RESULT) pdbh;

lbl_err_exit:

        SQLGetDiagRec(SQL_HANDLE_STMT,
                        pdbh->hstmt,
                        1,
                        err_stat,
                        &err_int,
                        err_msg,
                        sizeof(err_msg),
                        &err_msg_len
                        );

        set_last_odbc_strerror("Failed selection [%s] (%d)", err_msg, err_int);

        zabbix_log(LOG_LEVEL_ERR, "%s", get_last_odbc_strerror());

        return NULL;
}

但是在zabbix_server中就会有这个问题,大家可以讨论一下?我无语了,难道是要配置mysql吗???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

溺渁∝ 2022-10-22 04:06:29

为什么单独做个程序测试就OK,在zabbix里就不行呢???

你没皮卡萌 2022-10-22 04:06:29

难道传说中的 CU就这样子嘛,没人解答问题 ,哪怕留言也是一种鼓励阿。哎。。。

时光是把杀猪刀 2022-10-22 04:06:29

怎么也没人支持下呢?

对风讲故事 2022-10-22 04:06:29

回复 1# dagun

    要是能整一个系列的完整分析就好了。

香橙ぽ 2022-10-22 04:06:29

回复 7# dreamice

    这个问题没解决啊,困扰一年多了。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文