xref: /plan9/sys/src/cmd/ndb/query.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ndb.h>
5 
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 }
15 
16 void
17 search(Ndb *db, char *attr, char *val, char *rattr)
18 {
19 	Ndbs s;
20 	Ndbtuple *t;
21 	Ndbtuple *nt;
22 	char buf[Ndbvlen];
23 
24 	if(rattr){
25 		t = ndbgetval(db, &s, attr, val, rattr, buf);
26 		if(t){
27 			print("%s\n", buf);
28 			ndbfree(t);
29 		}
30 		return;
31 	}
32 
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 }
42 
43 void
44 main(int argc, char **argv)
45 {
46 	char *rattr = 0;
47 	Ndb *db;
48 	char *dbfile = 0;
49 	int reps = 1;
50 
51 	ARGBEGIN{
52 	case 'f':
53 		dbfile = ARGF();
54 		break;
55 	}ARGEND;
56 
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 	}
70 
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);
79 
80 	exits(0);
81 }
82