@cryptotaxi247 / netdata-1 / commits / aacba0b59

Use prepared statements for context related queries (#13602)

Stelios Fragkakis committed Sep 1, 2022 at 16:23 UTC aacba0b59705a260f5d37bfcd7a87d3e6fbed561
1 file changed +39 -31
database/sqlite/sqlite_context.c
+39 -31
@@ -130,17 +130,19 @@ void sql_close_context_database(void)
130 void ctx_get_chart_list(uuid_t *host_uuid, void (*dict_cb)(SQL_CHART_DATA *, void *), void *data)
131 {
132 int rc;
133 - sqlite3_stmt *res = NULL;
133 + static __thread sqlite3_stmt *res = NULL;
134
135 if (unlikely(!host_uuid)) {
136 internal_error(true, "Requesting context chart list without host_id");
137 return;
138 }
139
140 - rc = sqlite3_prepare_v2(db_context_meta, CTX_GET_CHART_LIST, -1, &res, 0);
141 - if (unlikely(rc != SQLITE_OK)) {
142 - error_report("Failed to prepare statement to fetch chart list");
143 - return;
140 + if (unlikely(!res)) {
141 + rc = prepare_statement(db_context_meta, CTX_GET_CHART_LIST, &res);
142 + if (rc != SQLITE_OK) {
143 + error_report("Failed to prepare statement to fetch chart list");
144 + return;
145 + }
146 }
147
148 rc = sqlite3_bind_blob(res, 1, host_uuid, sizeof(*host_uuid), SQLITE_STATIC);
@@ -165,9 +167,9 @@ void ctx_get_chart_list(uuid_t *host_uuid, void (*dict_cb)(SQL_CHART_DATA *, voi
167 }
168
169 skip_load:
168 - rc = sqlite3_finalize(res);
170 + rc = sqlite3_reset(res);
171 if (rc != SQLITE_OK)
170 - error_report("Failed to finalize statement that fetches chart label data, rc = %d", rc);
172 + error_report("Failed to reset statement that fetches chart label data, rc = %d", rc);
173 }
174
175 // Dimension list
@@ -175,12 +177,14 @@ skip_load:
177 void ctx_get_dimension_list(uuid_t *chart_uuid, void (*dict_cb)(SQL_DIMENSION_DATA *, void *), void *data)
178 {
179 int rc;
178 - sqlite3_stmt *res = NULL;
179 -
180 - rc = sqlite3_prepare_v2(db_context_meta, CTX_GET_DIMENSION_LIST, -1, &res, 0);
181 - if (unlikely(rc != SQLITE_OK)) {
182 - error_report("Failed to prepare statement to fetch chart dimension data");
183 - return;
180 + static __thread sqlite3_stmt *res = NULL;
181 +
182 + if (unlikely(!res)) {
183 + rc = prepare_statement(db_context_meta, CTX_GET_DIMENSION_LIST, &res);
184 + if (rc != SQLITE_OK) {
185 + error_report("Failed to prepare statement to fetch chart dimension data");
186 + return;
187 + }
188 }
189
190 rc = sqlite3_bind_blob(res, 1, chart_uuid, sizeof(*chart_uuid), SQLITE_STATIC);
@@ -199,9 +203,9 @@ void ctx_get_dimension_list(uuid_t *chart_uuid, void (*dict_cb)(SQL_DIMENSION_DA
203 }
204
205 failed:
202 - rc = sqlite3_finalize(res);
206 + rc = sqlite3_reset(res);
207 if (rc != SQLITE_OK)
204 - error_report("Failed to finalize statement that fetches the chart dimension list, rc = %d", rc);
208 + error_report("Failed to reset statement that fetches the chart dimension list, rc = %d", rc);
209 }
210
211 // LABEL LIST
@@ -209,12 +213,14 @@ failed:
213 void ctx_get_label_list(uuid_t *chart_uuid, void (*dict_cb)(SQL_CLABEL_DATA *, void *), void *data)
214 {
215 int rc;
212 - sqlite3_stmt *res = NULL;
213 -
214 - rc = sqlite3_prepare_v2(db_context_meta, CTX_GET_LABEL_LIST, -1, &res, 0);
215 - if (unlikely(rc != SQLITE_OK)) {
216 - error_report("Failed to prepare statement to fetch chart lanbels");
217 - return;
216 + static __thread sqlite3_stmt *res = NULL;
217 +
218 + if (unlikely(!res)) {
219 + rc = prepare_statement(db_context_meta, CTX_GET_LABEL_LIST, &res);
220 + if (rc != SQLITE_OK) {
221 + error_report("Failed to prepare statement to fetch chart labels");
222 + return;
223 + }
224 }
225
226 rc = sqlite3_bind_blob(res, 1, chart_uuid, sizeof(*chart_uuid), SQLITE_STATIC);
@@ -233,9 +239,9 @@ void ctx_get_label_list(uuid_t *chart_uuid, void (*dict_cb)(SQL_CLABEL_DATA *, v
239 }
240
241 failed:
236 - rc = sqlite3_finalize(res);
242 + rc = sqlite3_reset(res);
243 if (rc != SQLITE_OK)
238 - error_report("Failed to finalize statement that fetches chart label data, rc = %d", rc);
244 + error_report("Failed to reset statement that fetches chart label data, rc = %d", rc);
245
246 return;
247 }
@@ -250,12 +256,14 @@ void ctx_get_context_list(uuid_t *host_uuid, void (*dict_cb)(VERSIONED_CONTEXT_D
256 return;
257
258 int rc;
253 - sqlite3_stmt *res = NULL;
254 -
255 - rc = sqlite3_prepare_v2(db_context_meta, CTX_GET_CONTEXT_LIST, -1, &res, 0);
256 - if (unlikely(rc != SQLITE_OK)) {
257 - error_report("Failed to prepare statement to fetch stored context list");
258 - return;
259 + static __thread sqlite3_stmt *res = NULL;
260 +
261 + if (unlikely(!res)) {
262 + rc = prepare_statement(db_context_meta, CTX_GET_CONTEXT_LIST, &res);
263 + if (rc != SQLITE_OK) {
264 + error_report("Failed to prepare statement to fetch stored context list");
265 + return;
266 + }
267 }
268
269 VERSIONED_CONTEXT_DATA context_data = {0};
@@ -282,9 +290,9 @@ void ctx_get_context_list(uuid_t *host_uuid, void (*dict_cb)(VERSIONED_CONTEXT_D
290 }
291
292 failed:
285 - rc = sqlite3_finalize(res);
293 + rc = sqlite3_reset(res);
294 if (rc != SQLITE_OK)
287 - error_report("Failed to finalize statement that fetches stored context versioned data, rc = %d", rc);
295 + error_report("Failed to reset statement that fetches stored context versioned data, rc = %d", rc);
296 }
297
298