storage_engine.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. .change_collection_frequency = rrddim_store_metric_change_collection_frequency, \
  13. .metrics_group_get = rrddim_metrics_group_get, \
  14. .metrics_group_release = rrddim_metrics_group_release, \
  15. }
  16. #define im_query_ops { \
  17. .init = rrddim_query_init, \
  18. .next_metric = rrddim_query_next_metric, \
  19. .is_finished = rrddim_query_is_finished, \
  20. .finalize = rrddim_query_finalize, \
  21. .latest_time_s = rrddim_query_latest_time_s, \
  22. .oldest_time_s = rrddim_query_oldest_time_s, \
  23. .align_to_optimal_before = rrddim_query_align_to_optimal_before, \
  24. }
  25. static STORAGE_ENGINE engines[] = {
  26. {
  27. .id = RRD_MEMORY_MODE_NONE,
  28. .name = RRD_MEMORY_MODE_NONE_NAME,
  29. .api = {
  30. .metric_get = rrddim_metric_get,
  31. .metric_get_or_create = rrddim_metric_get_or_create,
  32. .metric_dup = rrddim_metric_dup,
  33. .metric_release = rrddim_metric_release,
  34. .metric_retention_by_uuid = rrddim_metric_retention_by_uuid,
  35. .collect_ops = im_collect_ops,
  36. .query_ops = im_query_ops,
  37. }
  38. },
  39. {
  40. .id = RRD_MEMORY_MODE_RAM,
  41. .name = RRD_MEMORY_MODE_RAM_NAME,
  42. .api = {
  43. .metric_get = rrddim_metric_get,
  44. .metric_get_or_create = rrddim_metric_get_or_create,
  45. .metric_dup = rrddim_metric_dup,
  46. .metric_release = rrddim_metric_release,
  47. .metric_retention_by_uuid = rrddim_metric_retention_by_uuid,
  48. .collect_ops = im_collect_ops,
  49. .query_ops = im_query_ops,
  50. }
  51. },
  52. {
  53. .id = RRD_MEMORY_MODE_MAP,
  54. .name = RRD_MEMORY_MODE_MAP_NAME,
  55. .api = {
  56. .metric_get = rrddim_metric_get,
  57. .metric_get_or_create = rrddim_metric_get_or_create,
  58. .metric_dup = rrddim_metric_dup,
  59. .metric_release = rrddim_metric_release,
  60. .metric_retention_by_uuid = rrddim_metric_retention_by_uuid,
  61. .collect_ops = im_collect_ops,
  62. .query_ops = im_query_ops,
  63. }
  64. },
  65. {
  66. .id = RRD_MEMORY_MODE_SAVE,
  67. .name = RRD_MEMORY_MODE_SAVE_NAME,
  68. .api = {
  69. .metric_get = rrddim_metric_get,
  70. .metric_get_or_create = rrddim_metric_get_or_create,
  71. .metric_dup = rrddim_metric_dup,
  72. .metric_release = rrddim_metric_release,
  73. .metric_retention_by_uuid = rrddim_metric_retention_by_uuid,
  74. .collect_ops = im_collect_ops,
  75. .query_ops = im_query_ops,
  76. }
  77. },
  78. {
  79. .id = RRD_MEMORY_MODE_ALLOC,
  80. .name = RRD_MEMORY_MODE_ALLOC_NAME,
  81. .api = {
  82. .metric_get = rrddim_metric_get,
  83. .metric_get_or_create = rrddim_metric_get_or_create,
  84. .metric_dup = rrddim_metric_dup,
  85. .metric_release = rrddim_metric_release,
  86. .metric_retention_by_uuid = rrddim_metric_retention_by_uuid,
  87. .collect_ops = im_collect_ops,
  88. .query_ops = im_query_ops,
  89. }
  90. },
  91. #ifdef ENABLE_DBENGINE
  92. {
  93. .id = RRD_MEMORY_MODE_DBENGINE,
  94. .name = RRD_MEMORY_MODE_DBENGINE_NAME,
  95. .api = {
  96. .metric_get = rrdeng_metric_get,
  97. .metric_get_or_create = rrdeng_metric_get_or_create,
  98. .metric_dup = rrdeng_metric_dup,
  99. .metric_release = rrdeng_metric_release,
  100. .metric_retention_by_uuid = rrdeng_metric_retention_by_uuid,
  101. .collect_ops = {
  102. .init = rrdeng_store_metric_init,
  103. .store_metric = rrdeng_store_metric_next,
  104. .flush = rrdeng_store_metric_flush_current_page,
  105. .finalize = rrdeng_store_metric_finalize,
  106. .change_collection_frequency = rrdeng_store_metric_change_collection_frequency,
  107. .metrics_group_get = rrdeng_metrics_group_get,
  108. .metrics_group_release = rrdeng_metrics_group_release,
  109. },
  110. .query_ops = {
  111. .init = rrdeng_load_metric_init,
  112. .next_metric = rrdeng_load_metric_next,
  113. .is_finished = rrdeng_load_metric_is_finished,
  114. .finalize = rrdeng_load_metric_finalize,
  115. .latest_time_s = rrdeng_metric_latest_time,
  116. .oldest_time_s = rrdeng_metric_oldest_time,
  117. .align_to_optimal_before = rrdeng_load_align_to_optimal_before,
  118. }
  119. }
  120. },
  121. #endif
  122. { .id = RRD_MEMORY_MODE_NONE, .name = NULL }
  123. };
  124. STORAGE_ENGINE* storage_engine_find(const char* name)
  125. {
  126. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  127. if (strcmp(it->name, name) == 0)
  128. return it;
  129. }
  130. return NULL;
  131. }
  132. STORAGE_ENGINE* storage_engine_get(RRD_MEMORY_MODE mmode)
  133. {
  134. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  135. if (it->id == mmode)
  136. return it;
  137. }
  138. return NULL;
  139. }
  140. STORAGE_ENGINE* storage_engine_foreach_init()
  141. {
  142. // Assuming at least one engine exists
  143. return &engines[0];
  144. }
  145. STORAGE_ENGINE* storage_engine_foreach_next(STORAGE_ENGINE* it)
  146. {
  147. if (!it || !it->name)
  148. return NULL;
  149. it++;
  150. return it->name ? it : NULL;
  151. }