1/* Copyright (C) 2005 Red Hat, Inc. */ 2 3#ifndef _SEMANAGE_DATABASE_LLIST_INTERNAL_H_ 4#define _SEMANAGE_DATABASE_LLIST_INTERNAL_H_ 5 6#include "database.h" 7#include "handle.h" 8 9/* Representation of the database once loaded in memory */ 10typedef struct cache_entry { 11 record_t *data; 12 struct cache_entry *prev; 13 struct cache_entry *next; 14} cache_entry_t; 15 16/* LLIST dbase */ 17typedef struct dbase_llist { 18 19 /* Method tables */ 20 record_table_t *rtable; 21 dbase_table_t *dtable; 22 23 /* In-memory representation (cache) */ 24 cache_entry_t *cache; 25 cache_entry_t *cache_tail; 26 27 unsigned int cache_sz; 28 int cache_serial; 29 int modified; 30} dbase_llist_t; 31 32/* Helpers for internal use only */ 33 34static inline void dbase_llist_cache_init(dbase_llist_t * dbase) 35{ 36 37 dbase->cache = NULL; 38 dbase->cache_tail = NULL; 39 dbase->cache_sz = 0; 40 dbase->cache_serial = -1; 41 dbase->modified = 0; 42} 43 44static inline void dbase_llist_init(dbase_llist_t * dbase, 45 record_table_t * rtable, 46 dbase_table_t * dtable) 47{ 48 49 dbase->rtable = rtable; 50 dbase->dtable = dtable; 51 dbase_llist_cache_init(dbase); 52} 53 54extern int dbase_llist_cache_prepend(semanage_handle_t * handle, 55 dbase_llist_t * dbase, 56 const record_t * data); 57 58extern int dbase_llist_needs_resync(semanage_handle_t * handle, 59 dbase_llist_t * dbase); 60 61extern int dbase_llist_set_serial(semanage_handle_t * handle, 62 dbase_llist_t * dbase); 63 64static inline void dbase_llist_set_modified(dbase_llist_t * dbase, int status) 65{ 66 dbase->modified = status; 67} 68 69/* LLIST - cache/transactions */ 70extern void dbase_llist_drop_cache(dbase_llist_t * dbase); 71 72static inline int dbase_llist_is_modified(dbase_llist_t * dbase) 73{ 74 75 return dbase->modified; 76} 77 78/* LLIST - polymorphism */ 79static inline record_table_t *dbase_llist_get_rtable(dbase_llist_t * dbase) 80{ 81 return dbase->rtable; 82} 83 84/* LLIST - dbase API */ 85extern int dbase_llist_exists(semanage_handle_t * handle, 86 dbase_llist_t * dbase, 87 const record_key_t * key, int *response); 88 89extern int dbase_llist_add(semanage_handle_t * handle, 90 dbase_llist_t * dbase, 91 const record_key_t * key, const record_t * data); 92 93extern int dbase_llist_set(semanage_handle_t * handle, 94 dbase_llist_t * dbase, 95 const record_key_t * key, const record_t * data); 96 97extern int dbase_llist_modify(semanage_handle_t * handle, 98 dbase_llist_t * dbase, 99 const record_key_t * key, const record_t * data); 100 101extern int dbase_llist_count(semanage_handle_t * handle, 102 dbase_llist_t * dbase, unsigned int *response); 103 104extern int dbase_llist_query(semanage_handle_t * handle, 105 dbase_llist_t * dbase, 106 const record_key_t * key, record_t ** response); 107 108extern int dbase_llist_iterate(semanage_handle_t * handle, 109 dbase_llist_t * dbase, 110 int (*fn) (const record_t * record, 111 void *fn_arg), void *arg); 112 113extern int dbase_llist_del(semanage_handle_t * handle, 114 dbase_llist_t * dbase, const record_key_t * key); 115 116extern int dbase_llist_clear(semanage_handle_t * handle, dbase_llist_t * dbase); 117 118extern int dbase_llist_list(semanage_handle_t * handle, 119 dbase_llist_t * dbase, 120 record_t *** records, unsigned int *count); 121 122#endif 123