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