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