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