diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-02-26 00:34:16 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-02-26 00:34:16 +0100 |
commit | eb1c2236158eba266de1bc91d75d9c6d0714252b (patch) | |
tree | 65f0c65a42524fb1529ffa8051a2f7181a813d8f /src/datastore | |
parent | 07f48a8e74b61f518a4b169075cb0a1cb1419166 (diff) | |
download | gnunet-eb1c2236158eba266de1bc91d75d9c6d0714252b.tar.gz gnunet-eb1c2236158eba266de1bc91d75d9c6d0714252b.zip |
fix crash in test if DB did not yet exist
Diffstat (limited to 'src/datastore')
-rw-r--r-- | src/datastore/plugin_datastore_sqlite.c | 52 | ||||
-rw-r--r-- | src/datastore/test_datastore_api_management.c | 19 |
2 files changed, 52 insertions, 19 deletions
diff --git a/src/datastore/plugin_datastore_sqlite.c b/src/datastore/plugin_datastore_sqlite.c index 028117d26..9ab50714f 100644 --- a/src/datastore/plugin_datastore_sqlite.c +++ b/src/datastore/plugin_datastore_sqlite.c | |||
@@ -229,35 +229,41 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
229 | { | 229 | { |
230 | sqlite3_stmt *stmt; | 230 | sqlite3_stmt *stmt; |
231 | char *afsdir; | 231 | char *afsdir; |
232 | |||
233 | #if ENULL_DEFINED | 232 | #if ENULL_DEFINED |
234 | char *e; | 233 | char *e; |
235 | #endif | 234 | #endif |
236 | 235 | ||
237 | if (GNUNET_OK != | 236 | if (GNUNET_OK != |
238 | GNUNET_CONFIGURATION_get_value_filename (cfg, "datastore-sqlite", | 237 | GNUNET_CONFIGURATION_get_value_filename (cfg, |
239 | "FILENAME", &afsdir)) | 238 | "datastore-sqlite", |
239 | "FILENAME", | ||
240 | &afsdir)) | ||
240 | { | 241 | { |
241 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, | 242 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, |
242 | "datastore-sqlite", "FILENAME"); | 243 | "datastore-sqlite", |
244 | "FILENAME"); | ||
243 | return GNUNET_SYSERR; | 245 | return GNUNET_SYSERR; |
244 | } | 246 | } |
245 | if (GNUNET_OK != GNUNET_DISK_file_test (afsdir)) | 247 | if (GNUNET_OK != GNUNET_DISK_file_test (afsdir)) |
246 | { | 248 | { |
247 | if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (afsdir)) | 249 | if (GNUNET_OK != |
250 | GNUNET_DISK_directory_create_for_file (afsdir)) | ||
248 | { | 251 | { |
249 | GNUNET_break (0); | 252 | GNUNET_break (0); |
250 | GNUNET_free (afsdir); | 253 | GNUNET_free (afsdir); |
251 | return GNUNET_SYSERR; | 254 | return GNUNET_SYSERR; |
252 | } | 255 | } |
253 | /* database is new or got deleted, reset payload to zero! */ | 256 | /* database is new or got deleted, reset payload to zero! */ |
254 | plugin->env->duc (plugin->env->cls, 0); | 257 | if (NULL != plugin->env->duc) |
258 | plugin->env->duc (plugin->env->cls, | ||
259 | 0); | ||
255 | } | 260 | } |
256 | /* afsdir should be UTF-8-encoded. If it isn't, it's a bug */ | 261 | /* afsdir should be UTF-8-encoded. If it isn't, it's a bug */ |
257 | plugin->fn = afsdir; | 262 | plugin->fn = afsdir; |
258 | 263 | ||
259 | /* Open database and precompile statements */ | 264 | /* Open database and precompile statements */ |
260 | if (sqlite3_open (plugin->fn, &plugin->dbh) != SQLITE_OK) | 265 | if (SQLITE_OK != |
266 | sqlite3_open (plugin->fn, &plugin->dbh)) | ||
261 | { | 267 | { |
262 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "sqlite", | 268 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "sqlite", |
263 | _("Unable to initialize SQLite: %s.\n"), | 269 | _("Unable to initialize SQLite: %s.\n"), |
@@ -265,25 +271,32 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
265 | return GNUNET_SYSERR; | 271 | return GNUNET_SYSERR; |
266 | } | 272 | } |
267 | CHECK (SQLITE_OK == | 273 | CHECK (SQLITE_OK == |
268 | sqlite3_exec (plugin->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, | 274 | sqlite3_exec (plugin->dbh, |
275 | "PRAGMA temp_store=MEMORY", NULL, NULL, | ||
269 | ENULL)); | 276 | ENULL)); |
270 | CHECK (SQLITE_OK == | 277 | CHECK (SQLITE_OK == |
271 | sqlite3_exec (plugin->dbh, "PRAGMA synchronous=OFF", NULL, NULL, | 278 | sqlite3_exec (plugin->dbh, |
279 | "PRAGMA synchronous=OFF", NULL, NULL, | ||
272 | ENULL)); | 280 | ENULL)); |
273 | CHECK (SQLITE_OK == | 281 | CHECK (SQLITE_OK == |
274 | sqlite3_exec (plugin->dbh, "PRAGMA legacy_file_format=OFF", NULL, NULL, | 282 | sqlite3_exec (plugin->dbh, |
283 | "PRAGMA legacy_file_format=OFF", NULL, NULL, | ||
275 | ENULL)); | 284 | ENULL)); |
276 | CHECK (SQLITE_OK == | 285 | CHECK (SQLITE_OK == |
277 | sqlite3_exec (plugin->dbh, "PRAGMA auto_vacuum=INCREMENTAL", NULL, | 286 | sqlite3_exec (plugin->dbh, |
287 | "PRAGMA auto_vacuum=INCREMENTAL", NULL, | ||
278 | NULL, ENULL)); | 288 | NULL, ENULL)); |
279 | CHECK (SQLITE_OK == | 289 | CHECK (SQLITE_OK == |
280 | sqlite3_exec (plugin->dbh, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, | 290 | sqlite3_exec (plugin->dbh, |
291 | "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, | ||
281 | ENULL)); | 292 | ENULL)); |
282 | CHECK (SQLITE_OK == | 293 | CHECK (SQLITE_OK == |
283 | sqlite3_exec (plugin->dbh, "PRAGMA page_size=4092", NULL, NULL, | 294 | sqlite3_exec (plugin->dbh, |
295 | "PRAGMA page_size=4092", NULL, NULL, | ||
284 | ENULL)); | 296 | ENULL)); |
285 | 297 | ||
286 | CHECK (SQLITE_OK == sqlite3_busy_timeout (plugin->dbh, BUSY_TIMEOUT_MS)); | 298 | CHECK (SQLITE_OK == |
299 | sqlite3_busy_timeout (plugin->dbh, BUSY_TIMEOUT_MS)); | ||
287 | 300 | ||
288 | 301 | ||
289 | /* We have to do it here, because otherwise precompiling SQL might fail */ | 302 | /* We have to do it here, because otherwise precompiling SQL might fail */ |
@@ -552,7 +565,9 @@ sqlite_plugin_put (void *cls, | |||
552 | switch (n) | 565 | switch (n) |
553 | { | 566 | { |
554 | case SQLITE_DONE: | 567 | case SQLITE_DONE: |
555 | plugin->env->duc (plugin->env->cls, size + GNUNET_DATASTORE_ENTRY_OVERHEAD); | 568 | if (NULL != plugin->env->duc) |
569 | plugin->env->duc (plugin->env->cls, | ||
570 | size + GNUNET_DATASTORE_ENTRY_OVERHEAD); | ||
556 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "sqlite", | 571 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "sqlite", |
557 | "Stored new entry (%u bytes)\n", | 572 | "Stored new entry (%u bytes)\n", |
558 | size + GNUNET_DATASTORE_ENTRY_OVERHEAD); | 573 | size + GNUNET_DATASTORE_ENTRY_OVERHEAD); |
@@ -694,7 +709,8 @@ execute_get (struct Plugin *plugin, | |||
694 | LOG_SQLITE (plugin, | 709 | LOG_SQLITE (plugin, |
695 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 710 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |
696 | "sqlite3_reset"); | 711 | "sqlite3_reset"); |
697 | if (GNUNET_OK == delete_by_rowid (plugin, rowid)) | 712 | if ( (GNUNET_OK == delete_by_rowid (plugin, rowid)) && |
713 | (NULL != plugin->env->duc) ) | ||
698 | plugin->env->duc (plugin->env->cls, | 714 | plugin->env->duc (plugin->env->cls, |
699 | -(size + GNUNET_DATASTORE_ENTRY_OVERHEAD)); | 715 | -(size + GNUNET_DATASTORE_ENTRY_OVERHEAD)); |
700 | break; | 716 | break; |
@@ -713,7 +729,9 @@ execute_get (struct Plugin *plugin, | |||
713 | LOG_SQLITE (plugin, | 729 | LOG_SQLITE (plugin, |
714 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 730 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |
715 | "sqlite3_reset"); | 731 | "sqlite3_reset"); |
716 | if ((GNUNET_NO == ret) && (GNUNET_OK == delete_by_rowid (plugin, rowid))) | 732 | if ( (GNUNET_NO == ret) && |
733 | (GNUNET_OK == delete_by_rowid (plugin, rowid)) && | ||
734 | (NULL != plugin->env->duc) ) | ||
717 | plugin->env->duc (plugin->env->cls, | 735 | plugin->env->duc (plugin->env->cls, |
718 | -(size + GNUNET_DATASTORE_ENTRY_OVERHEAD)); | 736 | -(size + GNUNET_DATASTORE_ENTRY_OVERHEAD)); |
719 | return; | 737 | return; |
diff --git a/src/datastore/test_datastore_api_management.c b/src/datastore/test_datastore_api_management.c index 5e536d6c5..9a3e5446b 100644 --- a/src/datastore/test_datastore_api_management.c +++ b/src/datastore/test_datastore_api_management.c | |||
@@ -298,7 +298,21 @@ run (void *cls, | |||
298 | 298 | ||
299 | 299 | ||
300 | /** | 300 | /** |
301 | * check if plugin is actually working | 301 | * Function called when disk utilization changes, does nothing. |
302 | * | ||
303 | * @param cls closure | ||
304 | * @param delta change in utilization | ||
305 | */ | ||
306 | static void | ||
307 | ignore_payload_cb (void *cls, | ||
308 | int delta) | ||
309 | { | ||
310 | /* do nothing */ | ||
311 | } | ||
312 | |||
313 | |||
314 | /** | ||
315 | * check if plugin is actually working | ||
302 | */ | 316 | */ |
303 | static int | 317 | static int |
304 | test_plugin (const char *cfg_name) | 318 | test_plugin (const char *cfg_name) |
@@ -307,7 +321,7 @@ test_plugin (const char *cfg_name) | |||
307 | struct GNUNET_CONFIGURATION_Handle *cfg; | 321 | struct GNUNET_CONFIGURATION_Handle *cfg; |
308 | struct GNUNET_DATASTORE_PluginFunctions *api; | 322 | struct GNUNET_DATASTORE_PluginFunctions *api; |
309 | struct GNUNET_DATASTORE_PluginEnvironment env; | 323 | struct GNUNET_DATASTORE_PluginEnvironment env; |
310 | 324 | ||
311 | cfg = GNUNET_CONFIGURATION_create (); | 325 | cfg = GNUNET_CONFIGURATION_create (); |
312 | if (GNUNET_OK != | 326 | if (GNUNET_OK != |
313 | GNUNET_CONFIGURATION_load (cfg, | 327 | GNUNET_CONFIGURATION_load (cfg, |
@@ -321,6 +335,7 @@ test_plugin (const char *cfg_name) | |||
321 | } | 335 | } |
322 | memset (&env, 0, sizeof (env)); | 336 | memset (&env, 0, sizeof (env)); |
323 | env.cfg = cfg; | 337 | env.cfg = cfg; |
338 | env.duc = &ignore_payload_cb; | ||
324 | GNUNET_snprintf (libname, | 339 | GNUNET_snprintf (libname, |
325 | sizeof (libname), | 340 | sizeof (libname), |
326 | "libgnunet_plugin_datastore_%s", | 341 | "libgnunet_plugin_datastore_%s", |