parser.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_INCREMENTAL_PARSER_H
  3. #define NETDATA_INCREMENTAL_PARSER_H 1
  4. #include "../libnetdata.h"
  5. #define WORKER_PARSER_FIRST_JOB 3
  6. // this has to be in-sync with the same at receiver.c
  7. #define WORKER_RECEIVER_JOB_REPLICATION_COMPLETION (WORKER_PARSER_FIRST_JOB - 3)
  8. #define PARSER_KEYWORDS_HASHTABLE_SIZE 73 // unittest finds this magic number
  9. //#define parser_hash_function(s) djb2_hash32(s)
  10. //#define parser_hash_function(s) fnv1_hash32(s)
  11. //#define parser_hash_function(s) fnv1a_hash32(s)
  12. //#define parser_hash_function(s) larson_hash32(s)
  13. #define parser_hash_function(s) pluginsd_parser_hash32(s)
  14. // PARSER return codes
  15. typedef enum __attribute__ ((__packed__)) parser_rc {
  16. PARSER_RC_OK, // Callback was successful, go on
  17. PARSER_RC_STOP, // Callback says STOP
  18. PARSER_RC_ERROR // Callback failed (abort rest of callbacks)
  19. } PARSER_RC;
  20. typedef enum __attribute__ ((__packed__)) parser_input_type {
  21. PARSER_INPUT_SPLIT = (1 << 1),
  22. PARSER_DEFER_UNTIL_KEYWORD = (1 << 2),
  23. } PARSER_INPUT_TYPE;
  24. typedef PARSER_RC (*keyword_function)(char **words, size_t num_words, void *user_data);
  25. typedef struct parser_keyword {
  26. size_t worker_job_id;
  27. char *keyword;
  28. keyword_function func;
  29. } PARSER_KEYWORD;
  30. typedef struct parser {
  31. size_t worker_job_next_id;
  32. uint8_t version; // Parser version
  33. int fd; // Socket
  34. FILE *fp_input; // Input source e.g. stream
  35. FILE *fp_output; // Stream to send commands to plugin
  36. #ifdef ENABLE_HTTPS
  37. struct netdata_ssl *ssl_output;
  38. #endif
  39. void *user; // User defined structure to hold extra state between calls
  40. uint32_t flags;
  41. size_t line;
  42. struct {
  43. PARSER_KEYWORD *hashtable[PARSER_KEYWORDS_HASHTABLE_SIZE];
  44. } keywords;
  45. struct {
  46. const char *end_keyword;
  47. BUFFER *response;
  48. void (*action)(struct parser *parser, void *action_data);
  49. void *action_data;
  50. } defer;
  51. struct {
  52. DICTIONARY *functions;
  53. usec_t smaller_timeout;
  54. } inflight;
  55. } PARSER;
  56. PARSER *parser_init(void *user, FILE *fp_input, FILE *fp_output, int fd, PARSER_INPUT_TYPE flags, void *ssl);
  57. void parser_add_keyword(PARSER *working_parser, char *keyword, keyword_function func);
  58. int parser_next(PARSER *working_parser, char *buffer, size_t buffer_size);
  59. int parser_action(PARSER *working_parser, char *input);
  60. void parser_destroy(PARSER *working_parser);
  61. PARSER_RC pluginsd_set(char **words, size_t num_words, void *user);
  62. PARSER_RC pluginsd_begin(char **words, size_t num_words, void *user);
  63. PARSER_RC pluginsd_end(char **words, size_t num_words, void *user);
  64. PARSER_RC pluginsd_chart(char **words, size_t num_words, void *user);
  65. PARSER_RC pluginsd_chart_definition_end(char **words, size_t num_words, void *user);
  66. PARSER_RC pluginsd_dimension(char **words, size_t num_words, void *user);
  67. PARSER_RC pluginsd_variable(char **words, size_t num_words, void *user);
  68. PARSER_RC pluginsd_flush(char **words, size_t num_words, void *user);
  69. PARSER_RC pluginsd_disable(char **words, size_t num_words, void *user);
  70. PARSER_RC pluginsd_label(char **words, size_t num_words, void *user);
  71. PARSER_RC pluginsd_overwrite(char **words, size_t num_words, void *user);
  72. PARSER_RC pluginsd_clabel_commit(char **words, size_t num_words, void *user);
  73. PARSER_RC pluginsd_clabel(char **words, size_t num_words, void *user);
  74. PARSER_RC pluginsd_replay_begin(char **words, size_t num_words, void *user);
  75. PARSER_RC pluginsd_replay_rrddim_collection_state(char **words, size_t num_words, void *user);
  76. PARSER_RC pluginsd_replay_rrdset_collection_state(char **words, size_t num_words, void *user);
  77. PARSER_RC pluginsd_replay_set(char **words, size_t num_words, void *user);
  78. PARSER_RC pluginsd_replay_end(char **words, size_t num_words, void *user);
  79. PARSER_RC pluginsd_begin_v2(char **words, size_t num_words, void *user);
  80. PARSER_RC pluginsd_set_v2(char **words, size_t num_words, void *user);
  81. PARSER_RC pluginsd_end_v2(char **words, size_t num_words, void *user);
  82. void pluginsd_cleanup_v2(void *user);
  83. #endif