--- src/libs/zbxserver/evalfunc.c 2010-08-16 08:19:31.000000000 +0000 +++ src/libs/zbxserver/evalfunc.c.new 2010-08-17 08:22:24.000000000 +0000 @@ -862,67 +862,92 @@ else goto clean; - if (time_shift == 0 && arg1 == 1) - { - if (1 != item->lastvalue_null) + if (ITEM_VALUE_TYPE_TEXT != item->value_type) { + if (time_shift == 0 && arg1 == 1) { - switch (item->value_type) { - case ITEM_VALUE_TYPE_FLOAT: - zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, item->lastvalue_dbl); - 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; + 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); + 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; + } + res = SUCCEED; } - res = SUCCEED; } - } - else if (time_shift == 0 && arg1 == 2) - { - if (1 != item->prevvalue_null) + else if (time_shift == 0 && arg1 == 2) { - switch (item->value_type) { - case ITEM_VALUE_TYPE_FLOAT: - zbx_snprintf(value, MAX_STRING_LEN, ZBX_FS_DBL, item->prevvalue_dbl); - 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; + 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); + 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; + } + res = SUCCEED; } - res = SUCCEED; } - } - else - { - zbx_snprintf(sql, sizeof(sql), - "select value,clock" - " from %s" - " where itemid=" ZBX_FS_UI64 - " and clock<=%d" - " order by %s desc", - get_table_by_value_type(item->value_type), - item->itemid, - now, - get_key_by_value_type(item->value_type)); - - result = DBselectN(sql, arg1); - - while (NULL != (row = DBfetch(result))) + else { - if (arg1 == ++rows) + zbx_snprintf(sql, sizeof(sql), + "select value,clock" + " from %s" + " where itemid=" ZBX_FS_UI64 + " and clock<=%d" + " order by %s desc", + get_table_by_value_type(item->value_type), + item->itemid, + now, + get_key_by_value_type(item->value_type)); + + result = DBselectN(sql, arg1); + + while (NULL != (row = DBfetch(result))) { - zbx_snprintf(value, MAX_STRING_LEN, "%s", row[0]); - res = SUCCEED; + if (arg1 == ++rows) + { + zbx_snprintf(value, MAX_STRING_LEN, "%s", row[0]); + res = SUCCEED; + } } + + DBfree_result(result); } + } else { + zbx_snprintf(sql, sizeof(sql), + "select value,clock" + " from %s" + " where itemid=" ZBX_FS_UI64 + " order by %s desc", + get_table_by_value_type(item->value_type), + item->itemid, + get_key_by_value_type(item->value_type)); + + zabbix_log(LOG_LEVEL_DEBUG, "DIFFSQL: %s", sql); + result = DBselectN(sql, arg1); + + while (NULL != (row = DBfetch(result))) + { + if (arg1 == ++rows) + { + zbx_snprintf(value, MAX_STRING_LEN, "%s", row[0]); + res = SUCCEED; + } + } - DBfree_result(result); + DBfree_result(result); } clean: @@ -1496,6 +1521,7 @@ { const char *__function_name = "evaluate_DIFF"; int res = FAIL; + char last_txt[MAX_STRING_LEN], prev_txt[MAX_STRING_LEN]; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); @@ -1515,6 +1541,17 @@ else zbx_strlcpy(value, "1", MAX_STRING_LEN); break; + case ITEM_VALUE_TYPE_TEXT: + if (FAIL != evaluate_LAST(last_txt, item, "last", parameters, now)) + res = evaluate_LAST(prev_txt, item, "prev", parameters, now); + + if (FAIL != res) { + if (strcmp(last_txt, prev_txt) == 0) + zbx_strlcpy(value, "0", MAX_STRING_LEN); + else + zbx_strlcpy(value, "1", MAX_STRING_LEN); + } + break; default: if (0 == strcmp(item->lastvalue_str, item->prevvalue_str)) zbx_strlcpy(value, "0", MAX_STRING_LEN);