diff options
Diffstat (limited to 'src/namestore/plugin_namestore_sqlite.c')
-rw-r--r-- | src/namestore/plugin_namestore_sqlite.c | 122 |
1 files changed, 86 insertions, 36 deletions
diff --git a/src/namestore/plugin_namestore_sqlite.c b/src/namestore/plugin_namestore_sqlite.c index e93f800c3..d64ce10a8 100644 --- a/src/namestore/plugin_namestore_sqlite.c +++ b/src/namestore/plugin_namestore_sqlite.c | |||
@@ -137,16 +137,20 @@ create_indices (sqlite3 * dbh) | |||
137 | { | 137 | { |
138 | /* create indices */ | 138 | /* create indices */ |
139 | if ( (SQLITE_OK != | 139 | if ( (SQLITE_OK != |
140 | sqlite3_exec (dbh, "CREATE INDEX IF NOT EXISTS ir_pkey_reverse ON ns097records (zone_private_key,pkey)", | 140 | sqlite3_exec (dbh, |
141 | "CREATE INDEX IF NOT EXISTS ir_pkey_reverse ON ns097records (zone_private_key,pkey)", | ||
141 | NULL, NULL, NULL)) || | 142 | NULL, NULL, NULL)) || |
142 | (SQLITE_OK != | 143 | (SQLITE_OK != |
143 | sqlite3_exec (dbh, "CREATE INDEX IF NOT EXISTS ir_pkey_iter ON ns097records (zone_private_key,rvalue)", | 144 | sqlite3_exec (dbh, |
145 | "CREATE INDEX IF NOT EXISTS ir_pkey_iter ON ns097records (zone_private_key,rvalue)", | ||
144 | NULL, NULL, NULL)) || | 146 | NULL, NULL, NULL)) || |
145 | (SQLITE_OK != | 147 | (SQLITE_OK != |
146 | sqlite3_exec (dbh, "CREATE INDEX IF NOT EXISTS it_iter ON ns097records (rvalue)", | 148 | sqlite3_exec (dbh, |
149 | "CREATE INDEX IF NOT EXISTS it_iter ON ns097records (rvalue)", | ||
147 | NULL, NULL, NULL)) ) | 150 | NULL, NULL, NULL)) ) |
148 | LOG (GNUNET_ERROR_TYPE_ERROR, | 151 | LOG (GNUNET_ERROR_TYPE_ERROR, |
149 | "Failed to create indices: %s\n", sqlite3_errmsg (dbh)); | 152 | "Failed to create indices: %s\n", |
153 | sqlite3_errmsg (dbh)); | ||
150 | } | 154 | } |
151 | 155 | ||
152 | 156 | ||
@@ -178,16 +182,21 @@ database_setup (struct Plugin *plugin) | |||
178 | #endif | 182 | #endif |
179 | 183 | ||
180 | if (GNUNET_OK != | 184 | if (GNUNET_OK != |
181 | GNUNET_CONFIGURATION_get_value_filename (plugin->cfg, "namestore-sqlite", | 185 | GNUNET_CONFIGURATION_get_value_filename (plugin->cfg, |
182 | "FILENAME", &afsdir)) | 186 | "namestore-sqlite", |
187 | "FILENAME", | ||
188 | &afsdir)) | ||
183 | { | 189 | { |
184 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, | 190 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, |
185 | "namestore-sqlite", "FILENAME"); | 191 | "namestore-sqlite", |
192 | "FILENAME"); | ||
186 | return GNUNET_SYSERR; | 193 | return GNUNET_SYSERR; |
187 | } | 194 | } |
188 | if (GNUNET_OK != GNUNET_DISK_file_test (afsdir)) | 195 | if (GNUNET_OK != |
196 | GNUNET_DISK_file_test (afsdir)) | ||
189 | { | 197 | { |
190 | if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (afsdir)) | 198 | if (GNUNET_OK != |
199 | GNUNET_DISK_directory_create_for_file (afsdir)) | ||
191 | { | 200 | { |
192 | GNUNET_break (0); | 201 | GNUNET_break (0); |
193 | GNUNET_free (afsdir); | 202 | GNUNET_free (afsdir); |
@@ -206,28 +215,37 @@ database_setup (struct Plugin *plugin) | |||
206 | return GNUNET_SYSERR; | 215 | return GNUNET_SYSERR; |
207 | } | 216 | } |
208 | CHECK (SQLITE_OK == | 217 | CHECK (SQLITE_OK == |
209 | sqlite3_exec (plugin->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, | 218 | sqlite3_exec (plugin->dbh, |
219 | "PRAGMA temp_store=MEMORY", NULL, NULL, | ||
210 | ENULL)); | 220 | ENULL)); |
211 | CHECK (SQLITE_OK == | 221 | CHECK (SQLITE_OK == |
212 | sqlite3_exec (plugin->dbh, "PRAGMA synchronous=NORMAL", NULL, NULL, | 222 | sqlite3_exec (plugin->dbh, |
223 | "PRAGMA synchronous=NORMAL", NULL, NULL, | ||
213 | ENULL)); | 224 | ENULL)); |
214 | CHECK (SQLITE_OK == | 225 | CHECK (SQLITE_OK == |
215 | sqlite3_exec (plugin->dbh, "PRAGMA legacy_file_format=OFF", NULL, NULL, | 226 | sqlite3_exec (plugin->dbh, |
227 | "PRAGMA legacy_file_format=OFF", NULL, NULL, | ||
216 | ENULL)); | 228 | ENULL)); |
217 | CHECK (SQLITE_OK == | 229 | CHECK (SQLITE_OK == |
218 | sqlite3_exec (plugin->dbh, "PRAGMA auto_vacuum=INCREMENTAL", NULL, | 230 | sqlite3_exec (plugin->dbh, |
231 | "PRAGMA auto_vacuum=INCREMENTAL", NULL, | ||
219 | NULL, ENULL)); | 232 | NULL, ENULL)); |
220 | CHECK (SQLITE_OK == | 233 | CHECK (SQLITE_OK == |
221 | sqlite3_exec (plugin->dbh, "PRAGMA encoding=\"UTF-8\"", NULL, | 234 | sqlite3_exec (plugin->dbh, |
235 | "PRAGMA encoding=\"UTF-8\"", NULL, | ||
222 | NULL, ENULL)); | 236 | NULL, ENULL)); |
223 | CHECK (SQLITE_OK == | 237 | CHECK (SQLITE_OK == |
224 | sqlite3_exec (plugin->dbh, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, | 238 | sqlite3_exec (plugin->dbh, |
239 | "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, | ||
225 | ENULL)); | 240 | ENULL)); |
226 | CHECK (SQLITE_OK == | 241 | CHECK (SQLITE_OK == |
227 | sqlite3_exec (plugin->dbh, "PRAGMA page_size=4092", NULL, NULL, | 242 | sqlite3_exec (plugin->dbh, |
243 | "PRAGMA page_size=4092", NULL, NULL, | ||
228 | ENULL)); | 244 | ENULL)); |
229 | 245 | ||
230 | CHECK (SQLITE_OK == sqlite3_busy_timeout (plugin->dbh, BUSY_TIMEOUT_MS)); | 246 | CHECK (SQLITE_OK == |
247 | sqlite3_busy_timeout (plugin->dbh, | ||
248 | BUSY_TIMEOUT_MS)); | ||
231 | 249 | ||
232 | 250 | ||
233 | /* Create table */ | 251 | /* Create table */ |
@@ -248,7 +266,8 @@ database_setup (struct Plugin *plugin) | |||
248 | ")", | 266 | ")", |
249 | NULL, NULL, NULL) != SQLITE_OK)) | 267 | NULL, NULL, NULL) != SQLITE_OK)) |
250 | { | 268 | { |
251 | LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR, "sqlite3_exec"); | 269 | LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR, |
270 | "sqlite3_exec"); | ||
252 | sqlite3_finalize (stmt); | 271 | sqlite3_finalize (stmt); |
253 | return GNUNET_SYSERR; | 272 | return GNUNET_SYSERR; |
254 | } | 273 | } |
@@ -371,14 +390,17 @@ namestore_sqlite_store_records (void *cls, | |||
371 | for (i=0;i<rd_count;i++) | 390 | for (i=0;i<rd_count;i++) |
372 | if (GNUNET_GNSRECORD_TYPE_PKEY == rd[i].record_type) | 391 | if (GNUNET_GNSRECORD_TYPE_PKEY == rd[i].record_type) |
373 | { | 392 | { |
374 | GNUNET_break (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) == rd[i].data_size); | 393 | GNUNET_break (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) == |
394 | rd[i].data_size); | ||
375 | GNUNET_memcpy (&pkey, | 395 | GNUNET_memcpy (&pkey, |
376 | rd[i].data, | 396 | rd[i].data, |
377 | rd[i].data_size); | 397 | rd[i].data_size); |
378 | break; | 398 | break; |
379 | } | 399 | } |
380 | rvalue = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); | 400 | rvalue = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, |
381 | data_size = GNUNET_GNSRECORD_records_get_size (rd_count, rd); | 401 | UINT64_MAX); |
402 | data_size = GNUNET_GNSRECORD_records_get_size (rd_count, | ||
403 | rd); | ||
382 | if (data_size > 64 * 65536) | 404 | if (data_size > 64 * 65536) |
383 | { | 405 | { |
384 | GNUNET_break (0); | 406 | GNUNET_break (0); |
@@ -387,17 +409,29 @@ namestore_sqlite_store_records (void *cls, | |||
387 | { | 409 | { |
388 | char data[data_size]; | 410 | char data[data_size]; |
389 | 411 | ||
390 | if (data_size != GNUNET_GNSRECORD_records_serialize (rd_count, rd, | 412 | if (data_size != |
391 | data_size, data)) | 413 | GNUNET_GNSRECORD_records_serialize (rd_count, |
414 | rd, | ||
415 | data_size, | ||
416 | data)) | ||
392 | { | 417 | { |
393 | GNUNET_break (0); | 418 | GNUNET_break (0); |
394 | return GNUNET_SYSERR; | 419 | return GNUNET_SYSERR; |
395 | } | 420 | } |
396 | 421 | ||
397 | /* First delete 'old' records */ | 422 | /* First delete 'old' records */ |
398 | if ((SQLITE_OK != sqlite3_bind_blob (plugin->delete_records, 1, | 423 | if ((SQLITE_OK != |
399 | zone_key, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey), SQLITE_STATIC)) || | 424 | sqlite3_bind_blob (plugin->delete_records, |
400 | (SQLITE_OK != sqlite3_bind_text (plugin->delete_records, 2, label, -1, SQLITE_STATIC))) | 425 | 1, |
426 | zone_key, | ||
427 | sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey), | ||
428 | SQLITE_STATIC)) || | ||
429 | (SQLITE_OK != | ||
430 | sqlite3_bind_text (plugin->delete_records, | ||
431 | 2, | ||
432 | label, | ||
433 | -1, | ||
434 | SQLITE_STATIC))) | ||
401 | { | 435 | { |
402 | LOG_SQLITE (plugin, | 436 | LOG_SQLITE (plugin, |
403 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 437 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |
@@ -416,14 +450,30 @@ namestore_sqlite_store_records (void *cls, | |||
416 | 450 | ||
417 | if (0 != rd_count) | 451 | if (0 != rd_count) |
418 | { | 452 | { |
419 | if ((SQLITE_OK != sqlite3_bind_blob (plugin->store_records, 1, | 453 | if ((SQLITE_OK != |
420 | zone_key, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey), SQLITE_STATIC)) || | 454 | sqlite3_bind_blob (plugin->store_records, |
421 | (SQLITE_OK != sqlite3_bind_blob (plugin->store_records, 2, | 455 | 1, |
422 | &pkey, sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey), SQLITE_STATIC)) || | 456 | zone_key, |
423 | (SQLITE_OK != sqlite3_bind_int64 (plugin->store_records, 3, rvalue)) || | 457 | sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey), |
424 | (SQLITE_OK != sqlite3_bind_int (plugin->store_records, 4, rd_count)) || | 458 | SQLITE_STATIC)) || |
425 | (SQLITE_OK != sqlite3_bind_blob (plugin->store_records, 5, data, data_size, SQLITE_STATIC)) || | 459 | (SQLITE_OK != |
426 | (SQLITE_OK != sqlite3_bind_text (plugin->store_records, 6, label, -1, SQLITE_STATIC))) | 460 | sqlite3_bind_blob (plugin->store_records, |
461 | 2, | ||
462 | &pkey, | ||
463 | sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey), | ||
464 | SQLITE_STATIC)) || | ||
465 | (SQLITE_OK != | ||
466 | sqlite3_bind_int64 (plugin->store_records, 3, rvalue)) || | ||
467 | (SQLITE_OK != | ||
468 | sqlite3_bind_int (plugin->store_records, 4, rd_count)) || | ||
469 | (SQLITE_OK != | ||
470 | sqlite3_bind_blob (plugin->store_records, 5, | ||
471 | data, data_size, | ||
472 | SQLITE_STATIC)) || | ||
473 | (SQLITE_OK != | ||
474 | sqlite3_bind_text (plugin->store_records, 6, | ||
475 | label, -1, | ||
476 | SQLITE_STATIC))) | ||
427 | { | 477 | { |
428 | LOG_SQLITE (plugin, | 478 | LOG_SQLITE (plugin, |
429 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 479 | GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |