00001
00013
00014 #ifndef OA_DB_H
00015 #define OA_DB_H
00016
00017 #include <stdarg.h>
00018 #include <config.h>
00019
00023 #define HASH_SIZE (256 + 27)
00024
00025
00026 #define RED 0
00027 #define BLACK 1
00028
00032 struct dbn {
00033 struct dbn *parent;
00034 struct dbn *left;
00035 struct dbn *right;
00036 int color;
00037 void *key;
00038 void *data;
00039 int deleted;
00040 };
00041
00045 struct dbt {
00046 int (*cmp)(struct dbt*, void*, void*);
00047 uintptr_t (*hash)(struct dbt*, void*);
00048
00049 void (*release)(struct dbn*, int which);
00050 int maxlen;
00051 struct dbn *ht[HASH_SIZE];
00052 int item_count;
00053 const char* alloc_file;
00054 int alloc_line;
00055 struct db_free {
00056 struct dbn *z;
00057 struct dbn **root;
00058 } *free_list;
00059 int free_count;
00060 int free_max;
00061 int free_lock;
00062 };
00063
00064 #define strdb_search(t,k) db_search((t), (void*)(k))
00065 #define strdb_insert(t,k,d) db_insert((t), (void*)(k), (void*)(d))
00066 #define strdb_erase(t,k) db_erase((t), (void*)(k))
00067 #define strdb_foreach db_foreach
00068 #define strdb_final db_final
00069 #define numdb_search(t,k) db_search((t), (void*)(k))
00070 #define numdb_insert(t,k,d) db_insert((t), (void*)(k), (void*)(d))
00071 #define numdb_erase(t,k) db_erase((t), (void*)(k))
00072 #define numdb_foreach db_foreach
00073 #define numdb_final db_final
00074
00075 #define strdb_init(a) strdb_init_(a,__FILE__, __LINE__)
00076 #define numdb_init() numdb_init_(__FILE__, __LINE__)
00077
00078 struct dbt* strdb_init_(int maxlen, const char *file, int line);
00079 struct dbt* numdb_init_(const char *file, int line);
00080
00081 void* db_search(struct dbt *table, void* key);
00082 struct dbn* db_insert(struct dbt *table, void* key, void* data);
00083 void* db_erase(struct dbt *table, void* key);
00084 void db_foreach(struct dbt*, int(*)(void*, void*, va_list), ...);
00085 void db_final(struct dbt*, int(*)(void*, void*, va_list), ...);
00086
00089 #endif // OA_DB_H_
00090