113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Copyright (C) 2005 Red Hat, Inc. */
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef _SEMANAGE_DATABASE_H_
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define _SEMANAGE_DATABASE_H_
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef DBASE_RECORD_DEFINED
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *record_t;
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *record_key_t;
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define DBASE_RECORD_DEFINED
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef DBASE_DEFINED
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *dbase_t;
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define DBASE_DEFINED
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Circular dependency */
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_handle;
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* RECORD interface - method table */
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct record_table {
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Create a record */
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*create) (struct semanage_handle * handle, record_t ** rec);
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Extract key from record */
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*key_extract) (struct semanage_handle * handle,
2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			    const record_t * rec, record_key_t ** key);
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Free record key */
3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	void (*key_free) (record_key_t * key);
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Return 0 if the record matches the key,
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * -1 if the key represents a record that should
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * be ordered before this record, and 1 if vice-versa */
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*compare) (const record_t * rec, const record_key_t * key);
3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Return 0 if the record matches record2,
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * -1 if record2 should be ordered before this record,
4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * and 1 if vice-versa */
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*compare2) (const record_t * rec, const record_t * rec2);
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Same as above, but dereferences the pointer first.
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * This function is intenteded to be used as a qsort
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * comparator. */
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*compare2_qsort) (const record_t ** rec, const record_t ** rec2);
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Deep-copy clone of this record */
4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*clone) (struct semanage_handle * handle,
5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      const record_t * rec, record_t ** new_rec);
5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Deallocate record resources. Must sucessfully handle NULL. */
5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	void (*free) (record_t * rec);
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} record_table_t;
5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* DBASE interface - method table */
5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct dbase_table {
5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* --------------- Database Functionality ----------- */
6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Note: In all the functions below, the key is property
6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * of the caller, and will not be modified by the database.
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * In add/set/modify, the data is also property of the caller */
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Add the specified record to
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * the database. No check for duplicates is performed */
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*add) (struct semanage_handle * handle,
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    dbase_t * dbase,
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    const record_key_t * key, const record_t * data);
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Add the specified record to the
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * database if it not present.
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * If it's present, replace it
7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 */
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*modify) (struct semanage_handle * handle,
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       dbase_t * dbase,
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       const record_key_t * key, const record_t * data);
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Modify the specified record in the database
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * if it is present. Fail if it does not yet exist
8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 */
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*set) (struct semanage_handle * handle,
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    dbase_t * dbase,
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    const record_key_t * key, const record_t * data);
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Delete a record */
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*del) (struct semanage_handle * handle,
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    dbase_t * dbase, const record_key_t * key);
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Clear all records, and leave the database in
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * cached, modified state. This function does
9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * not require a call to cache() */
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*clear) (struct semanage_handle * handle, dbase_t * dbase);
9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Retrieve a record
9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 *
9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * Note: the resultant record
9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * becomes property of the caller, and
10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * must be freed accordingly */
10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*query) (struct semanage_handle * handle,
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      dbase_t * dbase,
10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      const record_key_t * key, record_t ** response);
10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Check if a record exists */
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*exists) (struct semanage_handle * handle,
10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       dbase_t * dbase,
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       const record_key_t * key, int *response);
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Count the number of records */
11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*count) (struct semanage_handle * handle,
11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      dbase_t * dbase, unsigned int *response);
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Execute the specified handler over
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * the records of this database. The handler
11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * can signal a successful exit by returning 1,
11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * an error exit by returning -1, and continue by
11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * returning 0
12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 *
12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * Note: The record passed into the iterate handler
12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * may or may not persist after the handler invocation,
12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * and writing to it has unspecified behavior. It *must*
12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * be cloned if modified, or preserved.
12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 *
12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * Note: The iterate handler may not invoke any other
12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * semanage read functions outside a transaction. It is only
12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * reentrant while in transaction. The iterate handler may
12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * not modify the underlying database.
13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 */
13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*iterate) (struct semanage_handle * handle,
13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			dbase_t * dbase,
13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			int (*fn) (const record_t * record,
13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				   void *varg), void *fn_arg);
13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Construct a list of all records in this database
13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 *
13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * Note: The list returned becomes property of the caller,
13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * and must be freed accordingly.
14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 */
14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*list) (struct semanage_handle * handle,
14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     dbase_t * dbase,
14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     record_t *** records, unsigned int *count);
14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* ---------- Cache/Transaction Management ---------- */
14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Cache the database (if supported).
14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * This function must be invoked before using
14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * any of the database functions above. It may be invoked
15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * multiple times, and will update the cache if a commit
15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * occured between invocations */
15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*cache) (struct semanage_handle * handle, dbase_t * dbase);
15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Forgets all changes that haven't been written
15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * to the database backend */
15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	void (*drop_cache) (dbase_t * dbase);
15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Checks if there are any changes not written to the backend */
15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*is_modified) (dbase_t * dbase);
16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Writes the database changes to its backend */
16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int (*flush) (struct semanage_handle * handle, dbase_t * dbase);
16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* ------------- Polymorphism ----------------------- */
16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Retrieves the record table for this database,
16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * which specifies how to perform basic operations
16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	 * on each record. */
16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	record_table_t *(*get_rtable) (dbase_t * dbase);
17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} dbase_table_t;
17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct dbase_config {
17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Database state */
17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	dbase_t *dbase;
17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Database methods */
17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	dbase_table_t *dtable;
18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} dbase_config_t;
18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_add(struct semanage_handle *handle,
18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     dbase_config_t * dconfig,
18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     const record_key_t * key, const record_t * data);
18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_modify(struct semanage_handle *handle,
18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			dbase_config_t * dconfig,
18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			const record_key_t * key, const record_t * data);
19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_set(struct semanage_handle *handle,
19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     dbase_config_t * dconfig,
19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     const record_key_t * key, const record_t * data);
19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_del(struct semanage_handle *handle,
19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		     dbase_config_t * dconfig, const record_key_t * key);
19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_query(struct semanage_handle *handle,
19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       dbase_config_t * dconfig,
20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       const record_key_t * key, record_t ** response);
20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_exists(struct semanage_handle *handle,
20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			dbase_config_t * dconfig,
20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			const record_key_t * key, int *response);
20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_count(struct semanage_handle *handle,
20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		       dbase_config_t * dconfig, unsigned int *response);
20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_iterate(struct semanage_handle *handle,
21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			 dbase_config_t * dconfig,
21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			 int (*fn) (const record_t * record,
21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				    void *fn_arg), void *fn_arg);
21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_list(struct semanage_handle *handle,
21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      dbase_config_t * dconfig,
21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		      record_t *** records, unsigned int *count);
21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif
219