#ifndef  UL_DB_LAYER_H
#define UL_DB_LAYER_H

#include "../../lib/srdb1/db.h"
#include "../usrloc/usrloc.h"
#include "udomain.h"
#include "ucontact.h"

#define DB_TYPE_CLUSTER 0
#define DB_TYPE_CLUSTER_STR "cluster"
#define DB_TYPE_SINGLE 1
#define DB_TYPE_SINGLE_STR "single"

typedef struct ul_domain_db {
	str name;
	str url;
	int dbt;
	struct ul_domain_db_list * next;
} ul_domain_db_t;

typedef struct ul_domain_db_list {
	ul_domain_db_t domain;
	struct ul_domain_db_list * next;
} ul_domain_db_list_t;

int ul_db_layer_init();

void ul_db_layer_destroy();

int ul_db_layer_single_connect(udomain_t * domain, str * url);

int ul_db_layer_insert(udomain_t * domain, str * user, str * sipdomain, 
				 db_key_t* _k, db_val_t* _v, int _n);

int ul_db_layer_update(udomain_t * domain, str * user, str * sipdomain, db_key_t* _k, db_op_t* _o, db_val_t* _v,
	         db_key_t* _uk, db_val_t* _uv, int _n, int _un);

int ul_db_layer_replace(udomain_t * domain, str * user, str * sipdomain, 
						db_key_t* _k,	db_val_t* _v, int _n, int _un);

int ul_db_layer_delete(udomain_t * domain, str * user, str * sipdomain, 
				 db_key_t* _k, db_op_t* _o, db_val_t* _v, int _n);

int ul_db_layer_query(udomain_t * domain, str * user, str * sipdomain,
				db_key_t* _k, db_op_t* _op, db_val_t* _v, db_key_t* _c, 
				int _n, int _nc, db_key_t _o, db1_res_t** _r);

int ul_db_layer_raw_query(udomain_t * domain, str* _s, db1_res_t** _r);

int ul_db_layer_fetch_result(udomain_t * domain, db1_res_t** _r, int _n);

int ul_db_layer_free_result(udomain_t * domain, db1_res_t * res);

int ul_add_domain_db(str * d, int t, str * url);

ul_domain_db_t * ul_find_domain(const char * s);

int parse_domain_db(str * _d);

#endif