1 /*************************************************************************************************
2 * Writing test of Quick Database Manager
3 *************************************************************************************************/
4
5
6 #include <depot.h>
7 #include <cabin.h>
8 #include <villa.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12
13 #undef TRUE
14 #define TRUE 1 /* boolean true */
15 #undef FALSE
16 #define FALSE 0 /* boolean false */
17
18 #define RECBUFSIZ 32 /* buffer for records */
19
20
21 /* global variables */
22 const char *progname; /* program name */
23 int showprgr; /* whether to show progression */
24
25
26 /* function prototypes */
27 int main(int argc, char **argv);
28 void usage(void);
29 int runwrite(int argc, char **argv);
30 int runread(int argc, char **argv);
31 int runbtwrite(int argc, char **argv);
32 int runbtread(int argc, char **argv);
33 int myrand(void);
34 int dowrite(char *name, int rnum);
35 int doread(char *name, int rnum);
36 int dobtwrite(char *name, int rnum, int rnd);
37 int dobtread(char *name, int rnum, int rnd);
38
39
40 /* main routine */
main(int argc,char ** argv)41 int main(int argc, char **argv){
42 int rv;
43 progname = argv[0];
44 showprgr = TRUE;
45 if(getenv("HIDEPRGR")) showprgr = FALSE;
46 srand48(1978);
47 if(argc < 2) usage();
48 rv = 0;
49 if(!strcmp(argv[1], "write")){
50 rv = runwrite(argc, argv);
51 } else if(!strcmp(argv[1], "read")){
52 rv = runread(argc, argv);
53 } else if(!strcmp(argv[1], "btwrite")){
54 rv = runbtwrite(argc, argv);
55 } else if(!strcmp(argv[1], "btread")){
56 rv = runbtread(argc, argv);
57 } else {
58 usage();
59 }
60 return rv;
61 }
62
63
64 /* print the usage and exit */
usage(void)65 void usage(void){
66 fprintf(stderr, "%s: test cases for Quick Database Manager\n", progname);
67 fprintf(stderr, "\n");
68 fprintf(stderr, "usage:\n");
69 fprintf(stderr, " %s write name rnum\n", progname);
70 fprintf(stderr, " %s read name rnum\n", progname);
71 fprintf(stderr, " %s btwrite [-rnd] name rnum\n", progname);
72 fprintf(stderr, " %s btread [-rnd] name rnum\n", progname);
73 fprintf(stderr, "\n");
74 exit(1);
75 }
76
77
78 /* parse arguments of write command */
runwrite(int argc,char ** argv)79 int runwrite(int argc, char **argv){
80 char *name, *rstr;
81 int i, rnum, rv;
82 name = NULL;
83 rstr = NULL;
84 rnum = 0;
85 for(i = 2; i < argc; i++){
86 if(!name && argv[i][0] == '-'){
87 usage();
88 } else if(!name){
89 name = argv[i];
90 } else if(!rstr){
91 rstr = argv[i];
92 } else {
93 usage();
94 }
95 }
96 if(!name || !rstr) usage();
97 rnum = atoi(rstr);
98 if(rnum < 1) usage();
99 rv = dowrite(name, rnum);
100 return rv;
101 }
102
103
104 /* parse arguments of read command */
runread(int argc,char ** argv)105 int runread(int argc, char **argv){
106 char *name, *rstr;
107 int i, rnum, rv;
108 name = NULL;
109 rstr = NULL;
110 rnum = 0;
111 for(i = 2; i < argc; i++){
112 if(!name && argv[i][0] == '-'){
113 usage();
114 } else if(!name){
115 name = argv[i];
116 } else if(!rstr){
117 rstr = argv[i];
118 } else {
119 usage();
120 }
121 }
122 if(!name || !rstr) usage();
123 rnum = atoi(rstr);
124 if(rnum < 1) usage();
125 rv = doread(name, rnum);
126 return rv;
127 }
128
129
130 /* parse arguments of btwrite command */
runbtwrite(int argc,char ** argv)131 int runbtwrite(int argc, char **argv){
132 char *name, *rstr;
133 int i, rnum, rnd, rv;
134 name = NULL;
135 rstr = NULL;
136 rnum = 0;
137 rnd = FALSE;
138 for(i = 2; i < argc; i++){
139 if(!name && argv[i][0] == '-'){
140 if(!name && !strcmp(argv[i], "-rnd")){
141 rnd = TRUE;
142 } else {
143 usage();
144 }
145 } else if(!name){
146 name = argv[i];
147 } else if(!rstr){
148 rstr = argv[i];
149 } else {
150 usage();
151 }
152 }
153 if(!name || !rstr) usage();
154 rnum = atoi(rstr);
155 if(rnum < 1) usage();
156 rv = dobtwrite(name, rnum, rnd);
157 return rv;
158 }
159
160
161 /* parse arguments of btread command */
runbtread(int argc,char ** argv)162 int runbtread(int argc, char **argv){
163 char *name, *rstr;
164 int i, rnum, rnd, rv;
165 name = NULL;
166 rstr = NULL;
167 rnum = 0;
168 rnd = FALSE;
169 for(i = 2; i < argc; i++){
170 if(!name && argv[i][0] == '-'){
171 if(!name && !strcmp(argv[i], "-rnd")){
172 rnd = TRUE;
173 } else {
174 usage();
175 }
176 } else if(!name){
177 name = argv[i];
178 } else if(!rstr){
179 rstr = argv[i];
180 } else {
181 usage();
182 }
183 }
184 if(!name || !rstr) usage();
185 rnum = atoi(rstr);
186 if(rnum < 1) usage();
187 rv = dobtread(name, rnum, rnd);
188 return rv;
189 }
190
191
192 /* pseudo random number generator */
myrand(void)193 int myrand(void){
194 static int cnt = 0;
195 return (lrand48() + cnt++) & 0x7FFFFFFF;
196 }
197
198
199 /* perform write command */
dowrite(char * name,int rnum)200 int dowrite(char *name, int rnum){
201 DEPOT *depot;
202 int i, err, len;
203 char buf[RECBUFSIZ];
204 if(showprgr) printf("<Writing Test of Hash>\n name=%s rnum=%d\n\n", name, rnum);
205 /* open a database */
206 if(!(depot = dpopen(name, DP_OWRITER | DP_OCREAT | DP_OTRUNC, rnum * 3))){
207 fprintf(stderr, "dpopen failed\n");
208 return 1;
209 }
210 err = FALSE;
211 /* loop for each record */
212 for(i = 1; i <= rnum; i++){
213 /* store a record */
214 len = sprintf(buf, "%08d", i);
215 if(!dpput(depot, buf, len, buf, len, DP_DOVER)){
216 fprintf(stderr, "dpput failed\n");
217 err = TRUE;
218 break;
219 }
220 /* print progression */
221 if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
222 putchar('.');
223 fflush(stdout);
224 if(i == rnum || i % (rnum / 10) == 0){
225 printf(" (%08d)\n", i);
226 fflush(stdout);
227 }
228 }
229 }
230 /* close the database */
231 if(!dpclose(depot)){
232 fprintf(stderr, "dpclose failed\n");
233 return 1;
234 }
235 if(showprgr && !err) printf("ok\n\n");
236 return err ? 1 : 0;
237 }
238
239
240 /* perform read command */
doread(char * name,int rnum)241 int doread(char *name, int rnum){
242 DEPOT *depot;
243 int i, err, len;
244 char buf[RECBUFSIZ], vbuf[RECBUFSIZ];
245 if(showprgr) printf("<Reading Test of Hash>\n name=%s rnum=%d\n\n", name, rnum);
246 /* open a database */
247 if(!(depot = dpopen(name, DP_OREADER, -1))){
248 fprintf(stderr, "dpopen failed\n");
249 return 1;
250 }
251 err = FALSE;
252 /* loop for each record */
253 for(i = 1; i <= rnum; i++){
254 /* store a record */
255 len = sprintf(buf, "%08d", i);
256 if(dpgetwb(depot, buf, len, 0, RECBUFSIZ, vbuf) == -1){
257 fprintf(stderr, "dpget failed\n");
258 err = TRUE;
259 break;
260 }
261 /* print progression */
262 if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
263 putchar('.');
264 fflush(stdout);
265 if(i == rnum || i % (rnum / 10) == 0){
266 printf(" (%08d)\n", i);
267 fflush(stdout);
268 }
269 }
270 }
271 /* close the database */
272 if(!dpclose(depot)){
273 fprintf(stderr, "dpclose failed\n");
274 return 1;
275 }
276 if(showprgr && !err) printf("ok\n\n");
277 return err ? 1 : 0;
278 }
279
280
281 /* perform btwrite command */
dobtwrite(char * name,int rnum,int rnd)282 int dobtwrite(char *name, int rnum, int rnd){
283 VILLA *villa;
284 int i, err, len;
285 char buf[RECBUFSIZ];
286 if(showprgr) printf("<Writing Test of B+ Tree>\n name=%s rnum=%d\n\n", name, rnum);
287 /* open a database */
288 if(!(villa = vlopen(name, VL_OWRITER | VL_OCREAT | VL_OTRUNC, VL_CMPLEX))){
289 fprintf(stderr, "vlopen failed\n");
290 return 1;
291 }
292 if(rnd){
293 vlsettuning(villa, 77, 256, rnum / 77, -1);
294 } else {
295 vlsettuning(villa, 101, 256, 16, 16);
296 }
297 err = FALSE;
298 /* loop for each record */
299 for(i = 1; i <= rnum; i++){
300 /* store a record */
301 len = sprintf(buf, "%08d", rnd ? myrand() % rnum + 1 : i);
302 if(!vlput(villa, buf, len, buf, len, VL_DOVER)){
303 fprintf(stderr, "vlput failed\n");
304 err = TRUE;
305 break;
306 }
307 /* print progression */
308 if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
309 putchar('.');
310 fflush(stdout);
311 if(i == rnum || i % (rnum / 10) == 0){
312 printf(" (%08d)\n", i);
313 fflush(stdout);
314 }
315 }
316 }
317 /* close the database */
318 if(!vlclose(villa)){
319 fprintf(stderr, "vlclose failed\n");
320 return 1;
321 }
322 if(showprgr && !err) printf("ok\n\n");
323 return err ? 1 : 0;
324 }
325
326
327 /* perform btread command */
dobtread(char * name,int rnum,int rnd)328 int dobtread(char *name, int rnum, int rnd){
329 VILLA *villa;
330 int i, err, len;
331 const char *val;
332 char buf[RECBUFSIZ];
333 if(showprgr) printf("<Reading Test of B+ Tree>\n name=%s rnum=%d\n\n", name, rnum);
334 /* open a database */
335 if(!(villa = vlopen(name, VL_OREADER, VL_CMPLEX))){
336 fprintf(stderr, "vlopen failed\n");
337 return 1;
338 }
339 if(rnd){
340 vlsettuning(villa, 37, 200, rnum / 45, 512);
341 } else {
342 vlsettuning(villa, 101, 256, 16, 16);
343 }
344 err = FALSE;
345 /* loop for each record */
346 for(i = 1; i <= rnum; i++){
347 /* store a record */
348 len = sprintf(buf, "%08d", rnd ? myrand() % rnum + 1 : i);
349 if(!(val = vlgetcache(villa, buf, len, NULL))){
350 fprintf(stderr, "vlget failed\n");
351 err = TRUE;
352 break;
353 }
354 /* print progression */
355 if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
356 putchar('.');
357 fflush(stdout);
358 if(i == rnum || i % (rnum / 10) == 0){
359 printf(" (%08d)\n", i);
360 fflush(stdout);
361 }
362 }
363 }
364 /* close the database */
365 if(!vlclose(villa)){
366 fprintf(stderr, "vlclose failed\n");
367 return 1;
368 }
369 if(showprgr && !err) printf("ok\n\n");
370 return err ? 1 : 0;
371 }
372
373
374
375 /* END OF FILE */
376