/*!
 * \file
 * \ingroup db
 * \brief Database support for modules.
 *
 * Database support functions for modules.
 *
 * @cond
 * WARNING:
 * This file was autogenerated from the XML source file
 * ../../modules/userblocklist/kamailio-userblocklist.xml.
 * It can be regenerated by running 'make modules' in the db/schema
 * directory of the source code. You need to have xsltproc and
 * docbook-xsl stylesheets installed.
 * ALL CHANGES DONE HERE WILL BE LOST IF THE FILE IS REGENERATED
 * @endcond
 */

#include "db_userblocklist.h"

/* database variables */
/* TODO assign read-write or read-only URI, introduce a parameter in XML */

//extern str userblocklist_db_url;
db1_con_t * userblocklist_dbh = NULL;
db_func_t userblocklist_dbf;

str userblocklist_table = str_init("userblocklist");

/* column names */
str userblocklist_id_col = str_init("id");
str userblocklist_username_col = str_init("username");
str userblocklist_domain_col = str_init("domain");
str userblocklist_prefix_col = str_init("prefix");
str userblocklist_allowlist_col = str_init("allowlist");

/* table version */
const unsigned int userblocklist_version = 1;

str globalblocklist_table = str_init("globalblocklist");

/* column names */
str globalblocklist_id_col = str_init("id");
str globalblocklist_prefix_col = str_init("prefix");
str globalblocklist_allowlist_col = str_init("allowlist");
str globalblocklist_description_col = str_init("description");

/* table version */
const unsigned int globalblocklist_version = 1;


/*
 * Closes the DB connection.
 */
void userblocklist_db_close(void) {
	if (userblocklist_dbh) {
		userblocklist_dbf.close(userblocklist_dbh);
		userblocklist_dbh = NULL;
	}
}


/*!
 * Initialises the DB API and check the table version.
 * This should be called from the mod_init function.
 *
 * \return 0 means ok, -1 means an error occurred.
 */
int userblocklist_db_init(void) {
	if (!userblocklist_db_url.s || !userblocklist_db_url.len) {
		LM_ERR("you have to set the db_url module parameter.\n");
		return -1;
	}
	if (db_bind_mod(&userblocklist_db_url, &userblocklist_dbf) < 0) {
		LM_ERR("can't bind database module.\n");
		return -1;
	}
	if ((userblocklist_dbh = userblocklist_dbf.init(&userblocklist_db_url)) == NULL) {
		LM_ERR("can't connect to database.\n");
		return -1;
	}
	if (db_check_table_version(&userblocklist_dbf, userblocklist_dbh,
			&userblocklist_table, userblocklist_version) < 0) {
		DB_TABLE_VERSION_ERROR(userblocklist_table);
		userblocklist_db_close();
		return -1;
	}
	if (db_check_table_version(&userblocklist_dbf, userblocklist_dbh,
			&globalblocklist_table, globalblocklist_version) < 0) {
		DB_TABLE_VERSION_ERROR(globalblocklist_table);
		userblocklist_db_close();
		return -1;
	}
	return 0;
}


/*!
 * Initialize the DB connection without checking the table version and DB URL.
 * This should be called from child_init. An already existing database
 * connection will be closed, and a new one created.
 *
 * \return 0 means ok, -1 means an error occurred.
 */
int userblocklist_db_open(void) {
	if (userblocklist_dbh) {
		userblocklist_dbf.close(userblocklist_dbh);
	}
	if ((userblocklist_dbh = userblocklist_dbf.init(&userblocklist_db_url)) == NULL) {
		LM_ERR("can't connect to database.\n");
		return -1;
	}
	return 0;
}