1 /* 2 * search the network database for matches 3 */ 4 #include <u.h> 5 #include <libc.h> 6 #include <bio.h> 7 #include <ndb.h> 8 9 static int all, multiple; 10 11 void 12 usage(void) 13 { 14 fprint(2, "usage: query [-am] [-f ndbfile] attr value " 15 "[returned-attr [reps]]\n"); 16 exits("usage"); 17 } 18 19 /* print values of nt's attributes matching rattr */ 20 static void 21 prmatch(Ndbtuple *nt, char *rattr) 22 { 23 for(; nt; nt = nt->entry) 24 if (strcmp(nt->attr, rattr) == 0) 25 print("%s\n", nt->val); 26 } 27 28 void 29 search(Ndb *db, char *attr, char *val, char *rattr) 30 { 31 char *p; 32 Ndbs s; 33 Ndbtuple *t, *nt; 34 35 /* first entry with a matching rattr */ 36 if(rattr && !all){ 37 p = ndbgetvalue(db, &s, attr, val, rattr, &t); 38 if (multiple) 39 prmatch(t, rattr); 40 else if(p) 41 print("%s\n", p); 42 ndbfree(t); 43 free(p); 44 return; 45 } 46 47 /* all entries with matching rattrs */ 48 if(rattr) { 49 for(t = ndbsearch(db, &s, attr, val); t != nil; 50 t = ndbsnext(&s, attr, val)){ 51 prmatch(t, rattr); 52 ndbfree(t); 53 } 54 return; 55 } 56 57 /* all entries */ 58 for(t = ndbsearch(db, &s, attr, val); t; t = ndbsnext(&s, attr, val)){ 59 for(nt = t; nt; nt = nt->entry) 60 print("%s=%s ", nt->attr, nt->val); 61 print("\n"); 62 ndbfree(t); 63 } 64 } 65 66 void 67 main(int argc, char **argv) 68 { 69 int reps = 1; 70 char *rattr = nil, *dbfile = nil; 71 Ndb *db; 72 73 ARGBEGIN{ 74 case 'a': 75 all++; 76 break; 77 case 'm': 78 multiple++; 79 break; 80 case 'f': 81 dbfile = ARGF(); 82 break; 83 default: 84 usage(); 85 }ARGEND; 86 87 switch(argc){ 88 case 4: 89 reps = atoi(argv[3]); /* wtf use is this? */ 90 /* fall through */ 91 case 3: 92 rattr = argv[2]; 93 break; 94 case 2: 95 rattr = nil; 96 break; 97 default: 98 usage(); 99 } 100 101 db = ndbopen(dbfile); 102 if(db == nil){ 103 fprint(2, "%s: no db files\n", argv0); 104 exits("no db"); 105 } 106 while(reps--) 107 search(db, argv[0], argv[1], rattr); 108 ndbclose(db); 109 110 exits(0); 111 } 112