zabbix源代码分析之ODBC
本帖最后由 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
为什么单独做个程序测试就OK,在zabbix里就不行呢???
难道传说中的 CU就这样子嘛,没人解答问题 ,哪怕留言也是一种鼓励阿。哎。。。
怎么也没人支持下呢?
回复 1# dagun
要是能整一个系列的完整分析就好了。
回复 7# dreamice
这个问题没解决啊,困扰一年多了。。