]> git.pld-linux.org Git - packages/zabbix.git/commitdiff
Add fix for database monitoring (ZBX-11213) auto/th/zabbix-3.2.1-1
authorJacek Konieczny <jajcus@jajcus.net>
Thu, 1 Dec 2016 16:28:05 +0000 (17:28 +0100)
committerJacek Konieczny <jajcus@jajcus.net>
Thu, 1 Dec 2016 16:28:35 +0000 (17:28 +0100)
ZBX-11213.patch [new file with mode: 0644]
zabbix.spec

diff --git a/ZBX-11213.patch b/ZBX-11213.patch
new file mode 100644 (file)
index 0000000..d15a8ff
--- /dev/null
@@ -0,0 +1,176 @@
+From 7dfb6b86fc9dff7b084ad8ab73e37b982a8f2270 Mon Sep 17 00:00:00 2001
+From: wiper <wiper@f4e7fd02-d210-4e34-a1e0-d4093fb66cc2>
+Date: Fri, 30 Sep 2016 11:29:01 +0000
+Subject: [PATCH] .......PS. [ZBX-11213] fixed database monitoring keys        
+    [merge ^/branches/3.0 -c r62901]
+
+git-svn-id: svn://svn.zabbix.com/branches/3.2@62902 f4e7fd02-d210-4e34-a1e0-d4093fb66cc2
+---
+ ChangeLog                 |   3 ++
+ include/zbxodbc.h         |   1 -
+ src/libs/zbxdbhigh/odbc.c | 109 ++++++++++++++++++++++++++++++++--------------
+ 3 files changed, 80 insertions(+), 33 deletions(-)
+
+diff --git a/include/zbxodbc.h b/include/zbxodbc.h
+index e1c9a1f..3a7e825 100644
+--- a/include/zbxodbc.h
++++ b/include/zbxodbc.h
+@@ -35,7 +35,6 @@ typedef struct
+       SQLHSTMT        hstmt;
+       SQLSMALLINT     col_num;
+       ZBX_ODBC_ROW    row_data;
+-      SQLLEN          *data_len;
+ }
+ ZBX_ODBC_DBH;
+diff --git a/src/libs/zbxdbhigh/odbc.c b/src/libs/zbxdbhigh/odbc.c
+index 9678bb9..6470d89 100644
+--- a/src/libs/zbxdbhigh/odbc.c
++++ b/src/libs/zbxdbhigh/odbc.c
+@@ -65,8 +65,6 @@ static void  odbc_free_row_data(ZBX_ODBC_DBH *pdbh)
+               zbx_free(pdbh->row_data);
+       }
+-      zbx_free(pdbh->data_len);
+-
+       pdbh->col_num = 0;
+ }
+@@ -217,6 +215,39 @@ int       odbc_DBconnect(ZBX_ODBC_DBH *pdbh, char *db_dsn, char *user, char *pass, int
+               goto end;
+       }
++      if (SUCCEED == zabbix_check_log_level(LOG_LEVEL_DEBUG))
++      {
++              char    driver_name[MAX_STRING_LEN + 1], driver_ver[MAX_STRING_LEN + 1], db_name[MAX_STRING_LEN + 1],
++                      db_ver[MAX_STRING_LEN + 1];
++
++              if (0 != CALLODBC(SQLGetInfo(pdbh->hdbc, SQL_DRIVER_NAME, driver_name, MAX_STRING_LEN, NULL),
++                              rc, SQL_HANDLE_DBC, pdbh->hdbc, "Cannot obtain driver name"))
++              {
++                      zbx_strlcpy(driver_name, "unknown", sizeof(driver_name));
++              }
++
++              if (0 != CALLODBC(SQLGetInfo(pdbh->hdbc, SQL_DRIVER_VER, driver_ver, MAX_STRING_LEN, NULL),
++                              rc, SQL_HANDLE_DBC, pdbh->hdbc, "Cannot obtain driver version"))
++              {
++                      zbx_strlcpy(driver_ver, "unknown", sizeof(driver_ver));
++              }
++
++              if (0 != CALLODBC(SQLGetInfo(pdbh->hdbc, SQL_DBMS_NAME, db_name, MAX_STRING_LEN, NULL),
++                              rc, SQL_HANDLE_DBC, pdbh->hdbc, "Cannot obtain database name"))
++              {
++                      zbx_strlcpy(db_name, "unknown", sizeof(db_name));
++              }
++
++              if (0 != CALLODBC(SQLGetInfo(pdbh->hdbc, SQL_DBMS_VER, db_ver, MAX_STRING_LEN, NULL),
++                              rc, SQL_HANDLE_DBC, pdbh->hdbc, "Cannot obtain database version"))
++              {
++                      zbx_strlcpy(db_ver, "unknown", sizeof(db_ver));
++              }
++
++              zabbix_log(LOG_LEVEL_DEBUG, "%s() connected to %s(%s) using %s(%s)", __function_name,
++                              db_name, db_ver, driver_name, driver_ver);
++      }
++
+       pdbh->connected = 1;
+       ret = SUCCEED;
+@@ -257,14 +288,51 @@ ZBX_ODBC_ROW     odbc_DBfetch(ZBX_ODBC_RESULT pdbh)
+       for (i = 0; i < pdbh->col_num; i++)
+       {
+-              /* set NULL column value where appropriate */
+-              if (SQL_NULL_DATA == pdbh->data_len[i])
+-                      zbx_free(pdbh->row_data[i]);
+-              else
++              size_t          alloc = 0, offset = 0;
++              char            buffer[MAX_STRING_LEN + 1];
++              SQLLEN          len, col_type;
++              SQLSMALLINT     c_type;
++
++              zbx_free(pdbh->row_data[i]);
++
++              if (0 != CALLODBC(SQLColAttribute(pdbh->hstmt, i + 1, SQL_DESC_TYPE, NULL, 0, NULL, &col_type),
++                              retcode, SQL_HANDLE_STMT, pdbh->hstmt, "Cannot get column type"))
++              {
++                      goto end;
++              }
++
++              /* force col_type to integer value for DB2 compatibility */
++              switch ((int)col_type)
++              {
++                      case SQL_WLONGVARCHAR:
++                              c_type = SQL_C_BINARY;
++                              break;
++                      default:
++                              c_type = SQL_C_CHAR;
++              }
++
++              /* force len to integer value for DB2 compatibility */
++              while (SQL_NO_DATA != (retcode = SQLGetData(pdbh->hstmt, i + 1, c_type, buffer, MAX_STRING_LEN, &len)))
++              {
++                      if (0 == SQL_SUCCEEDED(retcode))
++                      {
++                              odbc_Diag(SQL_HANDLE_STMT, pdbh->hstmt, retcode, "Cannot get column data");
++                              goto end;
++                      }
++
++                      if (SQL_NULL_DATA == (int)len)
++                              break;
++
++                      buffer[(int)len] = '\0';
++
++                      zbx_strcpy_alloc(&pdbh->row_data[i], &alloc, &offset, buffer);
++              }
++
++              if (NULL != pdbh->row_data[i])
+                       zbx_rtrim(pdbh->row_data[i], " ");
+-              zabbix_log(LOG_LEVEL_DEBUG, "%s() fetched [%i col]: '%s'", __function_name, i,
+-                              NULL == pdbh->row_data[i] ? "NULL" : pdbh->row_data[i]);
++              zabbix_log(LOG_LEVEL_DEBUG, "%s() fetched [%i col (%d)]: '%s'", __function_name, i, (int)col_type,
++                                              NULL == pdbh->row_data[i] ? "NULL" : pdbh->row_data[i]);
+       }
+       result_row = pdbh->row_data;
+@@ -277,7 +345,6 @@ ZBX_ODBC_ROW       odbc_DBfetch(ZBX_ODBC_RESULT 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;
+@@ -299,30 +366,8 @@ ZBX_ODBC_RESULT   odbc_DBselect(ZBX_ODBC_DBH *pdbh, char *query)
+               goto end;
+       }
+-      pdbh->data_len = (SQLLEN *)zbx_malloc(pdbh->data_len, sizeof(SQLLEN) * pdbh->col_num);
+-
+-      for (i = 0; i < pdbh->col_num; i++)
+-      {
+-              if (0 != CALLODBC(SQLColAttribute(pdbh->hstmt, (SQLUSMALLINT)(i + 1), SQL_DESC_OCTET_LENGTH, NULL, 0,
+-                              NULL, &pdbh->data_len[i]), rc, SQL_HANDLE_STMT, pdbh->hstmt,
+-                              "Cannot execute ODBC query"))
+-              {
+-                      goto end;
+-              }
+-      }
+-
+       pdbh->row_data = zbx_malloc(pdbh->row_data, sizeof(char *) * (size_t)pdbh->col_num);
+-
+-      for (i = 0; i < pdbh->col_num; i++)
+-      {
+-              pdbh->row_data[i] = zbx_malloc(NULL, pdbh->data_len[i]);
+-              if (0 != CALLODBC(SQLBindCol(pdbh->hstmt, (SQLUSMALLINT)(i + 1), SQL_C_CHAR, pdbh->row_data[i],
+-                              pdbh->data_len[i], &pdbh->data_len[i]), rc, SQL_HANDLE_STMT, pdbh->hstmt,
+-                              "Cannot bind column in ODBC result"))
+-              {
+-                      goto end;
+-              }
+-      }
++      memset(pdbh->row_data, 0, sizeof(char *) * (size_t)pdbh->col_num);
+       zabbix_log(LOG_LEVEL_DEBUG, "%s() selected %i columns", __function_name, pdbh->col_num);
index a4bf246812add67bbd6aa41059f9eec11b3dbbad..650161b34294d46b874e1abdf5b85d9898e2ecda 100644 (file)
@@ -29,6 +29,7 @@ Source6:      %{name}.tmpfiles
 Patch0:                config.patch
 Patch1:                sqlite3_dbname.patch
 Patch2:                tag_conditions.patch
+Patch3:                ZBX-11213.patch
 URL:           http://zabbix.sourceforge.net/
 BuildRequires: OpenIPMI-devel
 BuildRequires: curl-devel
@@ -300,6 +301,7 @@ This package provides the Zabbix Java Gateway.
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
 
 %build
 
This page took 0.279628 seconds and 4 git commands to generate.