summaryrefslogtreecommitdiff
path: root/src/common/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/db.c')
-rw-r--r--src/common/db.c457
1 files changed, 173 insertions, 284 deletions
diff --git a/src/common/db.c b/src/common/db.c
index 476c5a0c9..27aa6776a 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -82,7 +82,7 @@
* DBNColor - Enumeration of colors of the nodes. *
* DBNode - Structure of a node in RED-BLACK trees. *
* struct db_free - Structure that holds a deleted node to be freed. *
- * DB_impl - Struture of the database. *
+ * DBMap_impl - Struture of the database. *
* stats - Statistics about the database system. *
\*****************************************************************************/
@@ -101,7 +101,7 @@
/**
* Size of the hashtable in the database.
* @private
- * @see DB_impl#ht
+ * @see DBMap_impl#ht
*/
#define HASH_SIZE (256+27)
@@ -115,7 +115,7 @@
* @param deleted If the node is deleted
* @param color Color of the node
* @private
- * @see DB_impl#ht
+ * @see DBMap_impl#ht
*/
typedef struct dbn {
// Tree structure
@@ -135,7 +135,7 @@ typedef struct dbn {
* @param node Deleted node
* @param root Address to the root of the tree
* @private
- * @see DB_impl#free_list
+ * @see DBMap_impl#free_list
*/
struct db_free {
DBNode node;
@@ -144,7 +144,7 @@ struct db_free {
/**
* Complete database structure.
- * @param dbi Interface of the database
+ * @param vtable Interface of the database
* @param alloc_file File where the database was allocated
* @param alloc_line Line in the file where the database was allocated
* @param free_list Array of deleted nodes to be freed
@@ -162,11 +162,11 @@ struct db_free {
* @param maxlen Maximum length of strings in DB_STRING and DB_ISTRING databases
* @param global_lock Global lock of the database
* @private
- * @see #db_alloc(const char *,int,DBOptions,DBType,...)
+ * @see #db_alloc(const char*,int,DBType,DBOptions,unsigned short)
*/
-typedef struct db {
+typedef struct DBMap_impl {
// Database interface
- struct dbt vtable;
+ struct DBMap vtable;
// File and line of allocation
const char *alloc_file;
int alloc_line;
@@ -187,9 +187,9 @@ typedef struct db {
uint32 item_count;
unsigned short maxlen;
unsigned global_lock : 1;
-} *DB_impl;
+} DBMap_impl;
-#ifdef DB_ENABLE_STATS
+#if defined(DB_ENABLE_STATS)
/**
* Structure with what is counted when the database estatistics are enabled.
* @private
@@ -268,8 +268,10 @@ static struct db_stats {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
-#define COUNT(func) if (stats. ## func != UINT32_MAX) ++stats. ## func
-#endif /* DB_ENABLE_STATS */
+#define DB_COUNTSTAT(token) if (stats. ## token != UINT32_MAX) ++stats. ## token
+#else /* !defined(DB_ENABLE_STATS) */
+#define DB_COUNTSTAT(token)
+#endif /* !defined(DB_ENABLE_STATS) */
/*****************************************************************************\
* (2) Section of private functions used by the database system. *
@@ -300,9 +302,7 @@ static void db_rotate_left(DBNode node, DBNode *root)
{
DBNode y = node->right;
-#ifdef DB_ENABLE_STATS
- COUNT(db_rotate_left);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_rotate_left);
// put the left of y at the right of node
node->right = y->left;
if (y->left)
@@ -333,9 +333,7 @@ static void db_rotate_right(DBNode node, DBNode *root)
{
DBNode y = node->left;
-#ifdef DB_ENABLE_STATS
- COUNT(db_rotate_right);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_rotate_right);
// put the right of y at the left of node
node->left = y->right;
if (y->right != 0)
@@ -362,15 +360,13 @@ static void db_rotate_right(DBNode node, DBNode *root)
* @private
* @see #db_rotate_left(DBNode,DBNode *)
* @see #db_rotate_right(DBNode,DBNode *)
- * @see #db_put(DB,DBKey,void *)
+ * @see #db_obj_put(DBMap*,DBKey,void *)
*/
static void db_rebalance(DBNode node, DBNode *root)
{
DBNode y;
-#ifdef DB_ENABLE_STATS
- COUNT(db_rebalance);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_rebalance);
// Restore the RED-BLACK properties
node->color = RED;
while (node != *root && node->parent->color == RED) {
@@ -426,7 +422,7 @@ static void db_rebalance(DBNode node, DBNode *root)
* @private
* @see #db_rotate_left(DBNode,DBNode *)
* @see #db_rotate_right(DBNode,DBNode *)
- * @see #db_free_unlock(DB_impl)
+ * @see #db_free_unlock(DBMap_impl*)
*/
static void db_rebalance_erase(DBNode node, DBNode *root)
{
@@ -435,9 +431,7 @@ static void db_rebalance_erase(DBNode node, DBNode *root)
DBNode x_parent = NULL;
DBNode w;
-#ifdef DB_ENABLE_STATS
- COUNT(db_rebalance_erase);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_rebalance_erase);
// Select where to change the tree
if (y->left == NULL) { // no left
x = y->right;
@@ -567,15 +561,13 @@ static void db_rebalance_erase(DBNode node, DBNode *root)
* @param key Key being tested
* @return not 0 if considered NULL, 0 otherwise
* @private
- * @see #db_get(DB,DBKey)
- * @see #db_put(DB,DBKey,void *)
- * @see #db_remove(DB,DBKey)
+ * @see #db_obj_get(DBMap*,DBKey)
+ * @see #db_obj_put(DBMap*,DBKey,void *)
+ * @see #db_obj_remove(DBMap*,DBKey)
*/
static int db_is_key_null(DBType type, DBKey key)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_is_key_null);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_is_key_null);
switch (type) {
case DB_STRING:
case DB_ISTRING:
@@ -592,18 +584,16 @@ static int db_is_key_null(DBType type, DBKey key)
* @param key Key to be duplicated
* @param Duplicated key
* @private
- * @see #db_free_add(DB_impl,DBNode,DBNode *)
- * @see #db_free_remove(DB_impl,DBNode)
- * @see #db_put(DB,DBKey,void *)
- * @see #db_dup_key_free(DB_impl,DBKey)
+ * @see #db_free_add(DBMap_impl*,DBNode,DBNode *)
+ * @see #db_free_remove(DBMap_impl*,DBNode)
+ * @see #db_obj_put(DBMap*,DBKey,void *)
+ * @see #db_dup_key_free(DBMap_impl*,DBKey)
*/
-static DBKey db_dup_key(DB_impl db, DBKey key)
+static DBKey db_dup_key(DBMap_impl* db, DBKey key)
{
char *str;
-#ifdef DB_ENABLE_STATS
- COUNT(db_dup_key);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_dup_key);
switch (db->type) {
case DB_STRING:
case DB_ISTRING:
@@ -627,13 +617,11 @@ static DBKey db_dup_key(DB_impl db, DBKey key)
* @param db Database the key is being used in
* @param key Key to be freed
* @private
- * @see #db_dup_key(DB_impl,DBKey)
+ * @see #db_dup_key(DBMap_impl*,DBKey)
*/
-static void db_dup_key_free(DB_impl db, DBKey key)
+static void db_dup_key_free(DBMap_impl* db, DBKey key)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_dup_key_free);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_dup_key_free);
switch (db->type) {
case DB_STRING:
case DB_ISTRING:
@@ -654,19 +642,17 @@ static void db_dup_key_free(DB_impl db, DBKey key)
* @param node Target node
* @private
* @see #struct db_free
- * @see DB_impl#free_list
- * @see DB_impl#free_count
- * @see DB_impl#free_max
- * @see #db_remove(DB,DBKey)
- * @see #db_free_remove(DB_impl,DBNode)
+ * @see DBMap_impl#free_list
+ * @see DBMap_impl#free_count
+ * @see DBMap_impl#free_max
+ * @see #db_obj_remove(DBMap*,DBKey)
+ * @see #db_free_remove(DBMap_impl*,DBNode)
*/
-static void db_free_add(DB_impl db, DBNode node, DBNode *root)
+static void db_free_add(DBMap_impl* db, DBNode node, DBNode *root)
{
DBKey old_key;
-#ifdef DB_ENABLE_STATS
- COUNT(db_free_add);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_free_add);
if (db->free_lock == (unsigned int)~0) {
ShowFatalError("db_free_add: free_lock overflow\n"
"Database allocated at %s:%d\n",
@@ -706,18 +692,16 @@ static void db_free_add(DB_impl db, DBNode node, DBNode *root)
* @param node Node being removed from free_list
* @private
* @see #struct db_free
- * @see DB_impl#free_list
- * @see DB_impl#free_count
- * @see #db_put(DB,DBKey,void *)
- * @see #db_free_add(DB_impl,DBNode *,DBNode)
+ * @see DBMap_impl#free_list
+ * @see DBMap_impl#free_count
+ * @see #db_obj_put(DBMap*,DBKey,void*)
+ * @see #db_free_add(DBMap_impl*,DBNode*,DBNode)
*/
-static void db_free_remove(DB_impl db, DBNode node)
+static void db_free_remove(DBMap_impl* db, DBNode node)
{
unsigned int i;
-#ifdef DB_ENABLE_STATS
- COUNT(db_free_remove);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_free_remove);
for (i = 0; i < db->free_count; i++) {
if (db->free_list[i].node == node) {
if (i < db->free_count -1) // copy the last item to where the removed one was
@@ -739,14 +723,12 @@ static void db_free_remove(DB_impl db, DBNode node)
* Increment the free_lock of the database.
* @param db Target database
* @private
- * @see DB_impl#free_lock
- * @see #db_unlock(DB_impl)
+ * @see DBMap_impl#free_lock
+ * @see #db_unlock(DBMap_impl*)
*/
-static void db_free_lock(DB_impl db)
+static void db_free_lock(DBMap_impl* db)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_free_lock);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_free_lock);
if (db->free_lock == (unsigned int)~0) {
ShowFatalError("db_free_lock: free_lock overflow\n"
"Database allocated at %s:%d\n",
@@ -763,17 +745,15 @@ static void db_free_lock(DB_impl db)
* NOTE: Frees the duplicated keys of the nodes
* @param db Target database
* @private
- * @see DB_impl#free_lock
+ * @see DBMap_impl#free_lock
* @see #db_free_dbn(DBNode)
- * @see #db_lock(DB_impl)
+ * @see #db_lock(DBMap_impl*)
*/
-static void db_free_unlock(DB_impl db)
+static void db_free_unlock(DBMap_impl* db)
{
unsigned int i;
-#ifdef DB_ENABLE_STATS
- COUNT(db_free_unlock);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_free_unlock);
if (db->free_lock == 0) {
ShowWarning("db_free_unlock: free_lock was already 0\n"
"Database allocated at %s:%d\n",
@@ -787,9 +767,7 @@ static void db_free_unlock(DB_impl db)
for (i = 0; i < db->free_count ; i++) {
db_rebalance_erase(db->free_list[i].node, db->free_list[i].root);
db_dup_key_free(db, db->free_list[i].node->key);
-#ifdef DB_ENABLE_STATS
- if (stats.db_node_free != (unsigned int)~0) stats.db_node_free++;
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_node_free);
ers_free(db->nodes, db->free_list[i].node);
}
db->free_count = 0;
@@ -829,9 +807,7 @@ static void db_free_unlock(DB_impl db)
static int db_int_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
{
(void)maxlen;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_int_cmp);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_int_cmp);
if (key1.i < key2.i) return -1;
if (key1.i > key2.i) return 1;
return 0;
@@ -853,9 +829,7 @@ static int db_int_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
static int db_uint_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
{
(void)maxlen;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_uint_cmp);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_uint_cmp);
if (key1.ui < key2.ui) return -1;
if (key1.ui > key2.ui) return 1;
return 0;
@@ -875,9 +849,7 @@ static int db_uint_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
*/
static int db_string_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_string_cmp);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_string_cmp);
if (maxlen == 0)
maxlen = UINT16_MAX;
return strncmp((const char *)key1.str, (const char *)key2.str, maxlen);
@@ -897,9 +869,7 @@ static int db_string_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
*/
static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_istring_cmp);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_istring_cmp);
if (maxlen == 0)
maxlen = UINT16_MAX;
return strncasecmp((const char *)key1.str, (const char *)key2.str, maxlen);
@@ -919,9 +889,7 @@ static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
{
(void)maxlen;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_int_hash);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_int_hash);
return (unsigned int)key.i;
}
@@ -939,9 +907,7 @@ static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
static unsigned int db_uint_hash(DBKey key, unsigned short maxlen)
{
(void)maxlen;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_uint_hash);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_uint_hash);
return key.ui;
}
@@ -961,9 +927,7 @@ static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
unsigned int hash = 0;
unsigned short i;
-#ifdef DB_ENABLE_STATS
- COUNT(db_string_hash);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_string_hash);
if (maxlen == 0)
maxlen = UINT16_MAX;
@@ -992,9 +956,7 @@ static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
unsigned int hash = 0;
unsigned short i;
-#ifdef DB_ENABLE_STATS
- COUNT(db_istring_hash);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_istring_hash);
if (maxlen == 0)
maxlen = UINT16_MAX;
@@ -1020,9 +982,7 @@ static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
static void db_release_nothing(DBKey key, void *data, DBRelease which)
{
(void)key;(void)data;(void)which;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_release_nothing);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_release_nothing);
}
/**
@@ -1037,9 +997,7 @@ static void db_release_nothing(DBKey key, void *data, DBRelease which)
static void db_release_key(DBKey key, void *data, DBRelease which)
{
(void)data;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_release_key);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_release_key);
if (which&DB_RELEASE_KEY) aFree((char*)key.str); // needs to be a pointer
}
@@ -1049,17 +1007,15 @@ static void db_release_key(DBKey key, void *data, DBRelease which)
* @param data Data of the database entry
* @param which What is being requested to be released
* @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
+ * @see #DBKey
+ * @see #DBRelease
+ * @see #DBReleaser
* @see #db_default_release(DBType,DBOptions)
*/
static void db_release_data(DBKey key, void *data, DBRelease which)
{
(void)key;//not used
-#ifdef DB_ENABLE_STATS
- COUNT(db_release_data);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_release_data);
if (which&DB_RELEASE_DATA) aFree(data);
}
@@ -1069,16 +1025,14 @@ static void db_release_data(DBKey key, void *data, DBRelease which)
* @param data Data of the database entry
* @param which What is being requested to be released
* @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
+ * @see #DBKey
+ * @see #DBRelease
+ * @see #DBReleaser
* @see #db_default_release(DBType,DBOptions)
*/
static void db_release_both(DBKey key, void *data, DBRelease which)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_release_both);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_release_both);
if (which&DB_RELEASE_KEY) aFree((char*)key.str); // needs to be a pointer
if (which&DB_RELEASE_DATA) aFree(data);
}
@@ -1112,18 +1066,16 @@ static void db_release_both(DBKey key, void *data, DBRelease which)
* @param key Key that identifies the entry
* @return Data of the entry or NULL if not found
* @protected
- * @see DB_impl::vtable#get
+ * @see DBMap#get
*/
-static void *db_obj_get(DB self, DBKey key)
+static void* db_obj_get(DBMap* self, DBKey key)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
DBNode node;
int c;
void *data = NULL;
-#ifdef DB_ENABLE_STATS
- COUNT(db_get);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_get);
if (db == NULL) return NULL; // nullpo candidate
if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
ShowError("db_get: Attempted to retrieve non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
@@ -1165,19 +1117,17 @@ static void *db_obj_get(DB self, DBKey key)
* @param ... Extra arguments for match
* @return The number of entries that matched
* @protected
- * @see DB_impl::vtable#vgetall
+ * @see DBMap#vgetall
*/
-static unsigned int db_obj_vgetall(DB self, void **buf, unsigned int max, DBMatcher match, va_list args)
+static unsigned int db_obj_vgetall(DBMap* self, void **buf, unsigned int max, DBMatcher match, va_list args)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
unsigned int i;
DBNode node;
DBNode parent;
unsigned int ret = 0;
-#ifdef DB_ENABLE_STATS
- COUNT(db_vgetall);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_vgetall);
if (db == NULL) return 0; // nullpo candidate
if (match == NULL) return 0; // nullpo candidate
@@ -1215,7 +1165,7 @@ static unsigned int db_obj_vgetall(DB self, void **buf, unsigned int max, DBMatc
}
/**
- * 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.
@@ -1229,17 +1179,15 @@ static unsigned int db_obj_vgetall(DB self, void **buf, unsigned int max, DBMatc
* @param ... Extra arguments for match
* @return The number of entries that matched
* @protected
- * @see DB_impl::vtable#vgetall
- * @see DB_impl::vtable#getall
+ * @see DBMap#vgetall
+ * @see DBMap#getall
*/
-static unsigned int db_obj_getall(DB self, void **buf, unsigned int max, DBMatcher match, ...)
+static unsigned int db_obj_getall(DBMap* self, void **buf, unsigned int max, DBMatcher match, ...)
{
va_list args;
unsigned int ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_getall);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_getall);
if (self == NULL) return 0; // nullpo candidate
va_start(args, match);
@@ -1258,20 +1206,18 @@ static unsigned int db_obj_getall(DB self, void **buf, unsigned int max, DBMatch
* @param args Extra arguments for create
* @return Data of the entry
* @protected
- * @see DB_impl::vtable#vensure
+ * @see DBMap#vensure
*/
-static void *db_obj_vensure(DB self, DBKey key, DBCreateData create, va_list args)
+static void *db_obj_vensure(DBMap* self, DBKey key, DBCreateData create, va_list args)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
DBNode node;
DBNode parent = NULL;
unsigned int hash;
int c = 0;
void *data = NULL;
-#ifdef DB_ENABLE_STATS
- COUNT(db_vensure);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_vensure);
if (db == NULL) return NULL; // nullpo candidate
if (create == NULL) {
ShowError("db_ensure: Create function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
@@ -1307,9 +1253,7 @@ static void *db_obj_vensure(DB self, DBKey key, DBCreateData create, va_list arg
db->alloc_file, db->alloc_line);
return NULL;
}
-#ifdef DB_ENABLE_STATS
- COUNT(db_node_alloc);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_node_alloc);
node = ers_alloc(db->nodes, struct dbn);
node->left = NULL;
node->right = NULL;
@@ -1348,7 +1292,7 @@ static void *db_obj_vensure(DB self, DBKey key, DBCreateData create, va_list arg
}
/**
- * Just calls {@link 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>.
@@ -1358,17 +1302,15 @@ static void *db_obj_vensure(DB self, DBKey key, DBCreateData create, va_list arg
* @param ... Extra arguments for create
* @return Data of the entry
* @protected
- * @see DB_impl::vtable#vensure
- * @see DB_impl::vtable#ensure
+ * @see DBMap#vensure
+ * @see DBMap#ensure
*/
-static void *db_obj_ensure(DB self, DBKey key, DBCreateData create, ...)
+static void *db_obj_ensure(DBMap* self, DBKey key, DBCreateData create, ...)
{
va_list args;
void *ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_ensure);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_ensure);
if (self == NULL) return 0; // nullpo candidate
va_start(args, create);
@@ -1387,20 +1329,18 @@ static void *db_obj_ensure(DB self, DBKey key, DBCreateData create, ...)
* @return The previous data if the entry exists or NULL
* @protected
* @see #db_malloc_dbn(void)
- * @see DB_impl::vtable#put
+ * @see DBMap#put
*/
-static void *db_obj_put(DB self, DBKey key, void *data)
+static void *db_obj_put(DBMap* self, DBKey key, void *data)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
DBNode node;
DBNode parent = NULL;
int c = 0;
unsigned int hash;
void *old_data = NULL;
-#ifdef DB_ENABLE_STATS
- COUNT(db_put);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_put);
if (db == NULL) return NULL; // nullpo candidate
if (db->global_lock) {
ShowError("db_put: Database is being destroyed, aborting entry insertion.\n"
@@ -1446,9 +1386,7 @@ static void *db_obj_put(DB self, DBKey key, void *data)
}
// allocate a new node if necessary
if (node == NULL) {
-#ifdef DB_ENABLE_STATS
- COUNT(db_node_alloc);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_node_alloc);
node = ers_alloc(db->nodes, struct dbn);
node->left = NULL;
node->right = NULL;
@@ -1488,25 +1426,23 @@ static void *db_obj_put(DB 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 in {@link #db_free_add(DB_impl,DBNode,DBNode *)}.
+ * NOTE: The key (of the database) is released in {@link #db_free_add(DBMap_impl*,DBNode,DBNode *)}.
* @param self Interface of the database
* @param key Key that identifies the entry
* @return The data of the entry or NULL if not found
* @protected
- * @see #db_free_add(DB_impl,DBNode,DBNode *)
- * @see DB_impl::vtable#remove
+ * @see #db_free_add(DBMap_impl*,DBNode,DBNode *)
+ * @see DBMap#remove
*/
-static void *db_obj_remove(DB self, DBKey key)
+static void *db_obj_remove(DBMap* self, DBKey key)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
void *data = NULL;
DBNode node;
unsigned int hash;
int c = 0;
-#ifdef DB_ENABLE_STATS
- COUNT(db_remove);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_remove);
if (db == NULL) return NULL; // nullpo candidate
if (db->global_lock) {
ShowError("db_remove: Database is being destroyed. Aborting entry deletion.\n"
@@ -1550,19 +1486,17 @@ static void *db_obj_remove(DB self, DBKey key)
* @param args Extra arguments for func
* @return Sum of the values returned by func
* @protected
- * @see DB_impl::vtable#vforeach
+ * @see DBMap#vforeach
*/
-static int db_obj_vforeach(DB self, DBApply func, va_list args)
+static int db_obj_vforeach(DBMap* self, DBApply func, va_list args)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
unsigned int i;
int sum = 0;
DBNode node;
DBNode parent;
-#ifdef DB_ENABLE_STATS
- COUNT(db_vforeach);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_vforeach);
if (db == NULL) return 0; // nullpo candidate
if (func == NULL) {
ShowError("db_foreach: Passed function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
@@ -1608,17 +1542,15 @@ static int db_obj_vforeach(DB self, DBApply func, va_list args)
* @param ... Extra arguments for func
* @return Sum of the values returned by func
* @protected
- * @see DB_impl::vtable#vforeach
- * @see DB_impl::vtable#foreach
+ * @see DBMap#vforeach
+ * @see DBMap#foreach
*/
-static int db_obj_foreach(DB self, DBApply func, ...)
+static int db_obj_foreach(DBMap* self, DBApply func, ...)
{
va_list args;
int ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_foreach);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_foreach);
if (self == NULL) return 0; // nullpo candidate
va_start(args, func);
@@ -1637,19 +1569,17 @@ static int db_obj_foreach(DB self, DBApply func, ...)
* @param args Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB_impl::vtable#vclear
+ * @see DBMap#vclear
*/
-static int db_obj_vclear(DB self, DBApply func, va_list args)
+static int db_obj_vclear(DBMap* self, DBApply func, va_list args)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
int sum = 0;
unsigned int i;
DBNode node;
DBNode parent;
-#ifdef DB_ENABLE_STATS
- COUNT(db_vclear);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_vclear);
if (db == NULL) return 0; // nullpo candidate
db_free_lock(db);
@@ -1676,9 +1606,7 @@ static int db_obj_vclear(DB self, DBApply func, va_list args)
db->release(node->key, node->data, DB_RELEASE_BOTH);
node->deleted = 1;
}
-#ifdef DB_ENABLE_STATS
- COUNT(db_node_free);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_node_free);
ers_free(db->nodes, node);
if (parent) {
if (parent->left == node)
@@ -1697,7 +1625,7 @@ static int db_obj_vclear(DB self, DBApply func, va_list args)
}
/**
- * Just calls {@link common\db.h\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.
@@ -1709,17 +1637,15 @@ static int db_obj_vclear(DB self, DBApply func, va_list args)
* @param ... Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB_impl::vtable#vclear
- * @see DB_impl::vtable#clear
+ * @see DBMap#vclear
+ * @see DBMap#clear
*/
-static int db_obj_clear(DB self, DBApply func, ...)
+static int db_obj_clear(DBMap* self, DBApply func, ...)
{
va_list args;
int ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_clear);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_clear);
if (self == NULL) return 0; // nullpo candidate
va_start(args, func);
@@ -1739,16 +1665,14 @@ static int db_obj_clear(DB self, DBApply func, ...)
* @param args Extra arguments for func
* @return Sum of values returned by func
* @protected
- * @see DB_impl::vtable#vdestroy
+ * @see DBMap#vdestroy
*/
-static int db_obj_vdestroy(DB self, DBApply func, va_list args)
+static int db_obj_vdestroy(DBMap* self, DBApply func, va_list args)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
int sum;
-#ifdef DB_ENABLE_STATS
- COUNT(db_vdestroy);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_vdestroy);
if (db == NULL) return 0; // nullpo candidate
if (db->global_lock) {
ShowError("db_vdestroy: Database is already locked for destruction. Aborting second database destruction.\n"
@@ -1763,10 +1687,10 @@ static int db_obj_vdestroy(DB self, DBApply func, va_list args)
#ifdef DB_ENABLE_STATS
switch (db->type) {
- case DB_INT: COUNT(db_int_destroy); break;
- case DB_UINT: COUNT(db_uint_destroy); break;
- case DB_STRING: COUNT(db_string_destroy); break;
- case DB_ISTRING: COUNT(db_istring_destroy); break;
+ case DB_INT: DB_COUNTSTAT(db_int_destroy); break;
+ case DB_UINT: DB_COUNTSTAT(db_uint_destroy); break;
+ case DB_STRING: DB_COUNTSTAT(db_string_destroy); break;
+ case DB_ISTRING: DB_COUNTSTAT(db_istring_destroy); break;
}
#endif /* DB_ENABLE_STATS */
db_free_lock(db);
@@ -1782,29 +1706,27 @@ static int db_obj_vdestroy(DB self, DBApply func, va_list args)
}
/**
- * Just calls {@link DB#db_vdestroy(DB,DBApply,va_list)}.
+ * Just calls {@link DBMap#db_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.
- * @param self 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_impl::vtable#vdestroy
- * @see DB_impl::vtable#destroy
+ * @see DBMap#vdestroy
+ * @see DBMap#destroy
*/
-static int db_obj_destroy(DB self, DBApply func, ...)
+static int db_obj_destroy(DBMap* self, DBApply func, ...)
{
va_list args;
int ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_destroy);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_destroy);
if (self == NULL) return 0; // nullpo candidate
va_start(args, func);
@@ -1818,17 +1740,15 @@ static int db_obj_destroy(DB self, DBApply func, ...)
* @param self Interface of the database
* @return Size of the database
* @protected
- * @see DB_impl#item_count
- * @see DB_impl::vtable#size
+ * @see DBMap_impl#item_count
+ * @see DBMap#size
*/
-static unsigned int db_obj_size(DB self)
+static unsigned int db_obj_size(DBMap* self)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
unsigned int item_count;
-#ifdef DB_ENABLE_STATS
- COUNT(db_size);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_size);
if (db == NULL) return 0; // nullpo candidate
db_free_lock(db);
@@ -1843,17 +1763,15 @@ static unsigned int db_obj_size(DB self)
* @param self Interface of the database
* @return Type of the database
* @protected
- * @see DB_impl#type
- * @see DB_impl::vtable#type
+ * @see DBMap_impl#type
+ * @see DBMap#type
*/
-static DBType db_obj_type(DB self)
+static DBType db_obj_type(DBMap* self)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
DBType type;
-#ifdef DB_ENABLE_STATS
- COUNT(db_type);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_type);
if (db == NULL) return -1; // nullpo candidate - TODO what should this return?
db_free_lock(db);
@@ -1868,17 +1786,15 @@ static DBType db_obj_type(DB self)
* @param self Interface of the database
* @return Options of the database
* @protected
- * @see DB_impl#options
- * @see DB_impl::vtable#options
+ * @see DBMap_impl#options
+ * @see DBMap#options
*/
-static DBOptions db_obj_options(DB self)
+static DBOptions db_obj_options(DBMap* self)
{
- DB_impl db = (DB_impl)self;
+ DBMap_impl* db = (DBMap_impl*)self;
DBOptions options;
-#ifdef DB_ENABLE_STATS
- COUNT(db_options);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_options);
if (db == NULL) return DB_OPT_BASE; // nullpo candidate - TODO what should this return?
db_free_lock(db);
@@ -1916,9 +1832,7 @@ static DBOptions db_obj_options(DB self)
*/
DBOptions db_fix_options(DBType type, DBOptions options)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_fix_options);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_fix_options);
switch (type) {
case DB_INT:
case DB_UINT: // Numeric database, do nothing with the keys
@@ -1944,9 +1858,7 @@ DBOptions db_fix_options(DBType type, DBOptions options)
*/
DBComparator db_default_cmp(DBType type)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_default_cmp);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_default_cmp);
switch (type) {
case DB_INT: return db_int_cmp;
case DB_UINT: return db_uint_cmp;
@@ -1970,9 +1882,7 @@ DBComparator db_default_cmp(DBType type)
*/
DBHasher db_default_hash(DBType type)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_default_hash);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_default_hash);
switch (type) {
case DB_INT: return db_int_hash;
case DB_UINT: return db_uint_hash;
@@ -2001,9 +1911,7 @@ DBHasher db_default_hash(DBType type)
*/
DBReleaser db_default_release(DBType type, DBOptions options)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_default_release);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_default_release);
options = db_fix_options(type, options);
if (options&DB_OPT_RELEASE_DATA) { // Release data, what about the key?
if (options&(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY))
@@ -2028,9 +1936,7 @@ DBReleaser db_default_release(DBType type, DBOptions options)
*/
DBReleaser db_custom_release(DBRelease which)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_custom_release);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_custom_release);
switch (which) {
case DB_RELEASE_NOTHING: return db_release_nothing;
case DB_RELEASE_KEY: return db_release_key;
@@ -2054,32 +1960,24 @@ DBReleaser db_custom_release(DBRelease which)
* databases
* @return The interface of the database
* @public
- * @see #DB_impl
+ * @see #DBMap_impl
* @see #db_fix_options(DBType,DBOptions)
*/
-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)
{
- DB_impl db;
+ DBMap_impl* db;
unsigned int i;
#ifdef DB_ENABLE_STATS
- if (stats.db_alloc != (unsigned int)~0) stats.db_alloc++;
+ DB_COUNTSTAT(db_alloc);
switch (type) {
- case DB_INT:
- COUNT(db_int_alloc);
- break;
- case DB_UINT:
- COUNT(db_uint_alloc);
- break;
- case DB_STRING:
- COUNT(db_string_alloc);
- break;
- case DB_ISTRING:
- COUNT(db_istring_alloc);
- break;
+ case DB_INT: DB_COUNTSTAT(db_int_alloc); break;
+ case DB_UINT: DB_COUNTSTAT(db_uint_alloc); break;
+ case DB_STRING: DB_COUNTSTAT(db_string_alloc); break;
+ case DB_ISTRING: DB_COUNTSTAT(db_istring_alloc); break;
}
#endif /* DB_ENABLE_STATS */
- CREATE(db, struct db, 1);
+ CREATE(db, struct DBMap_impl, 1);
options = db_fix_options(type, options);
/* Interface of the database */
@@ -2137,9 +2035,7 @@ DBKey db_i2key(int key)
{
DBKey ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_i2key);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_i2key);
ret.i = key;
return ret;
}
@@ -2156,9 +2052,7 @@ DBKey db_ui2key(unsigned int key)
{
DBKey ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_ui2key);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_ui2key);
ret.ui = key;
return ret;
}
@@ -2175,9 +2069,7 @@ DBKey db_str2key(const char *key)
{
DBKey ret;
-#ifdef DB_ENABLE_STATS
- COUNT(db_str2key);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_str2key);
ret.str = key;
return ret;
}
@@ -2190,9 +2082,7 @@ DBKey db_str2key(const char *key)
*/
void db_init(void)
{
-#ifdef DB_ENABLE_STATS
- COUNT(db_init);
-#endif /* DB_ENABLE_STATS */
+ DB_COUNTSTAT(db_init);
}
/**
@@ -2203,8 +2093,7 @@ void db_init(void)
void db_final(void)
{
#ifdef DB_ENABLE_STATS
- if (stats.db_final != (unsigned int)~0)
- stats.db_final++;
+ DB_COUNTSTAT(db_final);
ShowInfo(CL_WHITE"Database nodes"CL_RESET":\n"
"allocated %u, freed %u\n",
stats.db_node_alloc, stats.db_node_free);