Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <ndb.h>6 /*7 * search the database for matches8 */9 void10 usage(void)11 {12 fprint(2, "usage: query attr value [returned attribute]\n");13 exits("usage");14 }16 void17 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 void44 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 }