1 /*************************************************************************************************
2  * Writing test of New Database Manager
3  *************************************************************************************************/
4 
5 
6 #include <ndbm.h>
7 #include <sys/types.h>
8 #include <fcntl.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 dowrite(char *name, int rnum);
32 int doread(char *name, int rnum);
33 
34 
35 /* main routine */
main(int argc,char ** argv)36 int main(int argc, char **argv){
37   int rv;
38   progname = argv[0];
39   showprgr = TRUE;
40   if(getenv("HIDEPRGR")) showprgr = FALSE;
41   if(argc < 2) usage();
42   rv = 0;
43   if(!strcmp(argv[1], "write")){
44     rv = runwrite(argc, argv);
45   } else if(!strcmp(argv[1], "read")){
46     rv = runread(argc, argv);
47   } else {
48     usage();
49   }
50   return rv;
51 }
52 
53 
54 /* print the usage and exit */
usage(void)55 void usage(void){
56   fprintf(stderr, "%s: test cases for New Database Manager\n", progname);
57   fprintf(stderr, "\n");
58   fprintf(stderr, "usage:\n");
59   fprintf(stderr, "  %s write name rnum\n", progname);
60   fprintf(stderr, "  %s read name rnum\n", progname);
61   fprintf(stderr, "\n");
62   exit(1);
63 }
64 
65 
66 /* parse arguments of write command */
runwrite(int argc,char ** argv)67 int runwrite(int argc, char **argv){
68   char *name, *rstr;
69   int i, rnum, rv;
70   name = NULL;
71   rstr = NULL;
72   rnum = 0;
73   for(i = 2; i < argc; i++){
74     if(!name && argv[i][0] == '-'){
75       usage();
76     } else if(!name){
77       name = argv[i];
78     } else if(!rstr){
79       rstr = argv[i];
80     } else {
81       usage();
82     }
83   }
84   if(!name || !rstr) usage();
85   rnum = atoi(rstr);
86   if(rnum < 1) usage();
87   rv = dowrite(name, rnum);
88   return rv;
89 }
90 
91 
92 /* parse arguments of read command */
runread(int argc,char ** argv)93 int runread(int argc, char **argv){
94   char *name, *rstr;
95   int i, rnum, rv;
96   name = NULL;
97   rstr = NULL;
98   rnum = 0;
99   for(i = 2; i < argc; i++){
100     if(!name && argv[i][0] == '-'){
101       usage();
102     } else if(!name){
103       name = argv[i];
104     } else if(!rstr){
105       rstr = argv[i];
106     } else {
107       usage();
108     }
109   }
110   if(!name || !rstr) usage();
111   rnum = atoi(rstr);
112   if(rnum < 1) usage();
113   rv = doread(name, rnum);
114   return rv;
115 }
116 
117 
118 /* perform write command */
dowrite(char * name,int rnum)119 int dowrite(char *name, int rnum){
120   DBM *db;
121   datum key, content;
122   int i, err, len;
123   char buf[RECBUFSIZ];
124   if(showprgr) printf("<Writing Test>\n  name=%s  rnum=%d\n\n", name, rnum);
125   /* open a database */
126   if(!(db = dbm_open(name, O_RDWR | O_CREAT | O_TRUNC, 00644))){
127     fprintf(stderr, "dbm_open failed\n");
128     return 1;
129   }
130   err = FALSE;
131   /* loop for each record */
132   for(i = 1; i <= rnum; i++){
133     len = sprintf(buf, "%08d", i);
134     key.dptr = buf;
135     key.dsize = len;
136     content.dptr = buf;
137     content.dsize = len;
138     /* store a record */
139     if(dbm_store(db, key, content, DBM_REPLACE) < 0){
140       fprintf(stderr, "dbm_store failed\n");
141       err = TRUE;
142       break;
143     }
144     /* print progression */
145     if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
146       putchar('.');
147       fflush(stdout);
148       if(i == rnum || i % (rnum / 10) == 0){
149         printf(" (%08d)\n", i);
150         fflush(stdout);
151       }
152     }
153   }
154   /* close the database */
155   dbm_close(db);
156   if(showprgr && !err) printf("ok\n\n");
157   return err ? 1 : 0;
158 }
159 
160 
161 /* perform read command */
doread(char * name,int rnum)162 int doread(char *name, int rnum){
163   DBM *db;
164   datum key, content;
165   int i, err, len;
166   char buf[RECBUFSIZ];
167   if(showprgr) printf("<Reading Test>\n  name=%s  rnum=%d\n\n", name, rnum);
168   /* open a database */
169   if(!(db = dbm_open(name, O_RDONLY, 00644))){
170     fprintf(stderr, "dbm_open failed\n");
171     return 1;
172   }
173   err = FALSE;
174   /* loop for each record */
175   for(i = 1; i <= rnum; i++){
176     /* retrieve a record */
177     len = sprintf(buf, "%08d", i);
178     key.dptr = buf;
179     key.dsize = len;
180     content = dbm_fetch(db, key);
181     if(!content.dptr){
182       fprintf(stderr, "dbm_fetch failed\n");
183       err = TRUE;
184       break;
185     }
186     /* print progression */
187     if(showprgr && rnum > 250 && i % (rnum / 250) == 0){
188       putchar('.');
189       fflush(stdout);
190       if(i == rnum || i % (rnum / 10) == 0){
191         printf(" (%08d)\n", i);
192         fflush(stdout);
193       }
194     }
195   }
196   /* close the database */
197   dbm_close(db);
198   if(showprgr && !err) printf("ok\n\n");
199   return err ? 1 : 0;
200 }
201 
202 
203 
204 /* END OF FILE */
205