diff options
-rw-r--r-- | create/src/schema.tmpl | 10 | ||||
-rw-r--r-- | src/libs/zbxdbupgrade/dbupgrade_5050.c | 281 | ||||
-rw-r--r-- | ui/include/defines.inc.php | 2 |
3 files changed, 275 insertions, 18 deletions
diff --git a/create/src/schema.tmpl b/create/src/schema.tmpl index ca7ffef57a3..42c2ee1e2d4 100644 --- a/create/src/schema.tmpl +++ b/create/src/schema.tmpl @@ -1905,16 +1905,16 @@ UNIQUE |1 |name TABLE|sla_schedule|sla_scheduleid|ZBX_DATA FIELD |sla_scheduleid |t_id | |NOT NULL |0 FIELD |slaid |t_id | |NOT NULL |0 |1|sla|slaid -FIELD |from |t_integer |'0' |NOT NULL |0 -FIELD |to |t_integer |'0' |NOT NULL |0 +FIELD |period_from |t_integer |'0' |NOT NULL |0 +FIELD |period_to |t_integer |'0' |NOT NULL |0 INDEX |1 |slaid TABLE|sla_excluded_downtime|sla_excluded_downtimeid|ZBX_DATA FIELD |sla_excluded_downtimeid|t_id | |NOT NULL |0 FIELD |slaid |t_id | |NOT NULL |0 |1|sla|slaid FIELD |name |t_varchar(255) |'' |NOT NULL |0 -FIELD |from |t_integer |'0' |NOT NULL |0 -FIELD |to |t_integer |'0' |NOT NULL |0 +FIELD |period_from |t_integer |'0' |NOT NULL |0 +FIELD |period_to |t_integer |'0' |NOT NULL |0 INDEX |1 |slaid TABLE|sla_service_tag|sla_service_tagid|0 @@ -1929,4 +1929,4 @@ TABLE|dbversion|dbversionid| FIELD |dbversionid |t_id | |NOT NULL |0 FIELD |mandatory |t_integer |'0' |NOT NULL | FIELD |optional |t_integer |'0' |NOT NULL | -ROW |1 |5050127 |5050127 +ROW |1 |5050128 |5050128 diff --git a/src/libs/zbxdbupgrade/dbupgrade_5050.c b/src/libs/zbxdbupgrade/dbupgrade_5050.c index 49299df2121..ff82656cf6c 100644 --- a/src/libs/zbxdbupgrade/dbupgrade_5050.c +++ b/src/libs/zbxdbupgrade/dbupgrade_5050.c @@ -22,6 +22,7 @@ #include "dbupgrade.h" #include "dbupgrade_macros.h" #include "log.h" +#include "../zbxalgo/vectorimpl.h" extern unsigned char program_type; @@ -1248,8 +1249,8 @@ static int DBpatch_5050117(void) { {"sla_scheduleid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0}, {"slaid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0}, - {"from", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, - {"to", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, + {"period_from", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, + {"period_to", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, {0} }, NULL @@ -1278,8 +1279,8 @@ static int DBpatch_5050120(void) {"sla_excluded_downtimeid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0}, {"slaid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0}, {"name", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0}, - {"from", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, - {"to", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, + {"period_from", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, + {"period_to", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0}, {0} }, NULL @@ -1302,31 +1303,286 @@ static int DBpatch_5050122(void) static int DBpatch_5050123(void) { - return DBdrop_table("services_times"); + const ZBX_FIELD field = {"description", "", NULL, NULL, 0, ZBX_TYPE_SHORTTEXT, ZBX_NOTNULL, 0}; + + return DBadd_field("services", &field); } static int DBpatch_5050124(void) { - return DBdrop_field("services", "showsla"); + const ZBX_FIELD field = {"uuid", "", NULL, NULL, 32, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0}; + + return DBadd_field("services", &field); +} + +typedef struct +{ + int type; + int from; + int to; + char *note; +} +services_times_t; + +ZBX_PTR_VECTOR_DECL(services_times, services_times_t) +ZBX_PTR_VECTOR_IMPL(services_times, services_times_t) + +typedef struct +{ + int showsla; + double goodsla; + zbx_vector_services_times_t services_times; + zbx_vector_uint64_t serviceids; +} +sla_t; + +ZBX_PTR_VECTOR_DECL(sla, sla_t *) +ZBX_PTR_VECTOR_IMPL(sla, sla_t *) + +static int compare_services_time(const void *d1, const void *d2) +{ + const services_times_t *a, *b; + int ret; + + a = (services_times_t *)d1; + b = (services_times_t *)d2; + + ZBX_RETURN_IF_NOT_EQUAL(a->type, b->type); + ZBX_RETURN_IF_NOT_EQUAL(a->from, b->from); + ZBX_RETURN_IF_NOT_EQUAL(a->to, b->to); + + if (0 != (ret = strcmp(a->note, b->note))) + return ret; + + return 0; +} + +static int compare_sla(const void *d1, const void *d2) +{ + const sla_t *a, *b; + int i, ret; + + a = *(sla_t **)d1; + b = *(sla_t **)d2; + + ZBX_RETURN_IF_NOT_EQUAL(a->showsla, b->showsla); + ZBX_RETURN_IF_NOT_EQUAL(a->goodsla, b->goodsla); + ZBX_RETURN_IF_NOT_EQUAL(a->services_times.values_num, b->services_times.values_num); + + for (i = 0; i < a->services_times.values_num; i++) + { + ZBX_RETURN_IF_NOT_EQUAL(a->services_times.values[i].type, b->services_times.values[i].type); + ZBX_RETURN_IF_NOT_EQUAL(a->services_times.values[i].from, b->services_times.values[i].from); + ZBX_RETURN_IF_NOT_EQUAL(a->services_times.values[i].to, b->services_times.values[i].to); + + if (0 != (ret = strcmp(a->services_times.values[i].note, b->services_times.values[i].note))) + return ret; + } + + return 0; +} + +static void services_time_clean(services_times_t services_time) +{ + zbx_free(services_time.note); +} + +static void sla_clean(sla_t *sla) +{ + zbx_vector_services_times_clear_ext(&sla->services_times, services_time_clean); + zbx_vector_services_times_destroy(&sla->services_times); + zbx_vector_uint64_destroy(&sla->serviceids); + zbx_free(sla); +} + +#define ZBX_SLA_PERIOD_WEEKLY 1 +#define SERVICE_TIME_TYPE_UPTIME 0 + +static void db_insert_sla(const zbx_vector_sla_t *uniq_slas, const char *default_timezone) +{ + zbx_db_insert_t db_insert_sla, db_insert_sla_schedule, db_insert_sla_excluded_downtime, + db_insert_sla_service_tag, db_insert_service_tag; + int i, j; + zbx_uint64_t slaid; + + zbx_db_insert_prepare(&db_insert_sla, "sla", "slaid", "name", "status", "slo", "period", "timezone", NULL); + + zbx_db_insert_prepare(&db_insert_sla_service_tag, "sla_service_tag", "sla_service_tagid", "slaid", "tag", + "value", NULL); + + zbx_db_insert_prepare(&db_insert_service_tag, "service_tag", "servicetagid", "serviceid", "tag", "value", + NULL); + + zbx_db_insert_prepare(&db_insert_sla_schedule, "sla_schedule", "sla_scheduleid", "slaid", "period_from", + "period_to", NULL); + zbx_db_insert_prepare(&db_insert_sla_excluded_downtime, "sla_excluded_downtime", "sla_excluded_downtimeid", + "slaid", "period_from", "period_to", "name", NULL); + + for (i = 0, slaid = 0; i < uniq_slas->values_num; i++) + { + char buffer[MAX_STRING_LEN]; + const sla_t *sla = uniq_slas->values[i]; + + zbx_snprintf(buffer, sizeof(buffer), "SLA:" ZBX_FS_UI64, ++slaid); + + zbx_db_insert_add_values(&db_insert_sla, slaid, buffer, sla->showsla, sla->goodsla, + ZBX_SLA_PERIOD_WEEKLY, default_timezone); + + zbx_snprintf(buffer, sizeof(buffer), ZBX_FS_UI64, slaid); + zbx_db_insert_add_values(&db_insert_sla_service_tag, slaid, slaid, "SLA:", buffer); + + for (j = 0; j < sla->serviceids.values_num; j++) + { + zbx_db_insert_add_values(&db_insert_service_tag, __UINT64_C(0), sla->serviceids.values[j], + "SLA:", buffer); + } + + for (j = 0; j < sla->services_times.values_num; j++) + { + services_times_t *services_time = &sla->services_times.values[j]; + + if (SERVICE_TIME_TYPE_UPTIME == services_time->type) + { + zbx_db_insert_add_values(&db_insert_sla_schedule, __UINT64_C(0), slaid, + services_time->from, services_time->to); + continue; + } + + zbx_db_insert_add_values(&db_insert_sla_excluded_downtime, __UINT64_C(0), slaid, + services_time->from, services_time->to, services_time->note); + } + } + + zbx_db_insert_execute(&db_insert_sla); + zbx_db_insert_clean(&db_insert_sla); + + zbx_db_insert_execute(&db_insert_sla_service_tag); + zbx_db_insert_clean(&db_insert_sla_service_tag); + + zbx_db_insert_autoincrement(&db_insert_service_tag, "servicetagid"); + zbx_db_insert_execute(&db_insert_service_tag); + zbx_db_insert_clean(&db_insert_service_tag); + + zbx_db_insert_autoincrement(&db_insert_sla_schedule, "sla_scheduleid"); + zbx_db_insert_execute(&db_insert_sla_schedule); + zbx_db_insert_clean(&db_insert_sla_schedule); + + zbx_db_insert_autoincrement(&db_insert_sla_excluded_downtime, "sla_excluded_downtimeid"); + zbx_db_insert_execute(&db_insert_sla_excluded_downtime); + zbx_db_insert_clean(&db_insert_sla_excluded_downtime); } static int DBpatch_5050125(void) { - return DBdrop_field("services", "goodsla"); + DB_RESULT result; + DB_ROW row; + zbx_uint64_t last_serviceid = 0; + zbx_vector_sla_t slas, uniq_slas; + int i, j; + char *default_timezone; + + zbx_vector_sla_create(&slas); + zbx_vector_sla_create(&uniq_slas); + + result = DBselect( + "select s.serviceid,s.showsla,s.goodsla,t.type,t.ts_from,t.ts_to,t.note" + " from services s" + " left join services_times t on s.serviceid=t.serviceid" + " order by s.serviceid"); + + while (NULL != (row = DBfetch(result))) + { + zbx_uint64_t serviceid; + sla_t *sla; + + ZBX_STR2UINT64(serviceid, row[0]); + + if (last_serviceid != serviceid) + { + sla = zbx_malloc(NULL, sizeof(sla_t)); + + zbx_vector_services_times_create(&sla->services_times); + zbx_vector_uint64_create(&sla->serviceids); + + sla->showsla = atoi(row[1]); + sla->goodsla = atof(row[2]); + + zbx_vector_uint64_append(&sla->serviceids, serviceid); + + zbx_vector_sla_append(&slas, sla); + last_serviceid = serviceid; + } + + if (NULL != row[3]) + { + services_times_t service_time; + + service_time.type = atoi(row[3]); + service_time.from = atoi(row[4]); + service_time.to = atoi(row[5]); + service_time.note = zbx_strdup(NULL, row[6]); + + zbx_vector_services_times_append(&sla->services_times, service_time); + } + } + DBfree_result(result); + + for (i = 0; i < slas.values_num; i++) + zbx_vector_services_times_sort(&slas.values[i]->services_times, compare_services_time); + + for (i = 0; i < slas.values_num; i++) + { + if (FAIL == (j = zbx_vector_sla_search(&uniq_slas, slas.values[i], compare_sla))) + { + zbx_vector_sla_append(&uniq_slas, slas.values[i]); + zbx_vector_sla_remove_noorder(&slas, i); + i--; + continue; + } + + zbx_vector_uint64_append(&uniq_slas.values[j]->serviceids, slas.values[i]->serviceids.values[0]); + } + + result = DBselect("select default_timezone from config"); + if (NULL != (row = DBfetch(result))) + { + if (0 == strcmp(row[0], "system")) + default_timezone = zbx_strdup(NULL, "UTC"); + else + default_timezone = zbx_strdup(NULL, row[0]); + } + else + { + THIS_SHOULD_NEVER_HAPPEN; + default_timezone = zbx_strdup(NULL, "UTC"); + } + DBfree_result(result); + + db_insert_sla(&uniq_slas, default_timezone); + + zbx_vector_sla_clear_ext(&slas, sla_clean); + zbx_vector_sla_clear_ext(&uniq_slas, sla_clean); + zbx_vector_sla_destroy(&slas); + zbx_vector_sla_destroy(&uniq_slas); + + zbx_free(default_timezone); + + return SUCCEED; } static int DBpatch_5050126(void) { - const ZBX_FIELD field = {"description", "", NULL, NULL, 0, ZBX_TYPE_SHORTTEXT, ZBX_NOTNULL, 0}; - - return DBadd_field("services", &field); + return DBdrop_table("services_times"); } static int DBpatch_5050127(void) { - const ZBX_FIELD field = {"uuid", "", NULL, NULL, 32, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0}; + return DBdrop_field("services", "showsla"); +} - return DBadd_field("services", &field); +static int DBpatch_5050128(void) +{ + return DBdrop_field("services", "goodsla"); } #endif @@ -1450,5 +1706,6 @@ DBPATCH_ADD(5050124, 0, 1) DBPATCH_ADD(5050125, 0, 1) DBPATCH_ADD(5050126, 0, 1) DBPATCH_ADD(5050127, 0, 1) +DBPATCH_ADD(5050128, 0, 1) DBPATCH_END() diff --git a/ui/include/defines.inc.php b/ui/include/defines.inc.php index 8e1f1d49f19..d603b513d20 100644 --- a/ui/include/defines.inc.php +++ b/ui/include/defines.inc.php @@ -22,7 +22,7 @@ define('ZABBIX_VERSION', '6.0.0alpha7'); define('ZABBIX_API_VERSION', '6.0.0'); define('ZABBIX_EXPORT_VERSION', '6.0'); -define('ZABBIX_DB_VERSION', 5050127); +define('ZABBIX_DB_VERSION', 5050128); define('DB_VERSION_SUPPORTED', 0); define('DB_VERSION_LOWER_THAN_MINIMUM', 1); |