void odbc_DBclose(ZBX_ODBC_DBH *pdbh) { if (NULL == pdbh) return; if (NULL != pdbh->hstmt) { SQLFreeHandle(SQL_HANDLE_STMT, pdbh->hstmt); pdbh->hstmt = NULL; } if (NULL != pdbh->hdbc) { if (pdbh->connected) SQLDisconnect(pdbh->hdbc); SQLFreeHandle(SQL_HANDLE_DBC, pdbh->hdbc); pdbh->hdbc = NULL; } if (NULL != pdbh->henv) { SQLFreeHandle(SQL_HANDLE_ENV, pdbh->henv); pdbh->henv = NULL; } odbc_free_row_data(pdbh); }
ZBX_ODBC_RESULT odbc_DBselect(ZBX_ODBC_DBH *pdbh, char *query) { const char *__function_name = "odbc_DBselect"; int i = 0; ZBX_ODBC_RESULT result = NULL; SQLRETURN rc; zabbix_log(LOG_LEVEL_DEBUG, "In %s() query:'%s'", __function_name, query); clean_odbc_strerror(); odbc_free_row_data(pdbh); if (0 != CALLODBC(SQLExecDirect(pdbh->hstmt, (SQLCHAR *)query, SQL_NTS), rc, SQL_HANDLE_STMT, pdbh->hstmt, "Cannot execute ODBC query")) { goto end; } if (0 != CALLODBC(SQLNumResultCols(pdbh->hstmt, &pdbh->col_num), rc, SQL_HANDLE_STMT, pdbh->hstmt, "Cannot get number of columns in ODBC result")) { goto end; } pdbh->row_data = zbx_malloc(pdbh->row_data, sizeof(char *) * (size_t)pdbh->col_num); memset(pdbh->row_data, 0, sizeof(char *) * (size_t)pdbh->col_num); pdbh->data_len = zbx_malloc(pdbh->data_len, sizeof(SQLLEN) * (size_t)pdbh->col_num); memset(pdbh->data_len, 0, sizeof(SQLLEN) * (size_t)pdbh->col_num); for (i = 0; i < pdbh->col_num; i++) { pdbh->row_data[i] = zbx_malloc(pdbh->row_data[i], MAX_STRING_LEN); if (0 != CALLODBC(SQLBindCol(pdbh->hstmt, (SQLUSMALLINT)(i + 1), SQL_C_CHAR, pdbh->row_data[i], MAX_STRING_LEN, &pdbh->data_len[i]), rc, SQL_HANDLE_STMT, pdbh->hstmt, "Cannot bind column in ODBC result")) { goto end; } } zabbix_log(LOG_LEVEL_DEBUG, "%s() selected %i columns", __function_name, pdbh->col_num); result = (ZBX_ODBC_RESULT)pdbh; end: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return result; }
int odbc_DBexecute(ZBX_ODBC_DBH *pdbh, const char *query) { SQLCHAR err_stat[10], err_msg[100]; SQLINTEGER err_int; SQLSMALLINT err_msg_len; SQLRETURN retcode; clean_odbc_strerror(); odbc_free_row_data(pdbh); retcode = SQLExecDirect(pdbh->hstmt, (SQLCHAR*) query, SQL_NTS); if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) goto lbl_err_exit; return SUCCEED; 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 select execution [%s] (%d)", err_msg, err_int); zabbix_log(LOG_LEVEL_ERR, "%s", get_last_odbc_strerror()); return FAIL; }
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); 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[i] = zbx_malloc(pdbh->row_data[i], MAX_STRING_LEN); SQLBindCol(pdbh->hstmt, i+1, SQL_C_CHAR, pdbh->row_data[i], MAX_STRING_LEN, &pdbh->data_len[i]); } 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; }