aboutsummaryrefslogtreecommitdiff
path: root/src/datastore
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-02-26 00:34:16 +0100
committerChristian Grothoff <christian@grothoff.org>2017-02-26 00:34:16 +0100
commiteb1c2236158eba266de1bc91d75d9c6d0714252b (patch)
tree65f0c65a42524fb1529ffa8051a2f7181a813d8f /src/datastore
parent07f48a8e74b61f518a4b169075cb0a1cb1419166 (diff)
downloadgnunet-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.c52
-rw-r--r--src/datastore/test_datastore_api_management.c19
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 */
306static void
307ignore_payload_cb (void *cls,
308 int delta)
309{
310 /* do nothing */
311}
312
313
314/**
315 * check if plugin is actually working
302 */ 316 */
303static int 317static int
304test_plugin (const char *cfg_name) 318test_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",