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 */
10 typedef 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 */
17 typedef 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
dbase_llist_cache_init(dbase_llist_t * dbase)34 static 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
dbase_llist_init(dbase_llist_t * dbase,record_table_t * rtable,dbase_table_t * dtable)44 static 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
54 extern int dbase_llist_cache_prepend(semanage_handle_t * handle,
55 dbase_llist_t * dbase,
56 const record_t * data);
57
58 extern int dbase_llist_needs_resync(semanage_handle_t * handle,
59 dbase_llist_t * dbase);
60
61 extern int dbase_llist_set_serial(semanage_handle_t * handle,
62 dbase_llist_t * dbase);
63
dbase_llist_set_modified(dbase_llist_t * dbase,int status)64 static inline void dbase_llist_set_modified(dbase_llist_t * dbase, int status)
65 {
66 dbase->modified = status;
67 }
68
69 /* LLIST - cache/transactions */
70 extern void dbase_llist_drop_cache(dbase_llist_t * dbase);
71
dbase_llist_is_modified(dbase_llist_t * dbase)72 static inline int dbase_llist_is_modified(dbase_llist_t * dbase)
73 {
74
75 return dbase->modified;
76 }
77
78 /* LLIST - polymorphism */
dbase_llist_get_rtable(dbase_llist_t * dbase)79 static inline record_table_t *dbase_llist_get_rtable(dbase_llist_t * dbase)
80 {
81 return dbase->rtable;
82 }
83
84 /* LLIST - dbase API */
85 extern int dbase_llist_exists(semanage_handle_t * handle,
86 dbase_llist_t * dbase,
87 const record_key_t * key, int *response);
88
89 extern int dbase_llist_add(semanage_handle_t * handle,
90 dbase_llist_t * dbase,
91 const record_key_t * key, const record_t * data);
92
93 extern int dbase_llist_set(semanage_handle_t * handle,
94 dbase_llist_t * dbase,
95 const record_key_t * key, const record_t * data);
96
97 extern int dbase_llist_modify(semanage_handle_t * handle,
98 dbase_llist_t * dbase,
99 const record_key_t * key, const record_t * data);
100
101 extern int dbase_llist_count(semanage_handle_t * handle,
102 dbase_llist_t * dbase, unsigned int *response);
103
104 extern int dbase_llist_query(semanage_handle_t * handle,
105 dbase_llist_t * dbase,
106 const record_key_t * key, record_t ** response);
107
108 extern 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
113 extern int dbase_llist_del(semanage_handle_t * handle,
114 dbase_llist_t * dbase, const record_key_t * key);
115
116 extern int dbase_llist_clear(semanage_handle_t * handle, dbase_llist_t * dbase);
117
118 extern int dbase_llist_list(semanage_handle_t * handle,
119 dbase_llist_t * dbase,
120 record_t *** records, unsigned int *count);
121
122 #endif
123