1901484c1SDavid du Colombier /*
2901484c1SDavid du Colombier * search the network database for matches
3901484c1SDavid du Colombier */
43e12c5d1SDavid du Colombier #include <u.h>
53e12c5d1SDavid du Colombier #include <libc.h>
63e12c5d1SDavid du Colombier #include <bio.h>
73e12c5d1SDavid du Colombier #include <ndb.h>
83e12c5d1SDavid du Colombier
98deabd96SDavid du Colombier static int all, multiple;
10*dfda52d8SDavid du Colombier static Biobuf bout;
118deabd96SDavid du Colombier
123e12c5d1SDavid du Colombier void
usage(void)133e12c5d1SDavid du Colombier usage(void)
143e12c5d1SDavid du Colombier {
158deabd96SDavid du Colombier fprint(2, "usage: query [-am] [-f ndbfile] attr value "
168deabd96SDavid du Colombier "[returned-attr [reps]]\n");
173e12c5d1SDavid du Colombier exits("usage");
183e12c5d1SDavid du Colombier }
193e12c5d1SDavid du Colombier
208deabd96SDavid du Colombier /* print values of nt's attributes matching rattr */
218deabd96SDavid du Colombier static void
prmatch(Ndbtuple * nt,char * rattr)228deabd96SDavid du Colombier prmatch(Ndbtuple *nt, char *rattr)
238deabd96SDavid du Colombier {
248deabd96SDavid du Colombier for(; nt; nt = nt->entry)
258deabd96SDavid du Colombier if (strcmp(nt->attr, rattr) == 0)
26*dfda52d8SDavid du Colombier Bprint(&bout, "%s\n", nt->val);
278deabd96SDavid du Colombier }
288deabd96SDavid du Colombier
293e12c5d1SDavid du Colombier void
search(Ndb * db,char * attr,char * val,char * rattr)303e12c5d1SDavid du Colombier search(Ndb *db, char *attr, char *val, char *rattr)
313e12c5d1SDavid du Colombier {
326b0d5c8bSDavid du Colombier char *p;
33901484c1SDavid du Colombier Ndbs s;
34901484c1SDavid du Colombier Ndbtuple *t, *nt;
353e12c5d1SDavid du Colombier
368deabd96SDavid du Colombier /* first entry with a matching rattr */
378deabd96SDavid du Colombier if(rattr && !all){
388deabd96SDavid du Colombier p = ndbgetvalue(db, &s, attr, val, rattr, &t);
398deabd96SDavid du Colombier if (multiple)
408deabd96SDavid du Colombier prmatch(t, rattr);
418deabd96SDavid du Colombier else if(p)
42*dfda52d8SDavid du Colombier Bprint(&bout, "%s\n", p);
438deabd96SDavid du Colombier ndbfree(t);
4457837e0bSDavid du Colombier free(p);
458deabd96SDavid du Colombier return;
468deabd96SDavid du Colombier }
478deabd96SDavid du Colombier
488deabd96SDavid du Colombier /* all entries with matching rattrs */
498deabd96SDavid du Colombier if(rattr) {
508deabd96SDavid du Colombier for(t = ndbsearch(db, &s, attr, val); t != nil;
518deabd96SDavid du Colombier t = ndbsnext(&s, attr, val)){
528deabd96SDavid du Colombier prmatch(t, rattr);
538deabd96SDavid du Colombier ndbfree(t);
543e12c5d1SDavid du Colombier }
553e12c5d1SDavid du Colombier return;
563e12c5d1SDavid du Colombier }
573e12c5d1SDavid du Colombier
588deabd96SDavid du Colombier /* all entries */
598deabd96SDavid du Colombier for(t = ndbsearch(db, &s, attr, val); t; t = ndbsnext(&s, attr, val)){
603e12c5d1SDavid du Colombier for(nt = t; nt; nt = nt->entry)
61*dfda52d8SDavid du Colombier Bprint(&bout, "%s=%s ", nt->attr, nt->val);
62*dfda52d8SDavid du Colombier Bprint(&bout, "\n");
633e12c5d1SDavid du Colombier ndbfree(t);
643e12c5d1SDavid du Colombier }
653e12c5d1SDavid du Colombier }
663e12c5d1SDavid du Colombier
673e12c5d1SDavid du Colombier void
main(int argc,char ** argv)683e12c5d1SDavid du Colombier main(int argc, char **argv)
693e12c5d1SDavid du Colombier {
706b0d5c8bSDavid du Colombier int reps = 1;
71901484c1SDavid du Colombier char *rattr = nil, *dbfile = nil;
72901484c1SDavid du Colombier Ndb *db;
733e12c5d1SDavid du Colombier
74219b2ee8SDavid du Colombier ARGBEGIN{
758deabd96SDavid du Colombier case 'a':
768deabd96SDavid du Colombier all++;
778deabd96SDavid du Colombier break;
788deabd96SDavid du Colombier case 'm':
798deabd96SDavid du Colombier multiple++;
808deabd96SDavid du Colombier break;
81219b2ee8SDavid du Colombier case 'f':
82*dfda52d8SDavid du Colombier dbfile = EARGF(usage());
833e12c5d1SDavid du Colombier break;
84901484c1SDavid du Colombier default:
85901484c1SDavid du Colombier usage();
86219b2ee8SDavid du Colombier }ARGEND;
87219b2ee8SDavid du Colombier
88219b2ee8SDavid du Colombier switch(argc){
89219b2ee8SDavid du Colombier case 4:
908deabd96SDavid du Colombier reps = atoi(argv[3]); /* wtf use is this? */
91219b2ee8SDavid du Colombier /* fall through */
923e12c5d1SDavid du Colombier case 3:
93219b2ee8SDavid du Colombier rattr = argv[2];
94219b2ee8SDavid du Colombier break;
95219b2ee8SDavid du Colombier case 2:
968deabd96SDavid du Colombier rattr = nil;
973e12c5d1SDavid du Colombier break;
983e12c5d1SDavid du Colombier default:
993e12c5d1SDavid du Colombier usage();
1003e12c5d1SDavid du Colombier }
1013e12c5d1SDavid du Colombier
102*dfda52d8SDavid du Colombier if(Binit(&bout, 1, OWRITE) == -1)
103*dfda52d8SDavid du Colombier sysfatal("Binit: %r");
104219b2ee8SDavid du Colombier db = ndbopen(dbfile);
1058deabd96SDavid du Colombier if(db == nil){
1068deabd96SDavid du Colombier fprint(2, "%s: no db files\n", argv0);
1073e12c5d1SDavid du Colombier exits("no db");
1083e12c5d1SDavid du Colombier }
1093e12c5d1SDavid du Colombier while(reps--)
110219b2ee8SDavid du Colombier search(db, argv[0], argv[1], rattr);
1113e12c5d1SDavid du Colombier ndbclose(db);
1123e12c5d1SDavid du Colombier
1133e12c5d1SDavid du Colombier exits(0);
1143e12c5d1SDavid du Colombier }
115