query.c 1.8 KB

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