xref: /plan9/sys/src/cmd/ndb/query.c (revision f9e1cf08d3be51592e03e639fc848a68dc31a55e)
1 /*
2  *  search the network database for matches
3  */
4 #include <u.h>
5 #include <libc.h>
6 #include <bio.h>
7 #include <ndb.h>
8 
9 static int all, multiple;
10 
11 void
12 usage(void)
13 {
14 	fprint(2, "usage: query [-am] [-f ndbfile] attr value "
15 		"[returned-attr [reps]]\n");
16 	exits("usage");
17 }
18 
19 /* print values of nt's attributes matching rattr */
20 static void
21 prmatch(Ndbtuple *nt, char *rattr)
22 {
23 	for(; nt; nt = nt->entry)
24 		if (strcmp(nt->attr, rattr) == 0)
25 			print("%s\n", nt->val);
26 }
27 
28 void
29 search(Ndb *db, char *attr, char *val, char *rattr)
30 {
31 	char *p;
32 	Ndbs s;
33 	Ndbtuple *t, *nt;
34 
35 	/* first entry with a matching rattr */
36 	if(rattr && !all){
37 		p = ndbgetvalue(db, &s, attr, val, rattr, &t);
38 		if (multiple)
39 			prmatch(t, rattr);
40 		else if(p)
41 			print("%s\n", p);
42 		ndbfree(t);
43 		free(p);
44 		return;
45 	}
46 
47 	/* all entries with matching rattrs */
48 	if(rattr) {
49 		for(t = ndbsearch(db, &s, attr, val); t != nil;
50 		    t = ndbsnext(&s, attr, val)){
51 			prmatch(t, rattr);
52 			ndbfree(t);
53 		}
54 		return;
55 	}
56 
57 	/* all entries */
58 	for(t = ndbsearch(db, &s, attr, val); t; t = ndbsnext(&s, attr, val)){
59 		for(nt = t; nt; nt = nt->entry)
60 			print("%s=%s ", nt->attr, nt->val);
61 		print("\n");
62 		ndbfree(t);
63 	}
64 }
65 
66 void
67 main(int argc, char **argv)
68 {
69 	int reps = 1;
70 	char *rattr = nil, *dbfile = nil;
71 	Ndb *db;
72 
73 	ARGBEGIN{
74 	case 'a':
75 		all++;
76 		break;
77 	case 'm':
78 		multiple++;
79 		break;
80 	case 'f':
81 		dbfile = ARGF();
82 		break;
83 	default:
84 		usage();
85 	}ARGEND;
86 
87 	switch(argc){
88 	case 4:
89 		reps = atoi(argv[3]);	/* wtf use is this? */
90 		/* fall through */
91 	case 3:
92 		rattr = argv[2];
93 		break;
94 	case 2:
95 		rattr = nil;
96 		break;
97 	default:
98 		usage();
99 	}
100 
101 	db = ndbopen(dbfile);
102 	if(db == nil){
103 		fprint(2, "%s: no db files\n", argv0);
104 		exits("no db");
105 	}
106 	while(reps--)
107 		search(db, argv[0], argv[1], rattr);
108 	ndbclose(db);
109 
110 	exits(0);
111 }
112