query.c 1.9 KB

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