/* 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