[Openais] V2: Ideas for a cleaner/easier to use objdb API
Angus Salkeld
angus.salkeld at gmail.com
Thu Jul 30 01:33:12 PDT 2009
Hi all
Thanks for all the feedback, here is the next iteration of objdb.h.
Major changes:
- a more object oriented API
- add transactions
- (reluctantly) allow objects with the same name at the same level.
- add support for object unlinking, retention duration & expiration timeout.
-Angus
typedef enum {
OBJECT_TRACK_DEPTH_ONE,
OBJECT_TRACK_DEPTH_RECURSIVE
} objdb_track_depth_t;
typedef enum {
OBJDB_OBJECT_CREATE,
OBJDB_OBJECT_DELETE,
OBJDB_KEY_CREATE,
OBJDB_KEY_REPLACE,
OBJDB_KEY_DELETE,
OBJDB_KEY_READ,
OBJDB_KEY_WRITE,
OBJDB_VALIDATE_OBJECT_CREATE,
OBJDB_VALIDATE_OBJECT_DELETE,
OBJDB_VALIDATE_KEY_CREATE,
OBJDB_VALIDATE_KEY_REPLACE,
OBJDB_VALIDATE_KEY_DELETE
} objdb_callback_type_t;
typedef enum {
OBJDB_OPTION_RETENTION_DURATION,
OBJDB_OPTION_EXPIRATION_TIMEOUT,
} objdb_object_option_t;
#define OBJDB_ATTR_MEMORY 0x01
#define OBJDB_ATTR_PERSISTENT 0x02
#define OBJDB_ATTR_RUNTIME 0x04
#define OBJDB_ATTR_READONLY 0x08
#define OBJDB_ATTR_READWRITE 0x10
typedef int (*objdb_callback_fn_t) (
const char *path_pt,
objdb_callback_type_t type,
const void *value, size_t value_len,
void *priv_data_pt);
typedef struct {
hdb_handle_t *handle,
char * path;
/**
* get a key value from this object.
*/
int (*get)(char * name, void * value, int * value_len);
/**
* set a key value from this object.
*/
int (*set)(char * name, const void * value, int value_len);
/**
* After creating an object set your self as the implementor for
* this object.
* @param cb pass in the validation and commit callbacks.
*/
int (*set_implementor)(objdb_callback_fn_t cb);
/**
* create an object with the given path and attributes.
* @code
* cs = trans->object_request("/clusters", OBJDB_ATTR_MEMORY);
* c1 = cs->create_child_object ("cluster", OBJDB_ATTR_MEMORY);
* c1->set("field", "value1", 7);
* c2 = cs->create_child_object ("cluster", OBJDB_ATTR_MEMORY);
* c2->set("field", "value2", 7);
* trans->commit();
* @endcode
*/
objdb_object_t * (*create_child_object)(char * name, uint8_t attributes);
/**
* Request this object to be deleted (once all applications have
* dereferenced it).
*/
int (*unlink)(void);
/**
* set object options
*/
int (*set_option) (objdb_object_option_t option, int value);
/* iterators */
objdb_object_t * (*get_first_object)(void);
objdb_object_t * (*get_next_object)(void);
objdb_object_t * (*get_first_key)(char *name, void *value, int
*value_len);
objdb_object_t * (*get_next_key)(char *name, void *value, int *value_len);
} objdb_object_t;
typedef struct {
/**
* lookup the object, add a reference count to it and allocate a
* objdb_object_t.
* @return return null if the obj can't be found.
*/
objdb_object_t * (*object_request)(char * path);
/**
* dereference the object and free the objdb_object_t struct.
*/
void (*object_release)(objdb_object_t * obj);
/**
* create an object with the given path and attributes.
*/
objdb_object_t * (*object_create)(char * path, uint8_t attributes);
/**
* commit any pending changes made within this transaction.
*/
int (*commit)(void);
/* TODO search API goes here. */
} objdb_transaction_t;
struct objdb_iface_ver_2_0 {
int (*objdb_init) (void);
/**
* create a new transaction to access the objdb.
*/
objdb_transaction_t * (*trans_new)(void);
/**
* release a transaction.
* If there are any uncommitted changes they will be discarded.
*/
void (*trans_release)(objdb_transaction_t * trans);
int (*track_start) (
const char *path,
hdb_handle_t *track_handle,
objdb_track_depth_t depth,
objdb_callback_fn_t data_changed_notify_fn,
void * priv_data_pt);
void (*track_stop) (hdb_handle_t track_handle);
};
More information about the Openais
mailing list