| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <ndb.h> |
| |
| /* |
| * search the database for matches |
| */ |
| void |
| usage(void) |
| { |
| fprint(2, "usage: query attr value [returned attribute]\n"); |
| exits("usage"); |
| } |
| |
| void |
| search(Ndb *db, char *attr, char *val, char *rattr) |
| { |
| Ndbs s; |
| Ndbtuple *t; |
| Ndbtuple *nt; |
| char *p; |
| |
| if(rattr){ |
| p = ndbgetvalue(db, &s, attr, val, rattr, nil); |
| if(p){ |
| print("%s\n", p); |
| free(p); |
| } |
| return; |
| } |
| |
| t = ndbsearch(db, &s, attr, val); |
| while(t){ |
| for(nt = t; nt; nt = nt->entry) |
| print("%s=%s ", nt->attr, nt->val); |
| print("\n"); |
| ndbfree(t); |
| t = ndbsnext(&s, attr, val); |
| } |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| char *rattr = 0; |
| Ndb *db; |
| char *dbfile = 0; |
| int reps = 1; |
| |
| ARGBEGIN{ |
| case 'f': |
| dbfile = ARGF(); |
| break; |
| }ARGEND; |
| |
| switch(argc){ |
| case 4: |
| reps = atoi(argv[3]); |
| /* fall through */ |
| case 3: |
| rattr = argv[2]; |
| break; |
| case 2: |
| rattr = 0; |
| break; |
| default: |
| usage(); |
| } |
| |
| db = ndbopen(dbfile); |
| if(db == 0){ |
| fprint(2, "no db files\n"); |
| exits("no db"); |
| } |
| while(reps--) |
| search(db, argv[0], argv[1], rattr); |
| ndbclose(db); |
| |
| exits(0); |
| } |