Blame db.h

Packit 1c819f
/*
Packit 1c819f
 * iSNS object database
Packit 1c819f
 *
Packit 1c819f
 * Copyright (C) 2007 Olaf Kirch <olaf.kirch@oracle.com>
Packit 1c819f
 */
Packit 1c819f
Packit 1c819f
#ifndef ISNS_DB_H
Packit 1c819f
#define ISNS_DB_H
Packit 1c819f
Packit 1c819f
#include <libisns/attrs.h>
Packit 1c819f
Packit 1c819f
typedef struct isns_db_backend	isns_db_backend_t;
Packit 1c819f
Packit 1c819f
/*
Packit 1c819f
 * In-memory portion of object database.
Packit 1c819f
 * Stable storage is provided by different
Packit 1c819f
 * backends.
Packit 1c819f
 */
Packit 1c819f
struct isns_db {
Packit 1c819f
	isns_object_list_t *	id_objects;
Packit 1c819f
	isns_object_list_t	__id_objects;
Packit 1c819f
Packit 1c819f
	isns_relation_soup_t *	id_relations;
Packit 1c819f
Packit 1c819f
	uint32_t		id_last_eid;
Packit 1c819f
	uint32_t		id_last_index;
Packit 1c819f
Packit 1c819f
	isns_scope_t *		id_global_scope;
Packit 1c819f
	isns_scope_t *		id_default_scope;
Packit 1c819f
Packit 1c819f
	isns_db_backend_t *	id_backend;
Packit 1c819f
Packit 1c819f
	unsigned int		id_in_transaction : 1;
Packit 1c819f
	struct isns_db_trans *	id_transact;
Packit 1c819f
Packit 1c819f
	/* This is for objects in limbo. When a client
Packit 1c819f
	 * calls DevAttrDereg, the object will first be
Packit 1c819f
	 * placed on the id_deferred list.
Packit 1c819f
	 * When we're done processing the message, we
Packit 1c819f
	 * invoke isns_db_purge, which looks at these
Packit 1c819f
	 * objects.
Packit 1c819f
	 *  -	if the reference count is 1, the object
Packit 1c819f
	 *	is deleted.
Packit 1c819f
	 *  -	otherwise, we assume the object is referenced
Packit 1c819f
	 *	by a discovery domain. In this case, we prune
Packit 1c819f
	 *	the attribute list down to the key attr(s)
Packit 1c819f
	 *	plus the index attribute, and move it to
Packit 1c819f
	 *	the id_limbo list.
Packit 1c819f
	 */
Packit 1c819f
	isns_object_list_t	id_deferred;
Packit 1c819f
	isns_object_list_t	id_limbo;
Packit 1c819f
};
Packit 1c819f
Packit 1c819f
Packit 1c819f
struct isns_db_backend {
Packit 1c819f
	char *		idb_name;
Packit 1c819f
Packit 1c819f
	int		(*idb_reload)(isns_db_t *);
Packit 1c819f
	int		(*idb_sync)(isns_db_t *);
Packit 1c819f
	int		(*idb_store)(isns_db_t *,
Packit 1c819f
					const isns_object_t *);
Packit 1c819f
	int		(*idb_remove)(isns_db_t *,
Packit 1c819f
					const isns_object_t *);
Packit 1c819f
};
Packit 1c819f
Packit 1c819f
extern isns_db_backend_t *isns_create_file_db_backend(const char *);
Packit 1c819f
extern isns_object_t *	__isns_db_get_next(const isns_object_list_t *,
Packit 1c819f
					isns_object_template_t *,
Packit 1c819f
					const isns_attr_list_t *,
Packit 1c819f
					const isns_attr_list_t *);
Packit 1c819f
Packit 1c819f
extern isns_relation_soup_t *isns_relation_soup_alloc(void);
Packit 1c819f
extern isns_relation_t *isns_create_relation(isns_object_t *relating_object,
Packit 1c819f
					unsigned int relation_type,
Packit 1c819f
					isns_object_t *subordinate_object1,
Packit 1c819f
					isns_object_t *subordinate_object2);
Packit 1c819f
extern void		isns_relation_sever(isns_relation_t *);
Packit 1c819f
extern void		isns_relation_release(isns_relation_t *);
Packit 1c819f
extern void		isns_relation_add(isns_relation_soup_t *,
Packit 1c819f
					isns_relation_t *);
Packit 1c819f
extern void		isns_relation_remove(isns_relation_soup_t *,
Packit 1c819f
					isns_relation_t *);
Packit 1c819f
extern isns_object_t *	isns_relation_get_other(const isns_relation_t *,
Packit 1c819f
					const isns_object_t *);
Packit 1c819f
extern isns_relation_t *isns_relation_find_edge(isns_relation_soup_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					unsigned int);
Packit 1c819f
extern void		isns_relation_halfspace(isns_relation_soup_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					unsigned int,
Packit 1c819f
					isns_object_list_t *);
Packit 1c819f
extern void		isns_relation_get_edge_objects(isns_relation_soup_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					unsigned int,
Packit 1c819f
					isns_object_list_t *);
Packit 1c819f
extern int		isns_relation_exists(isns_relation_soup_t *,
Packit 1c819f
					const isns_object_t *relating_object,
Packit 1c819f
					const isns_object_t *left,
Packit 1c819f
					const isns_object_t *right,
Packit 1c819f
					unsigned int relation_type);
Packit 1c819f
extern int		isns_relation_is_dead(const isns_relation_t *);
Packit 1c819f
Packit 1c819f
extern void		isns_db_create_relation(isns_db_t *db,
Packit 1c819f
					isns_object_t *relating_object,
Packit 1c819f
					unsigned int relation_type,
Packit 1c819f
					isns_object_t *subordinate_object1,
Packit 1c819f
					isns_object_t *subordinate_object2);
Packit 1c819f
extern void		isns_db_get_relationship_objects(isns_db_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					unsigned int relation_type,
Packit 1c819f
					isns_object_list_t *);
Packit 1c819f
extern isns_object_t *	isns_db_get_relationship_object(isns_db_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					const isns_object_t *,
Packit 1c819f
					unsigned int relation_type);
Packit 1c819f
extern int		isns_db_relation_exists(isns_db_t *db,
Packit 1c819f
					const isns_object_t *relating_object,
Packit 1c819f
					const isns_object_t *left,
Packit 1c819f
					const isns_object_t *right,
Packit 1c819f
					unsigned int relation_type);
Packit 1c819f
extern int		isns_db_create_pg_relation(isns_db_t *,
Packit 1c819f
					isns_object_t *);
Packit 1c819f
Packit 1c819f
extern isns_scope_t *	isns_scope_for_call(isns_db_t *, const isns_simple_t *);
Packit 1c819f
extern isns_scope_t *	isns_scope_alloc(isns_db_t *);
Packit 1c819f
extern void		isns_scope_release(isns_scope_t *);
Packit 1c819f
extern void		isns_scope_add(isns_scope_t *,
Packit 1c819f
				isns_object_t *);
Packit 1c819f
extern int		isns_scope_remove(isns_scope_t *,
Packit 1c819f
				isns_object_t *);
Packit 1c819f
extern int		isns_scope_gang_lookup(isns_scope_t *,
Packit 1c819f
				isns_object_template_t *,
Packit 1c819f
				const isns_attr_list_t *,
Packit 1c819f
				isns_object_list_t *);
Packit 1c819f
extern isns_object_t *	isns_scope_get_next(isns_scope_t *,
Packit 1c819f
				isns_object_template_t *,
Packit 1c819f
				const isns_attr_list_t *current,
Packit 1c819f
				const isns_attr_list_t *scope);
Packit 1c819f
extern void		isns_scope_get_related(isns_scope_t *,
Packit 1c819f
				const isns_object_t *,
Packit 1c819f
				unsigned int,
Packit 1c819f
				isns_object_list_t *);
Packit 1c819f
extern isns_db_t *	isns_scope_get_db(const isns_scope_t *);
Packit 1c819f
Packit 1c819f
Packit 1c819f
#endif /* ISNS_DB_H */