query.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <ndb.h>
  5. /*
  6. * search the database for matches
  7. */
  8. void
  9. usage(void)
  10. {
  11. fprint(2, "usage: query attr value [returned attribute]\n");
  12. exits("usage");
  13. }
  14. void
  15. search(Ndb *db, char *attr, char *val, char *rattr)
  16. {
  17. Ndbs s;
  18. Ndbtuple *t;
  19. Ndbtuple *nt;
  20. char *p;
  21. if(rattr){
  22. p = ndbgetvalue(db, &s, attr, val, rattr, nil);
  23. if(p){
  24. print("%s\n", p);
  25. free(p);
  26. }
  27. return;
  28. }
  29. t = ndbsearch(db, &s, attr, val);
  30. while(t){
  31. for(nt = t; nt; nt = nt->entry)
  32. print("%s=%s ", nt->attr, nt->val);
  33. print("\n");
  34. ndbfree(t);
  35. t = ndbsnext(&s, attr, val);
  36. }
  37. }
  38. void
  39. main(int argc, char **argv)
  40. {
  41. char *rattr = 0;
  42. Ndb *db;
  43. char *dbfile = 0;
  44. int reps = 1;
  45. ARGBEGIN{
  46. case 'f':
  47. dbfile = ARGF();
  48. break;
  49. }ARGEND;
  50. switch(argc){
  51. case 4:
  52. reps = atoi(argv[3]);
  53. /* fall through */
  54. case 3:
  55. rattr = argv[2];
  56. break;
  57. case 2:
  58. rattr = 0;
  59. break;
  60. default:
  61. usage();
  62. }
  63. db = ndbopen(dbfile);
  64. if(db == 0){
  65. fprint(2, "no db files\n");
  66. exits("no db");
  67. }
  68. while(reps--)
  69. search(db, argv[0], argv[1], rattr);
  70. ndbclose(db);
  71. exits(0);
  72. }