storage_engine.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. .finalize = rrddim_collect_finalize\
  11. }
  12. #define im_query_ops { \
  13. .init = rrddim_query_init, \
  14. .next_metric = rrddim_query_next_metric, \
  15. .is_finished = rrddim_query_is_finished, \
  16. .finalize = rrddim_query_finalize, \
  17. .latest_time = rrddim_query_latest_time, \
  18. .oldest_time = rrddim_query_oldest_time \
  19. }
  20. static STORAGE_ENGINE engines[] = {
  21. {
  22. .id = RRD_MEMORY_MODE_NONE,
  23. .name = RRD_MEMORY_MODE_NONE_NAME,
  24. .api = {
  25. .collect_ops = im_collect_ops,
  26. .query_ops = im_query_ops
  27. }
  28. },
  29. {
  30. .id = RRD_MEMORY_MODE_RAM,
  31. .name = RRD_MEMORY_MODE_RAM_NAME,
  32. .api = {
  33. .collect_ops = im_collect_ops,
  34. .query_ops = im_query_ops
  35. }
  36. },
  37. {
  38. .id = RRD_MEMORY_MODE_MAP,
  39. .name = RRD_MEMORY_MODE_MAP_NAME,
  40. .api = {
  41. .collect_ops = im_collect_ops,
  42. .query_ops = im_query_ops
  43. }
  44. },
  45. {
  46. .id = RRD_MEMORY_MODE_SAVE,
  47. .name = RRD_MEMORY_MODE_SAVE_NAME,
  48. .api = {
  49. .collect_ops = im_collect_ops,
  50. .query_ops = im_query_ops
  51. }
  52. },
  53. {
  54. .id = RRD_MEMORY_MODE_ALLOC,
  55. .name = RRD_MEMORY_MODE_ALLOC_NAME,
  56. .api = {
  57. .collect_ops = im_collect_ops,
  58. .query_ops = im_query_ops
  59. }
  60. },
  61. #ifdef ENABLE_DBENGINE
  62. {
  63. .id = RRD_MEMORY_MODE_DBENGINE,
  64. .name = RRD_MEMORY_MODE_DBENGINE_NAME,
  65. .api = {
  66. .collect_ops = {
  67. .init = rrdeng_store_metric_init,
  68. .store_metric = rrdeng_store_metric_next,
  69. .finalize = rrdeng_store_metric_finalize
  70. },
  71. .query_ops = {
  72. .init = rrdeng_load_metric_init,
  73. .next_metric = rrdeng_load_metric_next,
  74. .is_finished = rrdeng_load_metric_is_finished,
  75. .finalize = rrdeng_load_metric_finalize,
  76. .latest_time = rrdeng_metric_latest_time,
  77. .oldest_time = rrdeng_metric_oldest_time
  78. }
  79. }
  80. },
  81. #endif
  82. { .id = RRD_MEMORY_MODE_NONE, .name = NULL }
  83. };
  84. STORAGE_ENGINE* storage_engine_find(const char* name)
  85. {
  86. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  87. if (strcmp(it->name, name) == 0)
  88. return it;
  89. }
  90. return NULL;
  91. }
  92. STORAGE_ENGINE* storage_engine_get(RRD_MEMORY_MODE mmode)
  93. {
  94. for (STORAGE_ENGINE* it = engines; it->name; it++) {
  95. if (it->id == mmode)
  96. return it;
  97. }
  98. return NULL;
  99. }
  100. STORAGE_ENGINE* storage_engine_foreach_init()
  101. {
  102. // Assuming at least one engine exists
  103. return &engines[0];
  104. }
  105. STORAGE_ENGINE* storage_engine_foreach_next(STORAGE_ENGINE* it)
  106. {
  107. if (!it || !it->name)
  108. return NULL;
  109. it++;
  110. return it->name ? it : NULL;
  111. }