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