--- src/libs/zbxserver/evalfunc.c.org 2009-09-22 13:21:37.000000000 +0000 +++ src/libs/zbxserver/evalfunc.c 2009-09-22 13:38:33.000000000 +0000 @@ -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; @@ -1354,6 +1370,7 @@ int ret = SUCCEED; struct tm *tm; int fuzlow, fuzhig; + char last_txt[MAX_STRING_LEN], prev_txt[MAX_STRING_LEN]; zabbix_log(LOG_LEVEL_DEBUG, "In evaluate_function('%s.%s(%s)')", zbx_host_key_string_by_item(item), @@ -1479,6 +1496,22 @@ strcpy(value,"1"); } break; + case ITEM_VALUE_TYPE_TEXT: + if(FAIL != evaluate_LAST(last_txt, item, 1)) + ret = evaluate_LAST(prev_txt, item, 2); + + if (FAIL != ret) + { + if(strcmp(last_txt, prev_txt) == 0) + { + strcpy(value,"0"); + } + else + { + strcpy(value,"1"); + } + } + break; default: if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) {