acl  3.5.3.0
acl_mdb.h
浏览该文件的文档.
1 #ifndef ACL_MEMDB_INCLUDE_H
2 #define ACL_MEMDB_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 
10 typedef struct ACL_MDT_NOD ACL_MDT_NOD;
11 typedef struct ACL_MDT_RES ACL_MDT_RES;
12 typedef struct ACL_MDT_REC ACL_MDT_REC;
13 typedef struct ACL_MDT_REF ACL_MDT_REF;
14 typedef struct ACL_MDT_IDX ACL_MDT_IDX;
15 typedef struct ACL_MDT ACL_MDT;
16 typedef struct ACL_MDB ACL_MDB;
17 
18 /* 数据表各索引关键字段的约束标志位 */
19 #define ACL_MDT_FLAG_NUL (0)
20 #define ACL_MDT_FLAG_UNI (1 << 0) /**< 表示唯一 */
21 #define ACL_MDT_FLAG_KMR (1 << 1) /**< 表示重用键内存 */
22 #define ACL_MDT_FLAG_DMR (1 << 2) /**< 表示重用值内存 */
23 #define ACL_MDT_FLAG_SLICE1 (1 << 10) /**< 启用 ACL_SLICE_FLAG_GC1 */
24 #define ACL_MDT_FLAG_SLICE2 (1 << 11) /**< 启用 ACL_SLICE_FLAG_GC2 */
25 #define ACL_MDT_FLAG_SLICE3 (1 << 12) /**< 启用 ACL_SLICE_FLAG_GC3 */
26 #define ACL_MDT_FLAG_SLICE_RTGC_OFF (1 << 13) /**< 关闭内存切片的实时垃圾回收功能 */
27 
28 /************************************************************************/
29 /* in acl_mdb.c */
30 /************************************************************************/
31 
32 /**
33  * 创建一个数据库句柄
34  * @param dbname {const char*} 数据库名
35  * @param dbtype {const char*} 数据库类型: hash/avl
36  * @return {ACL_MDB*} 数据库句柄
37  */
38 ACL_API ACL_MDB *acl_mdb_create(const char *dbname, const char *dbtype);
39 
40 /**
41  * 关闭并释放一个内存数据库
42  * @param mdb {ACL_MDB*} 数据库句柄
43  */
44 ACL_API void acl_mdb_free(ACL_MDB *mdb);
45 
46 /**
47  * 在给定数据库上创建一个数据表
48  * @param mdb {ACL_MDB*} 数据库句柄
49  * @param tbl_name {const char*} 表名
50  * @param tbl_flag {unsigned int} 表的属性标志位
51  * @param init_capacity {size_t} 数据表内针对每个索引键的内部哈希表的初始化容量
52  * @param key_labels {const char *[]} 数据表字段名数组
53  * @param flags {unsigned int[]} 与 key_labels 相对应的约束标志位
54  * @return {ACL_MDT*} 新建的数据表句柄
55  */
56 ACL_API ACL_MDT *acl_mdb_tbl_create(ACL_MDB *mdb, const char *tbl_name,
57  unsigned int tbl_flag, size_t init_capacity,
58  const char *key_labels[], unsigned int flags[]);
59 
60 /**
61  * 添加一条新的数据记录
62  * @param mdb {ACL_MDB*} 数据库句柄
63  * @param tbl_name {const char*} 数据表名
64  * @param data {void*} 应用数据项
65  * @param dlen {unsigned int} data 的数据大小
66  * @param key_labels {const char *[]} 数据表字段名数组
67  * @param keys {const char *[]} 数据表字段名对应值数组
68  * @return {ACL_MDB_NOD*} 新添加的数据在数据表中存储的句柄
69  */
70 ACL_API ACL_MDT_NOD *acl_mdb_add(ACL_MDB *mdb, const char *tbl_name,
71  void *data, unsigned int dlen,
72  const char *key_labels[], const char *keys[]);
73 
74 /**
75  * 探测数据表中对应的字段值是否存在
76  * @param mdb {ACL_MDB*} 数据库句柄
77  * @param tbl_name {const char*} 数据表名
78  * @param key_label {const char*} 数据表索引字段名
79  * @param key {const char*} 数据表索引字段键值
80  * @return {int} 0: 不存在, != 0: 存在
81  */
82 ACL_API int acl_mdb_probe(ACL_MDB *mdb, const char *tbl_name,
83  const char *key_label, const char *key);
84 
85 /**
86  * 从数据库中查询符合条件的结果集
87  * @param mdb {ACL_MDB*} 数据库句柄
88  * @param tbl_name {const char*} 数据表名
89  * @param key_label {const char*} 数据表中的字段名
90  * @param key {const char*} 数据表中的字段值
91  * @param from {int} 查询的结果希望是从该位置开始进行存储
92  * @param limit {int} 查询的结果的最大希望个数
93  * @return {ACL_MDT_RES*} 查询结果集,如果为空则表明查询结果为空或出错
94  */
95 ACL_API ACL_MDT_RES *acl_mdb_find(ACL_MDB *mdb, const char *tbl_name,
96  const char *key_label, const char *key, int from, int limit);
97 
98 /**
99  * 从数据库中列出某数据表中某个范围的结果集
100  * @param mdb {ACL_MDB*} 数据库句柄
101  * @param tbl_name {const char*} 数据表名
102  * @param from {int} 查询的结果希望是从该位置开始进行存储
103  * @param limit {int} 查询的结果的最大希望个数
104  * @return {ACL_MDT_RES*} 查询结果集,如果为空则表明查询结果为空或出错
105  */
106 ACL_API ACL_MDT_RES *acl_mdb_list(ACL_MDB *mdb, const char *tbl_name,
107  int from, int limit);
108 
109 /**
110  * 从数据库中删除一条数据记录
111  * @param mdb {ACL_MDB*} 数据库句柄
112  * @param tbl_name {const char*} 数据表名
113  * @param key_label {const char*} 数据表字段名
114  * @param key {const char*} 数据表字段值
115  * @param onfree_fn {void (*)(void*, unsigned int)}
116  * 释放用户的对象时调用的释放回调函数
117  * @return {int} 删除的行数量
118  */
119 ACL_API int acl_mdb_del(ACL_MDB *mdb, const char *tbl_name,
120  const char *key_label, const char *key,
121  void (*onfree_fn)(void*, unsigned int));
122 
123 /**
124  * 遍历数据库中某个数据表的所有数据结点
125  * @param mdb {ACL_MDB*} 数据库句柄
126  * @param tbl_name {const char*} 数据表名
127  * @param walk_fn 遍历回调函数,如果该函数返回非0值,则停止遍历
128  * @param from {int} 查询的结果希望是从该位置开始进行存储
129  * @param limit {int} 查询的结果的最大希望个数
130  * @return {int} 遍历的数据结点数值
131  */
132 ACL_API int acl_mdb_walk(ACL_MDB *mdb, const char *tbl_name,
133  int (*walk_fn)(const void*, unsigned int),
134  int from, int limit);
135 
136 /**
137  * 数据库中某个数据表中元素总个数
138  * @param mdb {ACL_MDB*} 数据库句柄
139  * @param tbl_name {const char*} 数据表名
140  * @return {int} >=0
141  */
142 ACL_API int acl_mdb_cnt(ACL_MDB *mdb, const char *tbl_name);
143 
144 /************************************************************************/
145 /* in acl_mdt.c */
146 /************************************************************************/
147 
148 /**
149  * 创建一个数据表
150  * @param dbtype {const char *} 表类型: hash/avl
151  * @param tbl_name {const char*} 表名
152  * @param tbl_flag {unsigned int} 表的属性标志位
153  * @param init_capacity {size_t} 每个内部哈希表的初始化容量
154  * @param key_labels {const char *[]} 表中的各个字段名数组,最后以NULL结束
155  * @param flags {unsigned int[]} 与 key_labels 相对应的约束标志位
156  * @return {ACL_MDT*} 新建的数据表的句柄
157  */
158 ACL_API ACL_MDT *acl_mdt_create(const char *dbtype, const char *tbl_name,
159  unsigned int tbl_flag, size_t init_capacity,
160  const char *key_labels[], unsigned int flags[]);
161 
162 /**
163  * 释放一个内存表
164  * @param mdt {ACL_MDT*} 内存数据表句柄
165  */
166 ACL_API void acl_mdt_free(ACL_MDT *mdt);
167 
168 /**
169  * 向数据表中添加一条新的数据记录
170  * @param mdt {ACL_MDT*} 数据表句柄
171  * @param data {void*} 用户的动态数据, 如果表的 ACL_MDT_FLAG_DMR 标志位
172  * 未被设置,则将在内部拷贝一份该动态数据
173  * @param dlen {unsigned int} data 的数据长度
174  * @param key_labels {const char*[]} 数据表的索引字段名数组,以NULL结束
175  * @param keys {const char*[]} 数据表的索引字段值数组,以NULL结束
176  * @return {ACL_MDT_NOD*} 新添加的数据结点对象
177  */
178 ACL_API ACL_MDT_NOD *acl_mdt_add(ACL_MDT *mdt, void *data,
179  unsigned int dlen, const char *key_labels[], const char *keys[]);
180 
181 /**
182  * 探测数据表中对应的字段值是否存在
183  * @param mdt {ACL_MDT*} 数据表句柄
184  * @param key_label {const char*} 数据表索引字段名
185  * @param key {const char*} 数据表索引字段键值
186  * @return {int} 0: 不存在, != 0: 存在
187  */
188 ACL_API int acl_mdt_probe(ACL_MDT *mdt, const char *key_label, const char *key);
189 
190 /**
191  * 从数据表中查询某个数据表索引键值的结果集合
192  * @param mdt {ACL_MDT*} 数据表句柄
193  * @param key_label {const char*} 数据表索引字段名
194  * @param key {const char*} 数据表索引字段键值
195  * @param from {int} 查询的结果希望是从该位置开始进行存储
196  * @param limit {int} 查询的结果的最大希望个数
197  * @return {ACL_MDT_REC*} 对应某个索引字段值的结果集合
198  */
199 ACL_API ACL_MDT_RES *acl_mdt_find(ACL_MDT *mdt, const char *key_label,
200  const char *key, int from, int limit);
201 
202 /**
203  * 从数据表中顺序列出某个范围内的所有数据结点集合
204  * @param mdt {ACL_MDT*} 数据表句柄
205  * @param from {int} 查询的结果希望是从该位置开始进行存储
206  * @param limit {int} 查询的结果的最大希望个数
207  * @return {ACL_MDT_REC*} 对应某个索引字段值的结果集合
208  */
209 ACL_API ACL_MDT_RES *acl_mdt_list(ACL_MDT *mdt, int from, int limit);
210 
211 /**
212  * 从数据表中删除对应某个索引字段键值的结果集合
213  * @param mdt {ACL_MDT*} 数据表句柄
214  * @param key_label {const char*} 数据表索引字段名
215  * @param key {const char*} 数据表索引字段键值
216  * @param onfree_fn {void (*)(void*, unsigned int}
217  * 用户用来释放动态数据的回调函数
218  * @return {int} 所释放的数据结点的数目
219  */
220 ACL_API int acl_mdt_delete(ACL_MDT *mdt, const char *key_label,
221  const char *key, void (*onfree_fn)(void*, unsigned int));
222 
223 /**
224  * 遍历数据表的所有数据结点,并回调用户的处理函数
225  * @param mdt {ACL_MDT*} 数据表句柄
226  * @param walk_fn 回调函数,如果返回0则继续,否则停止遍历
227  * @param from {int} 查询的结果希望是从该位置开始进行存储
228  * @param len {int} 查询的结果的最大希望个数
229  * @return {int} 所遍历的数据长度
230  */
231 ACL_API int acl_mdt_walk(ACL_MDT *mdt, int (*walk_fn)(const void*, unsigned int),
232  int from, int len);
233 
234 /**
235  * 从所查询的结果集合中获取下一个数据结果
236  * @param res {ACL_MDT_RES*} 数据结果集合
237  * @return {void*} 用户自己能够识别的动态数据,若返回NULL表示出错或已经没有数据
238  */
239 ACL_API const void *acl_mdt_fetch_row(ACL_MDT_RES *res);
240 
241 /**
242  * 获得查询结果集中的记录数
243  * @param res {ACL_MDT_RES*} 数据结果集合
244  * @return {int} 0: 结果集为空; > 0: 结果集不为空
245  */
246 ACL_API int acl_mdt_row_count(ACL_MDT_RES *res);
247 
248 /**
249  * 释放查询结果动态内存,但并不释放实际的数据结点
250  * @param res {ACL_MDT_RES*} 数据结果集合
251  */
252 ACL_API void acl_mdt_res_free(ACL_MDT_RES *res);
253 
254 /**
255  * 数据表中所有元素的总数
256  * @param mdt {ACL_MDT*} 数据表句柄
257  * @return {int} >=0
258  */
259 ACL_API int acl_mdt_cnt(ACL_MDT *mdt);
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 
265 #endif
266 
ACL_API ACL_MDT_RES * acl_mdb_list(ACL_MDB *mdb, const char *tbl_name, int from, int limit)
ACL_API ACL_MDT * acl_mdb_tbl_create(ACL_MDB *mdb, const char *tbl_name, unsigned int tbl_flag, size_t init_capacity, const char *key_labels[], unsigned int flags[])
ACL_API int acl_mdb_walk(ACL_MDB *mdb, const char *tbl_name, int(*walk_fn)(const void *, unsigned int), int from, int limit)
ACL_API int acl_mdt_cnt(ACL_MDT *mdt)
struct ACL_MDT ACL_MDT
Definition: acl_mdb.h:15
ACL_API int acl_mdb_probe(ACL_MDB *mdb, const char *tbl_name, const char *key_label, const char *key)
ACL_API ACL_MDT_NOD * acl_mdt_add(ACL_MDT *mdt, void *data, unsigned int dlen, const char *key_labels[], const char *keys[])
ACL_API void acl_mdt_free(ACL_MDT *mdt)
ACL_API ACL_MDB * acl_mdb_create(const char *dbname, const char *dbtype)
ACL_API int acl_mdt_row_count(ACL_MDT_RES *res)
ACL_API ACL_MDT_RES * acl_mdt_find(ACL_MDT *mdt, const char *key_label, const char *key, int from, int limit)
ACL_API int acl_mdt_probe(ACL_MDT *mdt, const char *key_label, const char *key)
struct ACL_MDT_REC ACL_MDT_REC
Definition: acl_mdb.h:12
struct ACL_MDT_NOD ACL_MDT_NOD
Definition: acl_mdb.h:10
ACL_API ACL_MDT_NOD * acl_mdb_add(ACL_MDB *mdb, const char *tbl_name, void *data, unsigned int dlen, const char *key_labels[], const char *keys[])
ACL_API int acl_mdb_cnt(ACL_MDB *mdb, const char *tbl_name)
ACL_API int acl_mdt_delete(ACL_MDT *mdt, const char *key_label, const char *key, void(*onfree_fn)(void *, unsigned int))
struct ACL_MDB ACL_MDB
Definition: acl_mdb.h:16
ACL_API int acl_mdt_walk(ACL_MDT *mdt, int(*walk_fn)(const void *, unsigned int), int from, int len)
struct ACL_MDT_RES ACL_MDT_RES
Definition: acl_mdb.h:11
ACL_API ACL_MDT * acl_mdt_create(const char *dbtype, const char *tbl_name, unsigned int tbl_flag, size_t init_capacity, const char *key_labels[], unsigned int flags[])
struct ACL_MDT_REF ACL_MDT_REF
Definition: acl_mdb.h:13
ACL_API void acl_mdt_res_free(ACL_MDT_RES *res)
ACL_API ACL_MDT_RES * acl_mdt_list(ACL_MDT *mdt, int from, int limit)
ACL_API void acl_mdb_free(ACL_MDB *mdb)
struct ACL_MDT_IDX ACL_MDT_IDX
Definition: acl_mdb.h:14
ACL_API const void * acl_mdt_fetch_row(ACL_MDT_RES *res)
ACL_API int acl_mdb_del(ACL_MDB *mdb, const char *tbl_name, const char *key_label, const char *key, void(*onfree_fn)(void *, unsigned int))
ACL_API ACL_MDT_RES * acl_mdb_find(ACL_MDB *mdb, const char *tbl_name, const char *key_label, const char *key, int from, int limit)