Currently when using.last(0) and .last(1) in actions, they are replaced only by the first line / the first 255 chars of the whole text output. The attached patch replaces those functions by history_text.value instead of items.lastvalue / items.prevvalue.
Please consider merging this upstream.
This should also fix the problem experienced in
Regards,
Jonas Jochum
Please consider merging this upstream.
This should also fix the problem experienced in
Regards,
Jonas Jochum
Code:
--- src/libs/zbxserver/evalfunc.c.orig 2009-06-04 18:06:59.000000000 +0200
+++ src/libs/zbxserver/evalfunc.c 2009-06-04 18:12:13.000000000 +0200
@@ -633,45 +633,62 @@
default:
return FAIL;
}
-
- switch (num) {
- case 1:
- if (1 != item->lastvalue_null)
- {
- switch (item->value_type) {
- case ITEM_VALUE_TYPE_FLOAT:
- zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, 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:
- zbx_snprintf(value, MAX_STRING_LEN, "%s", item->lastvalue_str);
- break;
- }
- ret = SUCCEED;
- }
- break;
- case 2:
- if (1 != item->prevvalue_null)
- {
- switch (item->value_type) {
- case ITEM_VALUE_TYPE_FLOAT:
- zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, item->prevvalue_dbl);
- del_zeroes(value);
+ if( ITEM_VALUE_TYPE_TEXT != item->value_type ) {
+ switch (num) {
+ case 1:
+ if (1 != item->lastvalue_null)
+ {
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, 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:
+ zbx_snprintf(value, MAX_STRING_LEN, "%s", item->lastvalue_str);
+ break;
+ }
+ ret = SUCCEED;
+ }
break;
- case ITEM_VALUE_TYPE_UINT64:
- zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_UI64, item->prevvalue_uint64);
+ case 2:
+ if (1 != item->prevvalue_null)
+ {
+ switch (item->value_type) {
+ case ITEM_VALUE_TYPE_FLOAT:
+ zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, item->prevvalue_dbl);
+ del_zeroes(value);
+ break;
+ case ITEM_VALUE_TYPE_UINT64:
+ zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_UI64, item->prevvalue_uint64);
+ break;
+ default:
+ zbx_snprintf(value, MAX_STRING_LEN, "%s", item->prevvalue_str);
+ break;
+ }
+ ret = SUCCEED;
+ }
break;
default:
- zbx_snprintf(value, MAX_STRING_LEN, "%s", item->prevvalue_str);
- break;
- }
- ret = SUCCEED;
+ zbx_snprintf(sql, sizeof(sql), "select value, clock from %s where itemid=" ZBX_FS_UI64 " order by %s desc",
+ table,
+ item->itemid,
+ key);
+
+ result = DBselectN(sql, num);
+
+ while (NULL != (row = DBfetch(result)))
+ if (num == ++rows)
+ {
+ zbx_snprintf(value, MAX_STRING_LEN, "%s", row[0]);
+ ret = SUCCEED;
+ }
+
+ DBfree_result(result);
}
- break;
- default:
+ } else {
zbx_snprintf(sql, sizeof(sql), "select value, clock from %s where itemid=" ZBX_FS_UI64 " order by %s desc",
table,
item->itemid,
@@ -688,7 +705,6 @@
DBfree_result(result);
}
-
zabbix_log(LOG_LEVEL_DEBUG, "End of evaluate_LAST()");
return ret;
Comment