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