/[LeafOK_CVS]/lbbs/src/test_trie_dict.c
ViewVC logotype

Contents of /lbbs/src/test_trie_dict.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (show annotations)
Wed Jul 2 04:17:33 2025 UTC (8 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.10: +1 -1 lines
Content type: text/x-csrc
Support UTF8 instead of GBK

1 /***************************************************************************
2 test_trie_dict.c - description
3 -------------------
4 Copyright : (C) 2004-2025 by Leaflet
5 Email : leaflet@leafok.com
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 3 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "log.h"
18 #include "trie_dict.h"
19 #include <errno.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <unistd.h>
23
24 #define TEST_VAL ((int64_t)(0xcb429a63a017661f)) // int64_t
25 #define TRIE_DICT_SHM_FILE "~trie_dict_shm.dat"
26
27 const char *keys[] = {
28 "ABCDEFG",
29 "abcdefg",
30 "../$@^",
31 "1234567890",
32 "1234657890",
33 "HZ测试汉字HZ",
34 "P3p4P3z4P_",
35 "_bbBBz_Z_",
36 ""};
37
38 int keys_cnt = 8; // + 1 to trigger error handling of blank key
39
40 void test_traverse_cb(const char *key, int64_t value)
41 {
42 printf("Traverse key: %s Len=%ld\n", key, strlen(key));
43 }
44
45 int main(int argc, char *argv[])
46 {
47 TRIE_NODE *p_dict;
48 int ret;
49 int64_t value;
50 FILE *fp;
51
52 if (log_begin("../log/bbsd.log", "../log/error.log") < 0)
53 {
54 printf("Open log error\n");
55 return -1;
56 }
57
58 log_common_redir(STDOUT_FILENO);
59 log_error_redir(STDERR_FILENO);
60
61 if ((fp = fopen(TRIE_DICT_SHM_FILE, "w")) == NULL)
62 {
63 log_error("fopen(%s) error\n", TRIE_DICT_SHM_FILE);
64 return -1;
65 }
66 fclose(fp);
67
68 for (int i = 0; i < keys_cnt; i++)
69 {
70 printf("Check key %d [%s] len=%ld\n", i, keys[i], strlen(keys[i]));
71 }
72
73 if (trie_dict_init(TRIE_DICT_SHM_FILE, TRIE_NODE_PER_POOL) < 0)
74 {
75 printf("trie_dict_init failed\n");
76 return -1;
77 }
78
79 printf("Testing #1 ...\n");
80
81 p_dict = trie_dict_create();
82
83 if (p_dict == NULL)
84 {
85 printf("OOM\n");
86 return -1;
87 }
88
89 ret = trie_dict_set(p_dict, NULL, TEST_VAL);
90 if (ret != -1)
91 {
92 printf("Set NULL key error (%d)\n", ret);
93 }
94
95 ret = trie_dict_del(p_dict, NULL);
96 if (ret != -1)
97 {
98 printf("Del NULL key error (%d)\n", ret);
99 }
100
101 for (int i = 0; i < keys_cnt; i++)
102 {
103 ret = trie_dict_set(p_dict, keys[i], TEST_VAL >> i);
104 if (ret != 1)
105 {
106 printf("Set non-existing [%s] error (%d)\n", keys[i], ret);
107 }
108 }
109
110 for (int i = 0; i < keys_cnt; i++)
111 {
112 ret = trie_dict_get(p_dict, keys[i], &value);
113 if (ret != 1)
114 {
115 printf("Get [%s] error (%d)\n", keys[i], ret);
116 }
117 else if (value != TEST_VAL >> i)
118 {
119 printf("Value of [%s] is incorrect (%ld != %ld)\n", keys[i], value, TEST_VAL >> i);
120 }
121 }
122
123 trie_dict_traverse(p_dict, test_traverse_cb);
124
125 for (int i = 0; i < keys_cnt; i++)
126 {
127 if (i % 2 == 0)
128 {
129 ret = trie_dict_del(p_dict, keys[i]);
130 if (ret != 1)
131 {
132 printf("Del existing [%s] error (%d)\n", keys[i], ret);
133 }
134 }
135 else
136 {
137 ret = trie_dict_set(p_dict, keys[i], TEST_VAL >> i);
138 if (ret != 0)
139 {
140 printf("Set existing [%s] with the same value error (%d)\n", keys[i], ret);
141 }
142 }
143 }
144
145 for (int i = 0; i < keys_cnt; i++)
146 {
147 if (i % 2 == 0)
148 {
149 ret = trie_dict_get(p_dict, keys[i], &value);
150 if (ret != 0)
151 {
152 printf("Get non-existing [%s] error (%d)\n", keys[i], ret);
153 }
154 }
155 else
156 {
157 ret = trie_dict_get(p_dict, keys[i], &value);
158 if (ret != 1)
159 {
160 printf("Get [%s] error (%d)\n", keys[i], ret);
161 }
162 else if (value != TEST_VAL >> i)
163 {
164 printf("Value of [%s] is incorrect (%ld != %ld)\n", keys[i], value, TEST_VAL >> i);
165 }
166 }
167 }
168
169 for (int i = 0; i < keys_cnt; i++)
170 {
171 if (i % 2 == 0)
172 {
173 ret = trie_dict_del(p_dict, keys[i]);
174 if (ret != 0)
175 {
176 printf("Del non-existing [%s] error (%d)\n", keys[i], ret);
177 }
178 }
179 else
180 {
181 ret = trie_dict_set(p_dict, keys[i], TEST_VAL << i);
182 if (ret != 1)
183 {
184 printf("Set existing [%s] with different value error (%d)\n", keys[i], ret);
185 }
186 }
187 }
188
189 trie_dict_traverse(p_dict, test_traverse_cb);
190
191 for (int i = 0; i < keys_cnt; i++)
192 {
193 if (i % 2 == 0)
194 {
195 ret = trie_dict_get(p_dict, keys[i], &value);
196 if (ret != 0)
197 {
198 printf("Get non-existing [%s] error (%d)\n", keys[i], ret);
199 }
200 }
201 else
202 {
203 ret = trie_dict_get(p_dict, keys[i], &value);
204 if (ret != 1)
205 {
206 printf("Get [%s] error (%d)\n", keys[i], ret);
207 }
208 else if (value != TEST_VAL << i)
209 {
210 printf("Value of [%s] is incorrect (%ld != %ld)\n", keys[i], value, TEST_VAL << i);
211 }
212 }
213 }
214
215 printf("Total nodes used = %d\n", trie_dict_used_nodes());
216
217 trie_dict_destroy(p_dict);
218 p_dict = NULL;
219
220 printf("Total nodes used = %d\n", trie_dict_used_nodes());
221
222 printf("Testing #2 ...\n");
223
224 for (int i = 0; i < 100000; i++)
225 {
226 p_dict = trie_dict_create();
227
228 if (p_dict == NULL)
229 {
230 printf("OOM\n");
231 return -1;
232 }
233
234 trie_dict_destroy(p_dict);
235 p_dict = NULL;
236 }
237
238 printf("Testing #3 ...\n");
239
240 if (set_trie_dict_shm_readonly() < 0)
241 {
242 printf("load_trie_dict_shm_readonly() error\n");
243 }
244
245 // if (unload_trie_dict_shm() < 0)
246 // {
247 // printf("unload_trie_dict_shm() error\n");
248 // }
249
250 printf("Total nodes used = %d, after set_shm_readonly\n", trie_dict_used_nodes());
251
252 trie_dict_cleanup();
253
254 printf("Total nodes used = %d, after cleanup\n", trie_dict_used_nodes());
255
256 printf("Done\n");
257
258 if (unlink(TRIE_DICT_SHM_FILE) < 0)
259 {
260 log_error("unlink(%s) error\n", TRIE_DICT_SHM_FILE);
261 return -1;
262 }
263
264 log_end();
265
266 return 0;
267 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1