storage_engine.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "storage_engine.h"
  3. #include "ram/rrddim_mem.h"
  4. #ifdef ENABLE_DBENGINE
  5. #include "engine/rrdengineapi.h"
  6. #endif
  7. #define im_collect_ops { \
  8. .init = rrddim_collect_init,\
  9. .store_metric = rrddim_collect_store_metric,\
  10. .flush = rrddim_store_metric_flush,\
  11. .finalize = rrddim_collect_finalize\
  12. }
  13. #define im_query_ops { \
  14. .init = rrddim_query_init, \
  15. .next_metric = rrddim_query_next_metric, \
  16. .is_finished = rrddim_query_is_finished, \
  17. .finalize = rrddim_query_finalize, \
  18. .latest_time = rrddim_query_latest_time, \
  19. .oldest_time = rrddim_query_oldest_time \
  20. }
  21. static STORAGE_ENGINE engines[] = {
  22. {
  23. .id = RRD_MEMORY_MODE_NONE,
  24. .name = RRD_MEMORY_MODE_NONE_NAME,
  25. .api = {
  26. .init = rrddim_metric_init,
  27. .free = rrddim_metric_free,
  28. .collect_ops = im_collect_ops,
  29. .query_ops = im_query_ops
  30. }
  31. },
  32. {
  33. .id = RRD_MEMORY_MODE_RAM,
  34. .name = RRD_MEMORY_MODE_RAM_NAME,
  35. .api = {
  36. .init = rrddim_metric_init,
  37. .free = rrddim_metric_free,
  38. .collect_ops = im_collect_ops,
  39. .query_ops = im_query_ops
  40. }
  41. },
  42. {
  43. .id = RRD_MEMORY_MODE_MAP,
  44. .name = RRD_MEMORY_MODE_MAP_NAME,
  45. .api = {
  46. .init = rrddim_metric_init,
  47. .free = rrddim_metric_free,
  48. .collect_ops = im_collect_ops,
  49. .query_ops = im_query_ops
  50. }
  51. },
  52. {
  53. .id = RRD_MEMORY_MODE_SAVE,
  54. .name = RRD_MEMORY_MODE_SAVE_NAME,
  55. .api = {
  56. .init = rrddim_metric_init,
  57. .free = rrddim_metric_free,
  58. .collect_ops = im_collect_ops,
  59. .query_ops = im_query_ops
  60. }
  61. },
  62. {
  63. .id = RRD_MEMORY_MODE_ALLOC,
  64. .name = RRD_MEMORY_MODE_ALLOC_NAME,
  65. .api = {
  66. .init = rrddim_metric_init,
  67. .free = rrddim_metric_free,
  68. .collect_ops = im_collect_ops,
  69. .query_ops = im_query_ops
  70. }
  71. },
  72. #ifdef ENABLE_DBENGINE
  73. {
  74. .id = RRD_MEMORY_MODE_DBENGINE,
  75. .name = RRD_MEMORY_MODE_DBENGINE_NAME,
  76. .api = {
  77. .init = rrdeng_metric_init,
  78. .free = rrdeng_metric_free,
  79. .collect_ops = {
  80. .init = rrdeng_store_metric_init,
  81. .store_metric = rrdeng_store_metric_next,
  82. .flush = rrdeng_store_metric_flush_current_page,
  83. .finalize = rrdeng_store_metric_finalize
  84. },
  85. .query_ops = {
  86. .init = rrdeng_load_metric_init,
  87. .next_metric = rrdeng_load_metric_next,
  88. .is_finished = rrdeng_load_metric_is_finished,
  89. .finalize = rrdeng_load_metric_finalize,
  90. .latest_time = rrdeng_metric_latest_time,
  91. .oldest_time = rrdeng_metric_oldest_time
  92. }
  93. }
  94. },
  95. #endif
  96. { .id = RRD_MEMORY_MODE_NONE, .name = NULL }
  97. };
  98. STORAGE_ENGINE* storage_engine_find(const char* name)
  99. {
  100. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  101. if (strcmp(it->name, name) == 0)
  102. return it;
  103. }
  104. return NULL;
  105. }
  106. STORAGE_ENGINE* storage_engine_get(RRD_MEMORY_MODE mmode)
  107. {
  108. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  109. if (it->id == mmode)
  110. return it;
  111. }
  112. return NULL;
  113. }
  114. STORAGE_ENGINE* storage_engine_foreach_init()
  115. {
  116. // Assuming at least one engine exists
  117. return &engines[0];
  118. }
  119. STORAGE_ENGINE* storage_engine_foreach_next(STORAGE_ENGINE* it)
  120. {
  121. if (!it || !it->name)
  122. return NULL;
  123. it++;
  124. return it->name ? it : NULL;
  125. }