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