summaryrefslogtreecommitdiff
path: root/src/common/db.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/db.h')
-rw-r--r--src/common/db.h231
1 files changed, 105 insertions, 126 deletions
diff --git a/src/common/db.h b/src/common/db.h
index ec6539bc6..45034c141 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -23,8 +23,8 @@
* HISTORY: *
* 2.1 (Athena build #???#) - Portability fix *
* - Fixed the portability of casting to union and added the functions *
- * {@link DB#ensure(DB,DBKey,DBCreateData,...)} and *
- * {@link DB#clear(DB,DBApply,...)}. *
+ * {@link DBMap#ensure(DBMap,DBKey,DBCreateData,...)} and *
+ * {@link DBMap#clear(DBMap,DBApply,...)}. *
* 2.0 (Athena build 4859) - Transition version *
* - Almost everything recoded with a strategy similar to objects, *
* database structure is maintained. *
@@ -40,6 +40,7 @@
#ifndef _DB_H_
#define _DB_H_
+#include "../common/cbasetypes.h"
#include <stdarg.h>
/*****************************************************************************\
@@ -51,19 +52,19 @@
* DBOptions - Bitfield enumeration of database options. *
* DBKey - Union of used key types. *
* DBApply - Format of functions applyed to the databases. *
- * DBMatcher - Format of matchers used in DB::getall. *
+ * DBMatcher - Format of matchers used in DBMap::getall. *
* DBComparator - Format of the comparators used by the databases. *
* DBHasher - Format of the hashers used by the databases. *
* DBReleaser - Format of the releasers used by the databases. *
- * DB - Database interface. *
+ * DBMap - Database interface. *
\*****************************************************************************/
/**
* Define this to enable the functions that cast to unions.
* Required when the compiler doesn't support casting to unions.
* NOTE: It is recommened that the conditional tests to determine if this
- * should be defined be located in a makefile or a header file specific for
- * of compatibility and portability issues.
+ * should be defined be located in the configure script or a header file
+ * specific for compatibility and portability issues.
* @public
* @see #db_i2key(int)
* @see #db_ui2key(unsigned int)
@@ -120,7 +121,7 @@ typedef enum DBType {
* @param DB_OPT_RELEASE_KEY Releases the key.
* @param DB_OPT_RELEASE_DATA Releases the data whenever an entry is removed
* from the database.
- * WARNING: for funtions that return the data (like DB::remove),
+ * WARNING: for funtions that return the data (like DBMap::remove),
* a dangling pointer will be returned.
* @param DB_OPT_RELEASE_BOTH Releases both key and data.
* @param DB_OPT_ALLOW_NULL_KEY Allow NULL keys in the database.
@@ -130,7 +131,7 @@ typedef enum DBType {
* @see #db_default_release(DBType,DBOptions)
* @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
*/
-typedef enum db_opt {
+typedef enum DBOptions {
DB_OPT_BASE = 0,
DB_OPT_DUP_KEY = 1,
DB_OPT_RELEASE_KEY = 2,
@@ -147,11 +148,11 @@ typedef enum db_opt {
* @param str Type of key for DB_STRING and DB_ISTRING databases
* @public
* @see #DBType
- * @see DB#get
- * @see DB#put
- * @see DB#remove
+ * @see DBMap#get
+ * @see DBMap#put
+ * @see DBMap#remove
*/
-typedef union dbkey {
+typedef union DBKey {
int i;
unsigned int ui;
const char *str;
@@ -164,27 +165,27 @@ typedef union dbkey {
* @param args Extra arguments of the funtion
* @return Data identified by the key to be put in the database
* @public
- * @see DB#vensure
- * @see DB#ensure
+ * @see DBMap#vensure
+ * @see DBMap#ensure
*/
-typedef void *(*DBCreateData)(DBKey key, va_list args);
+typedef void* (*DBCreateData)(DBKey key, va_list args);
/**
* Format of functions to be applyed to an unspecified quantity of entries of
* a database.
- * Any function that applyes this function to the database will return the sum
+ * Any function that applies this function to the database will return the sum
* of values returned by this function.
* @param key Key of the database entry
* @param data Data of the database entry
* @param args Extra arguments of the funtion
* @return Value to be added up by the funtion that is applying this
* @public
- * @see DB#vforeach
- * @see DB#foreach
- * @see DB#vdestroy
- * @see DB#destroy
+ * @see DBMap#vforeach
+ * @see DBMap#foreach
+ * @see DBMap#vdestroy
+ * @see DBMap#destroy
*/
-typedef int (*DBApply)(DBKey key, void *data, va_list args);
+typedef int (*DBApply)(DBKey key, void* data, va_list args);
/**
* Format of functions that match database entries.
@@ -195,9 +196,9 @@ typedef int (*DBApply)(DBKey key, void *data, va_list args);
* @param args Extra arguments of the function
* @return 0 if a match, another number otherwise
* @public
- * @see DB#getall
+ * @see DBMap#getall
*/
-typedef int (*DBMatcher)(DBKey key, void *data, va_list args);
+typedef int (*DBMatcher)(DBKey key, void* data, va_list args);
/**
* Format of the comparators used internally by the database system.
@@ -241,58 +242,49 @@ typedef unsigned int (*DBHasher)(DBKey key, unsigned short maxlen);
* @see #db_default_releaser(DBType,DBOptions)
* @see #db_custom_release(DBRelease)
*/
-typedef void (*DBReleaser)(DBKey key, void *data, DBRelease which);
+typedef void (*DBReleaser)(DBKey key, void* data, DBRelease which);
+
+
+
+typedef struct DBMap DBMap;
+
+
/**
* Public interface of a database. Only contains funtions.
* All the functions take the interface as the first argument.
* @public
- * @see DB#get(DB,DBKey)
- * @see DB#getall(DB,void **,unsigned int,DBMatch,...)
- * @see DB#vgetall(DB,void **,unsigned int,DBMatch,va_list)
- * @see DB#put(DB,DBKey,void *)
- * @see DB#remove(DB,DBKey)
- * @see DB#foreach(DB,DBApply,...)
- * @see DB#vforeach(DB,DBApply,va_list)
- * @see DB#destroy(DB,DBApply,...)
- * @see DB#destroy(DB,DBApply,va_list)
- * @see DB#size(DB)
- * @see DB#type(DB)
- * @see DB#options(DB)
- * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ * @see #db_alloc(const char*,int,DBType,DBOptions,unsigned short)
*/
-typedef struct dbt *DB;
-struct dbt {
+struct DBMap {
/**
* Get the data of the entry identifid by the key.
- * @param dbi Interface of the database
+ * @param self Database
* @param key Key that identifies the entry
* @return Data of the entry or NULL if not found
* @protected
- * @see #db_get(DB,DBKey)
*/
- void *(*get)(DB self, DBKey key);
+ void* (*get)(DBMap* self, DBKey key);
/**
- * Just calls {@link DB#vgetall(DB,void **,unsigned int,DBMatch,va_list)}.
+ * Just calls {@link DBMap#vgetall}.
* Get the data of the entries matched by <code>match</code>.
* It puts a maximum of <code>max</code> entries into <code>buf</code>.
* If <code>buf</code> is NULL, it only counts the matches.
* Returns the number of entries that matched.
* NOTE: if the value returned is greater than <code>max</code>, only the
* first <code>max</code> entries found are put into the buffer.
- * @param dbi Interface of the database
+ * @param self Database
* @param buf Buffer to put the data of the matched entries
* @param max Maximum number of data entries to be put into buf
* @param match Function that matches the database entries
* @param ... Extra arguments for match
* @return The number of entries that matched
* @protected
- * @see DB#vgetall
- * @see #db_getall(DB,void **,unsigned int,DBMatch,...)
+ * @see DBMap#vgetall(DBMap*,void **,unsigned int,DBMatcher,va_list)
*/
- unsigned int (*getall)(DB self, void **buf, unsigned int max, DBMatcher match, ...);
+ unsigned int (*getall)(DBMap* self, void** buf, unsigned int max, DBMatcher match, ...);
/**
* Get the data of the entries matched by <code>match</code>.
@@ -301,149 +293,139 @@ struct dbt {
* Returns the number of entries that matched.
* NOTE: if the value returned is greater than <code>max</code>, only the
* first <code>max</code> entries found are put into the buffer.
- * @param dbi Interface of the database
+ * @param self Database
* @param buf Buffer to put the data of the matched entries
* @param max Maximum number of data entries to be put into buf
* @param match Function that matches the database entries
* @param ... Extra arguments for match
* @return The number of entries that matched
* @protected
- * @see DB#getall
- * @see #db_vgetall(DB,void **,unsigned int,DBMatch,va_list)
+ * @see DBMap#getall(DBMap*,void **,unsigned int,DBMatcher,...)
*/
- unsigned int (*vgetall)(DB self, void **buf, unsigned int max, DBMatcher match, va_list args);
+ unsigned int (*vgetall)(DBMap* self, void** buf, unsigned int max, DBMatcher match, va_list args);
/**
- * Just calls {@link common\db.h\DB#vensure(DB,DBKey,DBCreateData,va_list)}.
+ * Just calls {@link DBMap#vensure}.
* Get the data of the entry identified by the key.
* If the entry does not exist, an entry is added with the data returned by
* <code>create</code>.
- * @param dbi Interface of the database
+ * @param self Database
* @param key Key that identifies the entry
* @param create Function used to create the data if the entry doesn't exist
* @param ... Extra arguments for create
* @return Data of the entry
* @protected
- * @see DB#vensure(DB,DBKey,DBCreateData,va_list)
- * @see #db_ensure(DB,DBKey,DBCreateData,...)
+ * @see DBMap#vensure(DBMap*,DBKey,DBCreateData,va_list)
*/
- void *(*ensure)(DB self, DBKey key, DBCreateData create, ...);
+ void* (*ensure)(DBMap* self, DBKey key, DBCreateData create, ...);
/**
* Get the data of the entry identified by the key.
* If the entry does not exist, an entry is added with the data returned by
* <code>create</code>.
- * @param dbi Interface of the database
+ * @param self Database
* @param key Key that identifies the entry
* @param create Function used to create the data if the entry doesn't exist
* @param args Extra arguments for create
* @return Data of the entry
* @protected
- * @see DB#ensure(DB,DBKey,DBCreateData,...)
- * @see #db_vensure(DB,DBKey,DBCreateData,va_list)
+ * @see DBMap#ensure(DBMap*,DBKey,DBCreateData,...)
*/
- void *(*vensure)(DB self, DBKey key, DBCreateData create, va_list args);
+ void* (*vensure)(DBMap* self, DBKey key, DBCreateData create, va_list args);
/**
* Put the data identified by the key in the database.
* Returns the previous data if the entry exists or NULL.
* NOTE: Uses the new key, the old one is released.
- * @param dbi Interface of the database
+ * @param self Database
* @param key Key that identifies the data
* @param data Data to be put in the database
* @return The previous data if the entry exists or NULL
* @protected
- * @see #db_put(DB,DBKey,void *)
*/
- void *(*put)(DB self, DBKey key, void *data);
+ void* (*put)(DBMap* self, DBKey key, void* data);
/**
* Remove an entry from the database.
* Returns the data of the entry.
* NOTE: The key (of the database) is released.
- * @param dbi Interface of the database
+ * @param self Database
* @param key Key that identifies the entry
* @return The data of the entry or NULL if not found
* @protected
- * @see #db_remove(DB,DBKey)
*/
- void *(*remove)(DB self, DBKey key);
+ void* (*remove)(DBMap* self, DBKey key);
/**
- * Just calls {@link DB#vforeach(DB,DBApply,va_list)}.
+ * Just calls {@link DBMap#vforeach}.
* Apply <code>func</code> to every entry in the database.
* Returns the sum of values returned by func.
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed
* @param ... Extra arguments for func
* @return Sum of the values returned by func
* @protected
- * @see DB#vforeach
- * @see #db_foreach(DB,DBApply,...)
+ * @see DBMap#vforeach(DBMap*,DBApply,va_list)
*/
- int (*foreach)(DB self, DBApply func, ...);
+ int (*foreach)(DBMap* self, DBApply func, ...);
/**
* Apply <code>func</code> to every entry in the database.
* Returns the sum of values returned by func.
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed
* @param args Extra arguments for func
* @return Sum of the values returned by func
* @protected
- * @see DB#foreach
- * @see #db_vforeach(DB,DBApply,va_list)
+ * @see DBMap#foreach(DBMap*,DBApply,...)
*/
- int (*vforeach)(DB self, DBApply func, va_list args);
+ int (*vforeach)(DBMap* self, DBApply func, va_list args);
/**
- * Just calls {@link DB#vclear(DB,DBApply,va_list)}.
+ * Just calls {@link DBMap#vclear}.
* Removes all entries from the database.
* Before deleting an entry, func is applyed to it.
* Releases the key and the data.
* Returns the sum of values returned by func, if it exists.
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed to every entry before deleting
* @param ... Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB#vclear
- * @see #db_clear(DB,DBApply,...)
+ * @see DBMap#vclear(DBMap*,DBApply,va_list)
*/
- int (*clear)(DB self, DBApply func, ...);
+ int (*clear)(DBMap* self, DBApply func, ...);
/**
* Removes all entries from the database.
* Before deleting an entry, func is applyed to it.
* Releases the key and the data.
* Returns the sum of values returned by func, if it exists.
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed to every entry before deleting
* @param args Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB#clear
- * @see #vclear(DB,DBApply,va_list)
+ * @see DBMap#clear(DBMap*,DBApply,...)
*/
- int (*vclear)(DB self, DBApply func, va_list args);
+ int (*vclear)(DBMap* self, DBApply func, va_list args);
/**
- * Just calls {@link DB#vdestroy(DB,DBApply,va_list)}.
+ * Just calls {@link DBMap#vdestroy}.
* Finalize the database, feeing all the memory it uses.
* Before deleting an entry, func is applyed to it.
* Releases the key and the data.
* Returns the sum of values returned by func, if it exists.
* NOTE: This locks the database globally. Any attempt to insert or remove
* a database entry will give an error and be aborted (except for clearing).
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed to every entry before deleting
* @param ... Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB#vdestroy
- * @see #db_destroy(DB,DBApply,...)
+ * @see DBMap#vdestroy(DBMap*,DBApply,va_list)
*/
- int (*destroy)(DB self, DBApply func, ...);
+ int (*destroy)(DBMap* self, DBApply func, ...);
/**
* Finalize the database, feeing all the memory it uses.
@@ -451,42 +433,38 @@ struct dbt {
* Returns the sum of values returned by func, if it exists.
* NOTE: This locks the database globally. Any attempt to insert or remove
* a database entry will give an error and be aborted (except for clearing).
- * @param dbi Interface of the database
+ * @param self Database
* @param func Function to be applyed to every entry before deleting
* @param args Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB#destroy
- * @see #db_vdestroy(DB,DBApply,va_list)
+ * @see DBMap#destroy(DBMap*,DBApply,...)
*/
- int (*vdestroy)(DB self, DBApply func, va_list args);
+ int (*vdestroy)(DBMap* self, DBApply func, va_list args);
/**
* Return the size of the database (number of items in the database).
- * @param dbi Interface of the database
+ * @param self Database
* @return Size of the database
* @protected
- * @see #db_size(DB)
*/
- unsigned int (*size)(DB self);
+ unsigned int (*size)(DBMap* self);
/**
* Return the type of the database.
- * @param dbi Interface of the database
+ * @param self Database
* @return Type of the database
* @protected
- * @see #db_type(DB)
*/
- DBType (*type)(DB self);
+ DBType (*type)(DBMap* self);
/**
* Return the options of the database.
- * @param dbi Interface of the database
+ * @param self Database
* @return Options of the database
* @protected
- * @see #db_options(DB)
*/
- DBOptions (*options)(DB self);
+ DBOptions (*options)(DBMap* self);
};
@@ -501,27 +479,34 @@ struct dbt {
# define str2key(k) ((DBKey)(const char *)(k))
#endif /* not DB_MANUAL_CAST_TO_UNION */
-#define db_get(db,k) (db)->get((db),(k))
-#define idb_get(db,k) (db)->get((db),i2key(k))
-#define uidb_get(db,k) (db)->get((db),ui2key(k))
-#define strdb_get(db,k) (db)->get((db),str2key(k))
+#define db_get(db,k) ( (db)->get((db),(k)) )
+#define idb_get(db,k) ( (db)->get((db),i2key(k)) )
+#define uidb_get(db,k) ( (db)->get((db),ui2key(k)) )
+#define strdb_get(db,k) ( (db)->get((db),str2key(k)) )
-#define db_put(db,k,d) (db)->put((db),(k),(d))
-#define idb_put(db,k,d) (db)->put((db),i2key(k),(d))
-#define uidb_put(db,k,d) (db)->put((db),ui2key(k),(d))
-#define strdb_put(db,k,d) (db)->put((db),str2key(k),(d))
+#define db_put(db,k,d) ( (db)->put((db),(k),(d)) )
+#define idb_put(db,k,d) ( (db)->put((db),i2key(k),(d)) )
+#define uidb_put(db,k,d) ( (db)->put((db),ui2key(k),(d)) )
+#define strdb_put(db,k,d) ( (db)->put((db),str2key(k),(d)) )
-#define db_remove(db,k) (db)->remove((db),(k))
-#define idb_remove(db,k) (db)->remove((db),i2key(k))
-#define uidb_remove(db,k) (db)->remove((db),ui2key(k))
-#define strdb_remove(db,k) (db)->remove((db),str2key(k))
+#define db_remove(db,k) ( (db)->remove((db),(k)) )
+#define idb_remove(db,k) ( (db)->remove((db),i2key(k)) )
+#define uidb_remove(db,k) ( (db)->remove((db),ui2key(k)) )
+#define strdb_remove(db,k) ( (db)->remove((db),str2key(k)) )
//These are discarding the possible vargs you could send to the function, so those
//that require vargs must not use these defines.
-#define db_ensure(db,k,f) (db)->ensure((db),(k),f)
-#define idb_ensure(db,k,f) (db)->ensure((db),i2key(k),f)
-#define uidb_ensure(db,k,f) (db)->ensure((db),ui2key(k),f)
-#define strdb_ensure(db,k,f) (db)->ensure((db),str2key(k),f)
+#define db_ensure(db,k,f) ( (db)->ensure((db),(k),(f)) )
+#define idb_ensure(db,k,f) ( (db)->ensure((db),i2key(k),(f)) )
+#define uidb_ensure(db,k,f) ( (db)->ensure((db),ui2key(k),(f)) )
+#define strdb_ensure(db,k,f) ( (db)->ensure((db),str2key(k),(f)) )
+
+// Database creation and destruction macros
+#define idb_alloc(opt) db_alloc(__FILE__,__LINE__,DB_INT,(opt),sizeof(int))
+#define uidb_alloc(opt) db_alloc(__FILE__,__LINE__,DB_UINT,(opt),sizeof(unsigned int))
+#define strdb_alloc(opt,maxlen) db_alloc(__FILE__,__LINE__,DB_STRING,(opt),(maxlen))
+#define stridb_alloc(opt,maxlen) db_alloc(__FILE__,__LINE__,DB_ISTRING,(opt),(maxlen))
+#define db_destroy(db) ( (db)->destroy((db),NULL) )
/*****************************************************************************\
* (2) Section with public functions. *
@@ -550,7 +535,6 @@ struct dbt {
* @see #DBType
* @see #DBOptions
* @see #db_default_release(DBType,DBOptions)
- * @see common\db.c#db_fix_options(DBType,DBOptions)
*/
DBOptions db_fix_options(DBType type, DBOptions options);
@@ -561,7 +545,6 @@ DBOptions db_fix_options(DBType type, DBOptions options);
* @public
* @see #DBType
* @see #DBComparator
- * @see common\db.c#db_default_cmp(DBType)
*/
DBComparator db_default_cmp(DBType type);
@@ -572,7 +555,6 @@ DBComparator db_default_cmp(DBType type);
* @public
* @see #DBType
* @see #DBHasher
- * @see common\db.c#db_default_hash(DBType)
*/
DBHasher db_default_hash(DBType type);
@@ -590,7 +572,6 @@ DBHasher db_default_hash(DBType type);
* @see #DBReleaser
* @see #db_fix_options(DBType,DBOptions)
* @see #db_custom_release(DBRelease)
- * @see common\db.c#db_default_release(DBType,DBOptions)
*/
DBReleaser db_default_release(DBType type, DBOptions options);
@@ -602,7 +583,6 @@ DBReleaser db_default_release(DBType type, DBOptions options);
* @see #DBRelease
* @see #DBReleaser
* @see #db_default_release(DBType,DBOptions)
- * @see common\db.c#db_custom_release(DBRelease)
*/
DBReleaser db_custom_release(DBRelease which);
@@ -621,14 +601,13 @@ DBReleaser db_custom_release(DBRelease which);
* @return The interface of the database
* @public
* @see #DBType
- * @see #DB
+ * @see #DBMap
* @see #db_default_cmp(DBType)
* @see #db_default_hash(DBType)
* @see #db_default_release(DBType,DBOptions)
* @see #db_fix_options(DBType,DBOptions)
- * @see common\db.c#db_alloc(const char *,int,DBType,DBOptions,unsigned short)
*/
-DB db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen);
+DBMap* db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen);
#ifdef DB_MANUAL_CAST_TO_UNION
/**