rpc.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "rpc.h"
  2. #include "rl_subscription.h"
  3. #include "rls_data.h"
  4. #include "../../dprint.h"
  5. #include <unistd.h>
  6. /*
  7. #define rpc_lf(rpc, c) rpc->add(c, "s","")
  8. rpc->printf(c, " %.*s contact=\'%.*s\' exp=%u status=%d published=%d (id=%.*s)",
  9. FMT_STR(t->id), FMT_STR(t->contact), t->expires - time(NULL),
  10. (int)t->state, t->is_published, FMT_STR(t->published_id));
  11. rpc_lf(rpc, c);
  12. */
  13. /* #define rpc_lf(rpc, c) rpc->add(c, "s","") */
  14. #define rpc_lf(rpc, c) do { } while (0)
  15. static void trace_vs(rpc_t *rpc, void *c, virtual_subscription_t *vs, int details)
  16. {
  17. rpc->printf(c, " Virtual subscriptions:");
  18. rpc_lf(rpc, c);
  19. rpc->printf(c, " -> URI = %.*s", FMT_STR(vs->uri));
  20. rpc_lf(rpc, c);
  21. rpc->printf(c, " -> status = %d", vs->status);
  22. rpc_lf(rpc, c);
  23. if (details > 0) {
  24. rpc->printf(c, " -> document = %.*s", FMT_STR(vs->state_document));
  25. rpc_lf(rpc, c);
  26. }
  27. rpc_lf(rpc, c);
  28. }
  29. static void rls_trace_subscription(rpc_t *rpc, void *c, rl_subscription_t *s, int details)
  30. {
  31. virtual_subscription_t *vs;
  32. int cnt, i;
  33. switch (s->type) {
  34. case rls_internal_subscription:
  35. rpc->printf(c, "URI = %.*s", FMT_STR(*s->u.internal.record_id));
  36. rpc_lf(rpc, c);
  37. break;
  38. case rls_external_subscription:
  39. rpc->printf(c, "URI = %.*s", FMT_STR(s->u.external.record_id));
  40. rpc_lf(rpc, c);
  41. break;
  42. }
  43. cnt = ptr_vector_size(&s->vs);
  44. for (i = 0; i < cnt; i++) {
  45. vs = ptr_vector_get(&s->vs, i);
  46. if (!vs) continue;
  47. if (details > 0) trace_vs(rpc, c, vs, details - 1);
  48. }
  49. rpc_lf(rpc, c);
  50. }
  51. static void rls_trace(rpc_t *rpc, void *c)
  52. {
  53. int i = 0;
  54. subscription_data_t *s;
  55. rl_subscription_t *rs;
  56. int details = 0;
  57. if (rpc->scan(c, "d", &details) <= 0)
  58. details = 0;
  59. rpc->fault(c, 200, "OK");
  60. rpc->add(c, "s", "RLS Trace:");
  61. if (!rls) {
  62. rpc->printf(c, "problems");
  63. rpc->send(c);
  64. return;
  65. }
  66. s = rls_manager->first;
  67. while (s) {
  68. i++;
  69. rs = (rl_subscription_t*)(s->usr_data);
  70. if (details > 0) rls_trace_subscription(rpc, c, rs, details);
  71. s = s->next;
  72. }
  73. rpc->printf(c, "subscription count: %d", i);
  74. rpc_lf(rpc, c);
  75. rpc->send(c);
  76. }
  77. /* ----- exported data structure with methods ----- */
  78. static const char* rls_trace_doc[] = {
  79. "RLS trace.", /* Documentation string */
  80. 0 /* Method signature(s) */
  81. };
  82. /*
  83. * RPC Methods exported by this module
  84. */
  85. rpc_export_t rls_rpc_methods[] = {
  86. {"rls.trace", rls_trace, rls_trace_doc, 0},
  87. {0, 0, 0, 0}
  88. };