| /* Copyright (C) 2005 Red Hat, Inc. */ |
| |
| #ifndef _SEMANAGE_DATABASE_LLIST_INTERNAL_H_ |
| #define _SEMANAGE_DATABASE_LLIST_INTERNAL_H_ |
| |
| #include "database.h" |
| #include "handle.h" |
| |
| /* Representation of the database once loaded in memory */ |
| typedef struct cache_entry { |
| record_t *data; |
| struct cache_entry *prev; |
| struct cache_entry *next; |
| } cache_entry_t; |
| |
| /* LLIST dbase */ |
| typedef struct dbase_llist { |
| |
| /* Method tables */ |
| record_table_t *rtable; |
| dbase_table_t *dtable; |
| |
| /* In-memory representation (cache) */ |
| cache_entry_t *cache; |
| cache_entry_t *cache_tail; |
| |
| unsigned int cache_sz; |
| int cache_serial; |
| int modified; |
| } dbase_llist_t; |
| |
| /* Helpers for internal use only */ |
| |
| static inline void dbase_llist_cache_init(dbase_llist_t * dbase) |
| { |
| |
| dbase->cache = NULL; |
| dbase->cache_tail = NULL; |
| dbase->cache_sz = 0; |
| dbase->cache_serial = -1; |
| dbase->modified = 0; |
| } |
| |
| static inline void dbase_llist_init(dbase_llist_t * dbase, |
| record_table_t * rtable, |
| dbase_table_t * dtable) |
| { |
| |
| dbase->rtable = rtable; |
| dbase->dtable = dtable; |
| dbase_llist_cache_init(dbase); |
| } |
| |
| extern int dbase_llist_cache_prepend(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_t * data); |
| |
| extern int dbase_llist_needs_resync(semanage_handle_t * handle, |
| dbase_llist_t * dbase); |
| |
| extern int dbase_llist_set_serial(semanage_handle_t * handle, |
| dbase_llist_t * dbase); |
| |
| static inline void dbase_llist_set_modified(dbase_llist_t * dbase, int status) |
| { |
| dbase->modified = status; |
| } |
| |
| /* LLIST - cache/transactions */ |
| extern void dbase_llist_drop_cache(dbase_llist_t * dbase); |
| |
| static inline int dbase_llist_is_modified(dbase_llist_t * dbase) |
| { |
| |
| return dbase->modified; |
| } |
| |
| /* LLIST - polymorphism */ |
| static inline record_table_t *dbase_llist_get_rtable(dbase_llist_t * dbase) |
| { |
| return dbase->rtable; |
| } |
| |
| /* LLIST - dbase API */ |
| extern int dbase_llist_exists(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_key_t * key, int *response); |
| |
| extern int dbase_llist_add(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_key_t * key, const record_t * data); |
| |
| extern int dbase_llist_set(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_key_t * key, const record_t * data); |
| |
| extern int dbase_llist_modify(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_key_t * key, const record_t * data); |
| |
| extern int dbase_llist_count(semanage_handle_t * handle, |
| dbase_llist_t * dbase, unsigned int *response); |
| |
| extern int dbase_llist_query(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| const record_key_t * key, record_t ** response); |
| |
| extern int dbase_llist_iterate(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| int (*fn) (const record_t * record, |
| void *fn_arg), void *arg); |
| |
| extern int dbase_llist_del(semanage_handle_t * handle, |
| dbase_llist_t * dbase, const record_key_t * key); |
| |
| extern int dbase_llist_clear(semanage_handle_t * handle, dbase_llist_t * dbase); |
| |
| extern int dbase_llist_list(semanage_handle_t * handle, |
| dbase_llist_t * dbase, |
| record_t *** records, unsigned int *count); |
| |
| #endif |