Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ndb.h>
6 /*
7 * search the database for matches
8 */
9 void
10 usage(void)
11 {
12 fprint(2, "usage: query attr value [returned attribute]\n");
13 exits("usage");
14 }
16 void
17 search(Ndb *db, char *attr, char *val, char *rattr)
18 {
19 Ndbs s;
20 Ndbtuple *t;
21 Ndbtuple *nt;
22 char *p;
24 if(rattr){
25 p = ndbgetvalue(db, &s, attr, val, rattr, nil);
26 if(p){
27 print("%s\n", p);
28 free(p);
29 }
30 return;
31 }
33 t = ndbsearch(db, &s, attr, val);
34 while(t){
35 for(nt = t; nt; nt = nt->entry)
36 print("%s=%s ", nt->attr, nt->val);
37 print("\n");
38 ndbfree(t);
39 t = ndbsnext(&s, attr, val);
40 }
41 }
43 void
44 main(int argc, char **argv)
45 {
46 char *rattr = 0;
47 Ndb *db;
48 char *dbfile = 0;
49 int reps = 1;
51 ARGBEGIN{
52 case 'f':
53 dbfile = ARGF();
54 break;
55 }ARGEND;
57 switch(argc){
58 case 4:
59 reps = atoi(argv[3]);
60 /* fall through */
61 case 3:
62 rattr = argv[2];
63 break;
64 case 2:
65 rattr = 0;
66 break;
67 default:
68 usage();
69 }
71 db = ndbopen(dbfile);
72 if(db == 0){
73 fprint(2, "no db files\n");
74 exits("no db");
75 }
76 while(reps--)
77 search(db, argv[0], argv[1], rattr);
78 ndbclose(db);
80 exits(0);
81 }