summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-01-28 16:49:45 +0000
committeralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-01-28 16:49:45 +0000
commit87ac8e26cafed175dce5fc9ef7d912340b086446 (patch)
tree92fe94e44d09507eefad42ba8bd6f2eee9e629ef
parent28a45c82804542055ec4a44ca9f8fe79a6b7c2d5 (diff)
downloadzabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.tar.gz
zabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.tar.xz
zabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.zip
- changed type of items.prevorgvalue to preserve data precision (Alexei)
git-svn-id: svn://svn.zabbix.com/trunk@3767 97f52cf1-0a1b-0410-bd0e-c28be96e8082
-rw-r--r--ChangeLog1
-rw-r--r--create/schema/schema.sql2
-rw-r--r--include/db.h12
-rw-r--r--src/libs/zbxdbhigh/db.c55
-rw-r--r--src/zabbix_agent/active.c2
-rw-r--r--src/zabbix_server/evalfunc.c151
-rw-r--r--src/zabbix_server/functions.c281
-rw-r--r--src/zabbix_server/poller/poller.c9
-rw-r--r--src/zabbix_server/timer/timer.c4
-rw-r--r--upgrades/dbpatches/1.3/mysql/changed_tables.sql2
10 files changed, 372 insertions, 147 deletions
diff --git a/ChangeLog b/ChangeLog
index 326cd8be..68c8c3a8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
Changes for 1.3.3:
+ - changed type of items.prevorgvalue to preserve data precision (Alexei)
- added possibility of hostname using (Eugene)
- new communication library and protocol (Alexei)
- developed configuration interface of http monitoring (Eugene)
diff --git a/create/schema/schema.sql b/create/schema/schema.sql
index 748cf44c..ff8fc8a8 100644
--- a/create/schema/schema.sql
+++ b/create/schema/schema.sql
@@ -394,7 +394,7 @@ FIELD |trapper_hosts |t_varchar(255) |'' |NOT NULL |ZBX_SYNC
FIELD |units |t_varchar(10) |'' |NOT NULL |ZBX_SYNC
FIELD |multiplier |t_integer |'0' |NOT NULL |ZBX_SYNC
FIELD |delta |t_integer |'0' |NOT NULL |ZBX_SYNC
-FIELD |prevorgvalue |t_double(16,4) | |NULL |0
+FIELD |prevorgvalue |t_varchar(255) | |NULL |0
FIELD |snmpv3_securityname|t_varchar(64)|'' |NOT NULL |ZBX_SYNC
FIELD |snmpv3_securitylevel|t_integer |'0' |NOT NULL |ZBX_SYNC
FIELD |snmpv3_authpassphrase|t_varchar(64)|'' |NOT NULL |ZBX_SYNC
diff --git a/include/db.h b/include/db.h
index 9745eaab..802281f8 100644
--- a/include/db.h
+++ b/include/db.h
@@ -251,14 +251,18 @@ DB_ITEM
int delay;
int history;
int trends;
- double prevorgvalue;
+ char *prevorgvalue_str;
+ double prevorgvalue_dbl;
+ zbx_uint64_t prevorgvalue_uint64;
int prevorgvalue_null;
- double lastvalue;
- int lastclock;
char *lastvalue_str;
+ double lastvalue_dbl;
+ zbx_uint64_t lastvalue_uint64;
+ int lastclock;
int lastvalue_null;
- double prevvalue;
char *prevvalue_str;
+ double prevvalue_dbl;
+ zbx_uint64_t prevvalue_uint64;
int prevvalue_null;
time_t lastcheck;
time_t nextcheck;
diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c
index e6a1986c..a7f3acfc 100644
--- a/src/libs/zbxdbhigh/db.c
+++ b/src/libs/zbxdbhigh/db.c
@@ -378,10 +378,12 @@ lbl_exec:
}
#endif
- zbx_free(sql);
gettimeofday(&tv, NULL);
- zabbix_log( LOG_LEVEL_WARNING, "Query processed in %f seconds", (float)(tv.tv_usec-msec)/1000000 );
+ if((float)(tv.tv_usec-msec)/1000000 > 0.03)
+ zabbix_log( LOG_LEVEL_WARNING, "%f sec, query %s", (float)(tv.tv_usec-msec)/1000000, sql );
+
+ zbx_free(sql);
return ret;
}
@@ -610,10 +612,11 @@ lbl_get_table:
}
#endif
- zbx_free(sql);
-
gettimeofday(&tv, NULL);
- zabbix_log( LOG_LEVEL_WARNING, "Query processed in %f seconds", (float)(tv.tv_usec-msec)/1000000 );
+ if((float)(tv.tv_usec-msec)/1000000 > 0.03)
+ zabbix_log( LOG_LEVEL_WARNING, "%f sec, query %s", (float)(tv.tv_usec-msec)/1000000, sql );
+
+ zbx_free(sql);
return result;
}
@@ -2022,6 +2025,8 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
item->useip=atoi(row[10]);
item->ip=row[11];
item->history=atoi(row[12]);
+ item->value_type=atoi(row[17]);
+
s=row[13];
if(DBis_null(s)==SUCCEED)
{
@@ -2030,8 +2035,17 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
else
{
item->lastvalue_null=0;
- item->lastvalue_str=s;
- item->lastvalue=atof(s);
+ switch(item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ item->lastvalue_dbl=atof(s);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ ZBX_STR2UINT64(item->lastvalue_uint64,s);
+ break;
+ default:
+ item->lastvalue_str=s;
+ break;
+ }
}
s=row[14];
if(DBis_null(s)==SUCCEED)
@@ -2041,13 +2055,20 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
else
{
item->prevvalue_null=0;
- item->prevvalue_str=s;
- item->prevvalue=atof(s);
+ switch(item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ item->prevvalue_dbl=atof(s);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ ZBX_STR2UINT64(item->prevvalue_uint64,s);
+ break;
+ default:
+ item->prevvalue_str=s;
+ break;
+ }
}
-/* item->hostid=atoi(row[15]); */
ZBX_STR2UINT64(item->hostid, row[15]);
item->host_status=atoi(row[16]);
- item->value_type=atoi(row[17]);
item->host_errors_from=atoi(row[18]);
item->snmp_port=atoi(row[19]);
@@ -2061,7 +2082,17 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row)
else
{
item->prevorgvalue_null=0;
- item->prevorgvalue=atof(s);
+ switch(item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ item->prevorgvalue_dbl=atof(s);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ ZBX_STR2UINT64(item->prevorgvalue_uint64,s);
+ break;
+ default:
+ item->prevorgvalue_str=s;
+ break;
+ }
}
s=row[22];
if(DBis_null(s)==SUCCEED)
diff --git a/src/zabbix_agent/active.c b/src/zabbix_agent/active.c
index cbbfb8b8..04cd3bde 100644
--- a/src/zabbix_agent/active.c
+++ b/src/zabbix_agent/active.c
@@ -362,8 +362,6 @@ static int send_value(char *server,unsigned short port,char *host, char *key,cha
struct hostent *hp;
- unsigned int addr;
-
zabbix_log( LOG_LEVEL_DEBUG, "In send_value('%s',%u,'%s','%s','%s','%s','%s','%s')",
server, port, host, key, lastlogsize, timestamp, source, severity);
diff --git a/src/zabbix_server/evalfunc.c b/src/zabbix_server/evalfunc.c
index 3f386a5e..98cf0339 100644
--- a/src/zabbix_server/evalfunc.c
+++ b/src/zabbix_server/evalfunc.c
@@ -845,7 +845,19 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
- if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue_dbl);
+ del_zeroes(value);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64,item->lastvalue_uint64);
+ break;
+ default:
+ strcpy(value,item->lastvalue_str);
+ break;
+ }
+/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
{
zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 1");
zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue);
@@ -854,11 +866,10 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
-/* *value=strdup(item->lastvalue_str);*/
zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 3 [%s] [%s]",value,item->lastvalue_str);
strcpy(value,item->lastvalue_str);
zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 4");
- }
+ }*/
}
}
else if(strcmp(function,"prev")==0)
@@ -869,7 +880,19 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
- if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value,MAX_STRING_LEN,"%f",item->prevvalue_dbl);
+ del_zeroes(value);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64,item->prevvalue_dbl);
+ break;
+ default:
+ strcpy(value,item->prevvalue_str);
+ break;
+ }
+/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
{
zbx_snprintf(value,MAX_STRING_LEN,"%f",item->prevvalue);
del_zeroes(value);
@@ -877,7 +900,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
else
{
strcpy(value,item->prevvalue_str);
- }
+ }*/
}
}
else if(strcmp(function,"min")==0)
@@ -952,7 +975,27 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
- if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value,MAX_STRING_LEN,"%f",
+ (double)abs(item->lastvalue_dbl-item->prevvalue_dbl));
+ del_zeroes(value);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64, labs(item->lastvalue_uint64-item->prevvalue_uint64));
+ break;
+ default:
+ if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0)
+ {
+ strcpy(value,"0");
+ }
+ else
+ {
+ strcpy(value,"1");
+ }
+ break;
+ }
+/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
{
zbx_snprintf(value,MAX_STRING_LEN,"%f",(float)abs(item->lastvalue-item->prevvalue));
del_zeroes(value);
@@ -967,7 +1010,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
{
strcpy(value,"1");
}
- }
+ }*/
}
}
else if(strcmp(function,"change")==0)
@@ -978,7 +1021,27 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
- if(item->value_type==ITEM_VALUE_TYPE_FLOAT)
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value,MAX_STRING_LEN,"%f",
+ item->lastvalue_dbl-item->prevvalue_dbl);
+ del_zeroes(value);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64, item->lastvalue_uint64-item->prevvalue_uint64);
+ break;
+ default:
+ if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0)
+ {
+ strcpy(value,"0");
+ }
+ else
+ {
+ strcpy(value,"1");
+ }
+ break;
+ }
+/* if(item->value_type==ITEM_VALUE_TYPE_FLOAT)
{
zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue-item->prevvalue);
del_zeroes(value);
@@ -993,19 +1056,50 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
{
strcpy(value,"1");
}
- }
+ }*/
}
}
else if(strcmp(function,"diff")==0)
{
- zabbix_log( LOG_LEVEL_DEBUG, "Evaluating diff [%s] [%s]",item->lastvalue_str,item->prevvalue_str);
if((item->lastvalue_null==1)||(item->prevvalue_null==1))
{
ret = FAIL;
}
else
{
- if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ if(cmp_double(item->lastvalue_dbl, item->prevvalue_dbl) == 0)
+ {
+ strcpy(value,"0");
+ }
+ else
+ {
+ strcpy(value,"2");
+ }
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ if(item->lastvalue_dbl == item->prevvalue_dbl)
+ {
+ strcpy(value,"1");
+ }
+ else
+ {
+ strcpy(value,"0");
+ }
+ break;
+ default:
+ if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0)
+ {
+ strcpy(value,"0");
+ }
+ else
+ {
+ strcpy(value,"1");
+ }
+ break;
+ }
+/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64))
{
if(cmp_double(item->lastvalue, item->prevvalue) == 0)
{
@@ -1026,7 +1120,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
{
strcpy(value,"1");
}
- }
+ }*/
}
}
else if(strcmp(function,"str")==0)
@@ -1083,15 +1177,30 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter)
}
else
{
- zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() fuzzytime [%s] [%s]",value,item->lastvalue);
-
- if((item->lastvalue>=fuzlow)&&(item->lastvalue<=fuzhig))
- {
- strcpy(value,"1");
- }
- else
- {
- strcpy(value,"0");
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ if((item->lastvalue_dbl>=fuzlow)&&(item->lastvalue_dbl<=fuzhig))
+ {
+ strcpy(value,"1");
+ }
+ else
+ {
+ strcpy(value,"0");
+ }
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ if((item->lastvalue_uint64>=fuzlow)&&(item->lastvalue_uint64<=fuzhig))
+ {
+ strcpy(value,"1");
+ }
+ else
+ {
+ strcpy(value,"0");
+ }
+ break;
+ default:
+ ret = FAIL;
+ break;
}
}
}
diff --git a/src/zabbix_server/functions.c b/src/zabbix_server/functions.c
index 3c4fbb3b..24c1f7a9 100644
--- a/src/zabbix_server/functions.c
+++ b/src/zabbix_server/functions.c
@@ -420,8 +420,6 @@ int process_data(zbx_sock_t *sock,char *server,char *key,char *value,char *lastl
init_result(&agent);
-/* zbx_snprintf(sql,sizeof(sql),"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.value_type,i.trapper_hosts,i.delta,i.units,i.multiplier,i.formula,i.logtimefmt from items i,hosts h where h.status=%d and h.hostid=i.hostid and h.host='%s' and i.key_='%s' and i.status=%d and i.type in (%d,%d)", HOST_STATUS_MONITORED, server, key, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE);*/
-
DBescape_string(server, server_esc, MAX_STRING_LEN);
DBescape_string(key, key_esc, MAX_STRING_LEN);
@@ -556,27 +554,26 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now)
/* Delta as speed of change */
else if(item->delta == ITEM_STORE_SPEED_PER_SECOND)
{
- zabbix_log( LOG_LEVEL_DEBUG, "ITEM_STORE_SPEED_PER_SECOND(%s,%f,%f)", item->key, item->prevorgvalue, value->dbl);
/* Save delta */
if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE))
{
- if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value->dbl))
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl))
{
- DBadd_history(item->itemid, (value->dbl - item->prevorgvalue)/(now-item->lastclock), now);
+ DBadd_history(item->itemid, (value->dbl - item->prevorgvalue_dbl)/(now-item->lastclock), now);
}
}
else if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_UINT64))
{
- if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= (double)value->ui64))
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= (double)value->ui64))
{
- DBadd_history(item->itemid, ((double)value->ui64 - (zbx_uint64_t)item->prevorgvalue)/(now-item->lastclock), now);
+ DBadd_history(item->itemid, ((double)value->ui64 - item->prevorgvalue_dbl)/(now-item->lastclock), now);
}
}
else if((item->value_type==ITEM_VALUE_TYPE_UINT64) && (value->type & AR_UINT64))
{
- if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= value->ui64))
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64))
{
- DBadd_history_uint(item->itemid, (zbx_uint64_t)(value->ui64 - (zbx_uint64_t)item->prevorgvalue)/(now-item->lastclock), now);
+ DBadd_history_uint(item->itemid, (zbx_uint64_t)(value->ui64 - item->prevorgvalue_uint64)/(now-item->lastclock), now);
}
}
}
@@ -586,23 +583,23 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now)
/* Save delta */
if((item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE))
{
- if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value->dbl) )
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl) )
{
- DBadd_history(item->itemid, (value->dbl - item->prevorgvalue), now);
+ DBadd_history(item->itemid, (value->dbl - item->prevorgvalue_dbl), now);
}
}
else if((item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_UINT64))
{
- if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= (double)value->ui64) )
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= (double)value->ui64) )
{
- DBadd_history(item->itemid, ((double)value->ui64 - (zbx_uint64_t)item->prevorgvalue), now);
+ DBadd_history(item->itemid, ((double)value->ui64 - item->prevorgvalue_dbl), now);
}
}
else if((item->value_type==ITEM_VALUE_TYPE_UINT64) && (value->type & AR_UINT64))
{
- if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= value->ui64) )
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64) )
{
- DBadd_history_uint(item->itemid, (value->ui64 - (zbx_uint64_t)item->prevorgvalue), now);
+ DBadd_history_uint(item->itemid, value->ui64 - item->prevorgvalue_uint64, now);
}
}
}
@@ -659,26 +656,22 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now)
******************************************************************************/
static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now)
{
- char value_esc[MAX_STRING_LEN];
- char value_str[MAX_STRING_LEN];
- double value_double;
+ char value_esc[MAX_STRING_LEN];
+ char value_str[MAX_STRING_LEN];
int ret = SUCCEED;
zabbix_log( LOG_LEVEL_DEBUG, "In update_item()");
value_str[0] = '\0';
value_esc[0] = '\0';
- value_double = 0;
if(value->type & AR_UINT64)
{
zbx_snprintf(value_str, sizeof(value_str),ZBX_FS_UI64, value->ui64);
- value_double = (double)value->ui64;
}
if(value->type & AR_DOUBLE)
{
zbx_snprintf(value_str,sizeof(value_str),"%f", value->dbl);
- value_double = value->dbl;
}
if(value->type & AR_STRING)
{
@@ -691,98 +684,192 @@ static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now)
if(item->delta == ITEM_STORE_AS_IS)
{
-/* if((item->prevvalue_null == 1) || (strcmp(value_str,item->lastvalue_str) != 0) || (strcmp(item->prevvalue_str,item->lastvalue_str) != 0) )*/
-/* Fixed crash when lastvalue == NULL */
- if((value->type & AR_TEXT) == 0 && ((item->prevvalue_null == 1) || (item->lastvalue_null == 1) ||
- (strcmp(value_str,item->lastvalue_str) != 0) ||
- (strcmp(item->prevvalue_str,item->lastvalue_str) != 0)))
- {
- DBescape_string(value_str,value_esc,MAX_STRING_LEN);
-/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=%d",now+item->delay,value_esc,now,item->itemid);*/
- DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now),
- value_esc,
- (int)now,
- item->itemid);
-
- item->prevvalue=item->lastvalue;
- item->lastvalue=value_double;
- item->prevvalue_str=item->lastvalue_str;
- /* Risky !!!*/
- item->lastvalue_str=value_str;
- item->prevvalue_null=item->lastvalue_null;
- item->lastvalue_null=0;
- }
- else
- {
-/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,lastclock=%d where itemid=%d",now+item->delay,now,item->itemid);*/
- DBexecute("update items set nextcheck=%d,lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now),
- (int)now,
- item->itemid);
+ switch(value->type) {
+ case AR_DOUBLE:
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now),
+ value->dbl,
+ (int)now,
+ item->itemid);
+ break;
+ case AR_UINT64:
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now),
+ value->ui64,
+ (int)now,
+ item->itemid);
+ break;
+ case AR_STRING:
+ DBescape_string(value_str,value_esc,MAX_STRING_LEN);
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now),
+ value_esc,
+ (int)now,
+ item->itemid);
+ break;
+ default:
+ break;
}
}
/* Logic for delta as speed of change */
else if(item->delta == ITEM_STORE_SPEED_PER_SECOND)
{
- if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) )
+ if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_FLOAT))
+ {
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl) )
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (value->dbl - item->prevorgvalue_dbl)/(now-item->lastclock),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (int)now,
+ item->itemid);
+ }
+ }
+ else if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_UINT64))
{
-/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",now+item->delay,value_double,(value_double - item->prevorgvalue)/(now-item->lastclock),now,item->itemid);*/
- DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
- value_double,
- (value_double - item->prevorgvalue)/(now-item->lastclock),
- (int)now,
- item->itemid);
+ if((item->prevorgvalue_null == 0) && ((double)item->prevorgvalue_uint64 <= value->dbl) )
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (value->dbl - (double)(item->prevorgvalue_uint64))/(now-item->lastclock),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (int)now,
+ item->itemid);
+ }
}
- else
+ else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_UINT64))
{
-/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",now+item->delay,value_double,now,item->itemid);*/
- DBexecute("update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
- value_double,
- (int)now,
- item->itemid);
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64) )
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->ui64,
+ ((double)(value->ui64 - item->prevorgvalue_uint64))/(now-item->lastclock),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->ui64,
+ (int)now,
+ item->itemid);
+ }
}
-
- item->prevvalue=item->lastvalue;
- item->lastvalue=(value_double - item->prevorgvalue)/(now-item->lastclock);
- item->prevvalue_str=item->lastvalue_str;
- /* Risky !!!*/
- item->lastvalue_str=value_str;
- item->prevvalue_null=item->lastvalue_null;
- item->lastvalue_null=0;
}
/* Real delta: simple difference between values */
else if(item->delta == ITEM_STORE_SIMPLE_CHANGE)
{
- if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) )
+ if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_FLOAT))
{
- DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
- value_double,
- (value_double - item->prevorgvalue),
- (int)now,
- item->itemid);
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl))
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (value->dbl - item->prevorgvalue_dbl),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now),
+ value->dbl,
+ (int)now,
+ item->itemid);
+ }
}
- else
+ else if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_UINT64))
{
- DBexecute("update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=" ZBX_FS_UI64,
- calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now),
- value_double,
- (int)now,
- item->itemid);
+ if((item->prevorgvalue_null == 0) && ((double)item->prevorgvalue_uint64 <= value->dbl))
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->dbl,
+ (value->dbl - (double)item->prevorgvalue_uint64),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now),
+ value->dbl,
+ (int)now,
+ item->itemid);
+ }
+ }
+ else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_UINT64))
+ {
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64))
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->ui64,
+ (value->ui64 - item->prevorgvalue_uint64),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now),
+ value->ui64,
+ (int)now,
+ item->itemid);
+ }
+ }
+ else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_FLOAT))
+ {
+ if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64))
+ {
+ DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now),
+ value->ui64,
+ ((double)value->ui64 - item->prevorgvalue_uint64),
+ (int)now,
+ item->itemid);
+ }
+ else
+ {
+ DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64,
+ calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now),
+ value->ui64,
+ (int)now,
+ item->itemid);
+ }
}
-
- item->prevvalue=item->lastvalue;
- item->lastvalue=(value_double - item->prevorgvalue);
- item->prevvalue_str=item->lastvalue_str;
- /* Risky !!!*/
- item->lastvalue_str=value_str;
- item->prevvalue_null=item->lastvalue_null;
- item->lastvalue_null=0;
}
+ item->prevvalue_str=item->lastvalue_str;
+ item->prevvalue_dbl=item->lastvalue_dbl;
+ item->prevvalue_uint64=item->lastvalue_uint64;
+ item->prevvalue_null=item->lastvalue_null;
+
+ item->lastvalue_uint64=value->ui64;
+ item->lastvalue_dbl=value->dbl;
+ item->lastvalue_str=value->str;
+ item->lastvalue_null=0;
+
/* Update item status if required */
if(item->status == ITEM_STATUS_NOTSUPPORTED)
{
@@ -816,8 +903,6 @@ static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now)
void process_new_value(DB_ITEM *item, AGENT_RESULT *value)
{
time_t now;
-/* char value_str[MAX_STRING_LEN];
- double value_double;*/
double multiplier;
char *e;
@@ -825,10 +910,6 @@ void process_new_value(DB_ITEM *item, AGENT_RESULT *value)
now = time(NULL);
-/* strscpy(value_str, value);*/
-
-/* value_double=strtod(value_str,&e);*/
-
if(item->multiplier == ITEM_MULTIPLIER_USE)
{
if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE))
diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c
index 9ad08bec..479f36d0 100644
--- a/src/zabbix_server/poller/poller.c
+++ b/src/zabbix_server/poller/poller.c
@@ -171,6 +171,8 @@ static void update_key_status(zbx_uint64_t hostid,int host_status)
DB_RESULT result;
DB_ROW row;
+ int update;
+
zabbix_log(LOG_LEVEL_DEBUG, "In update_key_status(" ZBX_FS_UI64 ",%d)",
hostid,host_status);
@@ -184,8 +186,11 @@ static void update_key_status(zbx_uint64_t hostid,int host_status)
DBget_item_from_db(&item,row);
/* Do not process new value for status, if previous status is the same */
- zabbix_log( LOG_LEVEL_DEBUG, "item.lastvalue[%f] new host status[%d]",item.lastvalue,host_status);
- if( (item.lastvalue_null==1) || (cmp_double(item.lastvalue, (double)host_status) == 1))
+ update = (item.lastvalue_null==1);
+ update = update || ((item.value_type == ITEM_VALUE_TYPE_FLOAT) &&(cmp_double(item.lastvalue_dbl, (double)host_status) == 1));
+ update = update || ((item.value_type == ITEM_VALUE_TYPE_UINT64) &&(item.lastvalue_uint64 == host_status));
+
+ if(update)
{
init_result(&agent);
SET_UI64_RESULT(&agent, host_status);
diff --git a/src/zabbix_server/timer/timer.c b/src/zabbix_server/timer/timer.c
index a5ff96db..b2847a9b 100644
--- a/src/zabbix_server/timer/timer.c
+++ b/src/zabbix_server/timer/timer.c
@@ -96,10 +96,6 @@ void main_timer_loop()
{
DBget_item_from_db(&item,row);
-/* Update triggers will update value for NODATA */
-/* zbx_snprintf(sql,sizeof(sql),"update functions set lastvalue='1' where itemid=%d and function='%s' and parameter='%s'" , itemid, function, parameter );
- DBexecute(sql);*/
-
DBbegin();
update_functions(&item);
update_triggers(item.itemid);
diff --git a/upgrades/dbpatches/1.3/mysql/changed_tables.sql b/upgrades/dbpatches/1.3/mysql/changed_tables.sql
index 734fbeec..d2070f34 100644
--- a/upgrades/dbpatches/1.3/mysql/changed_tables.sql
+++ b/upgrades/dbpatches/1.3/mysql/changed_tables.sql
@@ -289,7 +289,7 @@ CREATE TABLE items_tmp (
units varchar(10) DEFAULT '' NOT NULL,
multiplier integer DEFAULT '0' NOT NULL,
delta integer DEFAULT '0' NOT NULL,
- prevorgvalue double(16,4) NULL,
+ prevorgvalue varchar(255) NULL,
snmpv3_securityname varchar(64) DEFAULT '' NOT NULL,
snmpv3_securitylevel integer DEFAULT '0' NOT NULL,
snmpv3_authpassphrase varchar(64) DEFAULT '' NOT NULL,