xref: /plan9/sys/src/cmd/ndb/query.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier #include <ndb.h>
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier /*
73e12c5d1SDavid du Colombier  *  search the database for matches
83e12c5d1SDavid du Colombier  */
93e12c5d1SDavid du Colombier void
103e12c5d1SDavid du Colombier usage(void)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	fprint(2, "usage: query attr value [returned attribute]\n");
133e12c5d1SDavid du Colombier 	exits("usage");
143e12c5d1SDavid du Colombier }
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier void
173e12c5d1SDavid du Colombier search(Ndb *db, char *attr, char *val, char *rattr)
183e12c5d1SDavid du Colombier {
193e12c5d1SDavid du Colombier 	Ndbs s;
203e12c5d1SDavid du Colombier 	Ndbtuple *t;
213e12c5d1SDavid du Colombier 	Ndbtuple *nt;
223e12c5d1SDavid du Colombier 	char buf[Ndbvlen];
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier 	if(rattr){
253e12c5d1SDavid du Colombier 		t = ndbgetval(db, &s, attr, val, rattr, buf);
263e12c5d1SDavid du Colombier 		if(t){
273e12c5d1SDavid du Colombier 			print("%s\n", buf);
283e12c5d1SDavid du Colombier 			ndbfree(t);
293e12c5d1SDavid du Colombier 		}
303e12c5d1SDavid du Colombier 		return;
313e12c5d1SDavid du Colombier 	}
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier 	t = ndbsearch(db, &s, attr, val);
343e12c5d1SDavid du Colombier 	while(t){
353e12c5d1SDavid du Colombier 		for(nt = t; nt; nt = nt->entry)
363e12c5d1SDavid du Colombier 			print("%s=%s ", nt->attr, nt->val);
373e12c5d1SDavid du Colombier 		print("\n");
383e12c5d1SDavid du Colombier 		ndbfree(t);
393e12c5d1SDavid du Colombier 		t = ndbsnext(&s, attr, val);
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier void
443e12c5d1SDavid du Colombier main(int argc, char **argv)
453e12c5d1SDavid du Colombier {
463e12c5d1SDavid du Colombier 	char *rattr = 0;
473e12c5d1SDavid du Colombier 	Ndb *db;
48*219b2ee8SDavid du Colombier 	char *dbfile = 0;
493e12c5d1SDavid du Colombier 	int reps = 1;
503e12c5d1SDavid du Colombier 
51*219b2ee8SDavid du Colombier 	ARGBEGIN{
52*219b2ee8SDavid du Colombier 	case 'f':
53*219b2ee8SDavid du Colombier 		dbfile = ARGF();
543e12c5d1SDavid du Colombier 		break;
55*219b2ee8SDavid du Colombier 	}ARGEND;
56*219b2ee8SDavid du Colombier 
57*219b2ee8SDavid du Colombier 	switch(argc){
58*219b2ee8SDavid du Colombier 	case 4:
59*219b2ee8SDavid du Colombier 		reps = atoi(argv[3]);
60*219b2ee8SDavid du Colombier 		/* fall through */
613e12c5d1SDavid du Colombier 	case 3:
62*219b2ee8SDavid du Colombier 		rattr = argv[2];
63*219b2ee8SDavid du Colombier 		break;
64*219b2ee8SDavid du Colombier 	case 2:
653e12c5d1SDavid du Colombier 		rattr = 0;
663e12c5d1SDavid du Colombier 		break;
673e12c5d1SDavid du Colombier 	default:
683e12c5d1SDavid du Colombier 		usage();
693e12c5d1SDavid du Colombier 	}
703e12c5d1SDavid du Colombier 
71*219b2ee8SDavid du Colombier 	db = ndbopen(dbfile);
723e12c5d1SDavid du Colombier 	if(db == 0){
733e12c5d1SDavid du Colombier 		fprint(2, "no db files\n");
743e12c5d1SDavid du Colombier 		exits("no db");
753e12c5d1SDavid du Colombier 	}
763e12c5d1SDavid du Colombier 	while(reps--)
77*219b2ee8SDavid du Colombier 		search(db, argv[0], argv[1], rattr);
783e12c5d1SDavid du Colombier 	ndbclose(db);
793e12c5d1SDavid du Colombier 
803e12c5d1SDavid du Colombier 	exits(0);
813e12c5d1SDavid du Colombier }
82