|
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 */
|