/*
** Copyright (C) 2001-2024 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/

#include "dbupgrade.h"

#include "zbxdb.h"
#include "zbxdbschema.h"

/*
 * 4.2 development database patches
 */

#ifndef HAVE_SQLITE3

static int	DBpatch_4010001(void)
{
	const zbx_db_field_t	field = {"content_type", "1", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0};

	return DBadd_field("media_type", &field);
}

static int	DBpatch_4010002(void)
{
	if (0 == (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("update media_type set content_type=0"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010003(void)
{
	const zbx_db_field_t	field = {"error_handler", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0};

	return DBadd_field("item_preproc", &field);
}

static int	DBpatch_4010004(void)
{
	const zbx_db_field_t	field = {"error_handler_params", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0};

	return DBadd_field("item_preproc", &field);
}

static int	DBpatch_4010005(void)
{
	const zbx_db_table_t	table =
			{"lld_macro_path", "lld_macro_pathid", 0,
				{
					{"lld_macro_pathid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0},
					{"itemid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0},
					{"lld_macro", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0},
					{"path", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0},
					{0}
				},
				NULL
			};

	return DBcreate_table(&table);
}

static int	DBpatch_4010006(void)
{
	return DBcreate_index("lld_macro_path", "lld_macro_path_1", "itemid,lld_macro", 1);
}

static int	DBpatch_4010007(void)
{
	const zbx_db_field_t	field = {"itemid", NULL, "items", "itemid", 0, 0, 0, ZBX_FK_CASCADE_DELETE};

	return DBadd_foreign_key("lld_macro_path", 1, &field);
}

static int	DBpatch_4010008(void)
{
	const zbx_db_field_t	field = {"db_extension", "", NULL, NULL, 32, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0};

	return DBadd_field("config", &field);
}

static int	DBpatch_4010009(void)
{
	const zbx_db_table_t	table =
			{"host_tag", "hosttagid", 0,
				{
					{"hosttagid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0},
					{"hostid", NULL, NULL, NULL, 0, ZBX_TYPE_ID, ZBX_NOTNULL, 0},
					{"tag", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0},
					{"value", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0},
					{0}
				},
				NULL
			};

	return DBcreate_table(&table);
}

static int	DBpatch_4010010(void)
{
	return DBcreate_index("host_tag", "host_tag_1", "hostid", 0);
}

static int	DBpatch_4010011(void)
{
	const zbx_db_field_t	field = {"hostid", NULL, "hosts", "hostid", 0, 0, 0, ZBX_FK_CASCADE_DELETE};

	return DBadd_foreign_key("host_tag", 1, &field);
}

static int	DBpatch_4010012(void)
{
	const zbx_db_field_t	field = {"params", "", NULL, NULL, 0, ZBX_TYPE_TEXT, ZBX_NOTNULL, 0};

	return DBmodify_field_type("item_preproc", &field, NULL);
}

static int	DBpatch_4010013(void)
{
	if (0 == (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("update profiles set idx='web.items.filter_groupids'"
				" where idx='web.items.filter_groupid'"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010014(void)
{
	if (0 == (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("update profiles set idx='web.items.filter_hostids'"
				" where idx='web.items.filter_hostid'"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010015(void)
{
	if (0 == (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("update profiles set idx='web.items.filter_inherited'"
				" where idx='web.items.filter_templated_items'"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010016(void)
{
	if (0 == (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("delete from profiles where idx='web.triggers.filter_priority' and value_int='-1'"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010017(void)
{
	const zbx_db_field_t	field = {"host_source", "1", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0};

	return DBadd_field("dchecks", &field);
}

static int	DBpatch_4010018(void)
{
	const zbx_db_field_t	field = {"name_source", "0", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0};

	return DBadd_field("dchecks", &field);
}

static int	DBpatch_4010019(void)
{
	return DBdrop_foreign_key("dchecks", 1);
}

static int	DBpatch_4010020(void)
{
	return DBdrop_index("dchecks", "dchecks_1");
}

static int	DBpatch_4010021(void)
{
	return DBcreate_index("dchecks", "dchecks_1", "druleid,host_source,name_source", 0);
}

static int	DBpatch_4010022(void)
{
	const zbx_db_field_t	field = {"druleid", NULL, "drules", "druleid", 0, 0, 0, ZBX_FK_CASCADE_DELETE};

	return DBadd_foreign_key("dchecks", 1, &field);
}

static int	DBpatch_4010023(void)
{
	return DBcreate_index("proxy_dhistory", "proxy_dhistory_2", "druleid", 0);
}

static int	DBpatch_4010024(void)
{
	const zbx_db_field_t	field = {"height", "2", NULL, NULL, 0, ZBX_TYPE_INT, ZBX_NOTNULL, 0};

	return DBmodify_field_type("widget", &field, NULL);
}

static int	DBpatch_4010025(void)
{
	zbx_db_row_t	row;
	zbx_db_result_t	result;
	zbx_uint64_t	nextid;

	if (0 != (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("delete from ids where table_name='proxy_history'"))
		return FAIL;

	result = zbx_db_select("select max(id) from proxy_history");

	if (NULL != (row = zbx_db_fetch(result)))
		ZBX_DBROW2UINT64(nextid, row[0]);
	else
		nextid = 0;

	zbx_db_free_result(result);

	if (0 != nextid && ZBX_DB_OK > zbx_db_execute("insert into ids values ('proxy_history','history_lastid'," ZBX_FS_UI64
			")", nextid))
	{
		return FAIL;
	}

	return SUCCEED;
}

static int	DBpatch_4010026(void)
{
	if (0 != (DBget_program_type() & ZBX_PROGRAM_TYPE_SERVER))
		return SUCCEED;

	if (ZBX_DB_OK > zbx_db_execute("update hosts set status=1"))
		return FAIL;

	return SUCCEED;
}

static int	DBpatch_4010027(void)
{
	const zbx_db_field_t	field = {"details", "", NULL, NULL, 255, ZBX_TYPE_CHAR, ZBX_NOTNULL, 0};

	return DBadd_field("triggers", &field);
}

#endif

DBPATCH_START(4010)

/* version, duplicates flag, mandatory flag */

DBPATCH_ADD(4010001, 0, 1)
DBPATCH_ADD(4010002, 0, 1)
DBPATCH_ADD(4010003, 0, 1)
DBPATCH_ADD(4010004, 0, 1)
DBPATCH_ADD(4010005, 0, 1)
DBPATCH_ADD(4010006, 0, 1)
DBPATCH_ADD(4010007, 0, 1)
DBPATCH_ADD(4010008, 0, 1)
DBPATCH_ADD(4010009, 0, 1)
DBPATCH_ADD(4010010, 0, 1)
DBPATCH_ADD(4010011, 0, 1)
DBPATCH_ADD(4010012, 0, 1)
DBPATCH_ADD(4010013, 0, 1)
DBPATCH_ADD(4010014, 0, 1)
DBPATCH_ADD(4010015, 0, 1)
DBPATCH_ADD(4010016, 0, 1)
DBPATCH_ADD(4010017, 0, 1)
DBPATCH_ADD(4010018, 0, 1)
DBPATCH_ADD(4010019, 0, 1)
DBPATCH_ADD(4010020, 0, 1)
DBPATCH_ADD(4010021, 0, 1)
DBPATCH_ADD(4010022, 0, 1)
DBPATCH_ADD(4010023, 0, 1)
DBPATCH_ADD(4010024, 0, 1)
DBPATCH_ADD(4010025, 0, 1)
DBPATCH_ADD(4010026, 0, 1)
DBPATCH_ADD(4010027, 0, 1)

DBPATCH_END()