summaryrefslogtreecommitdiff
path: root/src/namecache
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-03-12 17:11:04 +0100
committerChristian Grothoff <christian@grothoff.org>2017-03-12 17:11:04 +0100
commit2d72c24ec455b75728d2dcc4b4e7c6f3ab59d7fc (patch)
tree4b9c55d7e401715481693573ec05d24ea55bad17 /src/namecache
parent48510e67c596abe400cfca758888fc73d4966e31 (diff)
downloadgnunet-2d72c24ec455b75728d2dcc4b4e7c6f3ab59d7fc.tar.gz
gnunet-2d72c24ec455b75728d2dcc4b4e7c6f3ab59d7fc.zip
migrating namecache to use SQ lib
Diffstat (limited to 'src/namecache')
-rw-r--r--src/namecache/Makefile.am2
-rw-r--r--src/namecache/plugin_namecache_sqlite.c213
2 files changed, 118 insertions, 97 deletions
diff --git a/src/namecache/Makefile.am b/src/namecache/Makefile.am
index 89d7bffee..d379b2602 100644
--- a/src/namecache/Makefile.am
+++ b/src/namecache/Makefile.am
@@ -121,6 +121,7 @@ libgnunet_plugin_namecache_sqlite_la_SOURCES = \
121 plugin_namecache_sqlite.c 121 plugin_namecache_sqlite.c
122libgnunet_plugin_namecache_sqlite_la_LIBADD = \ 122libgnunet_plugin_namecache_sqlite_la_LIBADD = \
123 libgnunetnamecache.la \ 123 libgnunetnamecache.la \
124 $(top_builddir)/src/sq/libgnunetsq.la \
124 $(top_builddir)/src/statistics/libgnunetstatistics.la \ 125 $(top_builddir)/src/statistics/libgnunetstatistics.la \
125 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \ 126 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \
126 $(LTLIBINTL) 127 $(LTLIBINTL)
@@ -172,4 +173,3 @@ EXTRA_DIST = \
172 test_plugin_namecache_sqlite.conf \ 173 test_plugin_namecache_sqlite.conf \
173 test_plugin_namecache_postgres.conf \ 174 test_plugin_namecache_postgres.conf \
174 test_plugin_namecache_flat.conf 175 test_plugin_namecache_flat.conf
175
diff --git a/src/namecache/plugin_namecache_sqlite.c b/src/namecache/plugin_namecache_sqlite.c
index fdce899fa..17f671fe5 100644
--- a/src/namecache/plugin_namecache_sqlite.c
+++ b/src/namecache/plugin_namecache_sqlite.c
@@ -25,6 +25,7 @@
25 */ 25 */
26 26
27#include "platform.h" 27#include "platform.h"
28#include "gnunet_sq_lib.h"
28#include "gnunet_namecache_plugin.h" 29#include "gnunet_namecache_plugin.h"
29#include "gnunet_namecache_service.h" 30#include "gnunet_namecache_service.h"
30#include "gnunet_gnsrecord_lib.h" 31#include "gnunet_gnsrecord_lib.h"
@@ -241,25 +242,28 @@ database_setup (struct Plugin *plugin)
241 sqlite3_finalize (stmt); 242 sqlite3_finalize (stmt);
242 create_indices (plugin->dbh); 243 create_indices (plugin->dbh);
243 244
244 if ((sq_prepare 245 if ( (SQLITE_OK !=
245 (plugin->dbh, 246 sq_prepare (plugin->dbh,
246 "INSERT INTO ns096blocks (query,block,expiration_time) VALUES (?, ?, ?)", 247 "INSERT INTO ns096blocks (query,block,expiration_time) VALUES (?, ?, ?)",
247 &plugin->cache_block) != SQLITE_OK) || 248 &plugin->cache_block)) ||
248 (sq_prepare 249 (SQLITE_OK !=
249 (plugin->dbh, 250 sq_prepare (plugin->dbh,
250 "DELETE FROM ns096blocks WHERE expiration_time<?", 251 "DELETE FROM ns096blocks WHERE expiration_time<?",
251 &plugin->expire_blocks) != SQLITE_OK) || 252 &plugin->expire_blocks)) ||
252 (sq_prepare 253 (SQLITE_OK !=
253 (plugin->dbh, 254 sq_prepare (plugin->dbh,
254 "DELETE FROM ns096blocks WHERE query=? AND expiration_time<=?", 255 "DELETE FROM ns096blocks WHERE query=? AND expiration_time<=?",
255 &plugin->delete_block) != SQLITE_OK) || 256 &plugin->delete_block)) ||
256 (sq_prepare 257 (SQLITE_OK !=
257 (plugin->dbh, 258 sq_prepare (plugin->dbh,
258 "SELECT block FROM ns096blocks WHERE query=? ORDER BY expiration_time DESC LIMIT 1", 259 "SELECT block FROM ns096blocks WHERE query=? "
259 &plugin->lookup_block) != SQLITE_OK) 260 "ORDER BY expiration_time DESC LIMIT 1",
261 &plugin->lookup_block) )
260 ) 262 )
261 { 263 {
262 LOG_SQLITE (plugin,GNUNET_ERROR_TYPE_ERROR, "precompiling"); 264 LOG_SQLITE (plugin,
265 GNUNET_ERROR_TYPE_ERROR,
266 "precompiling");
263 return GNUNET_SYSERR; 267 return GNUNET_SYSERR;
264 } 268 }
265 return GNUNET_OK; 269 return GNUNET_OK;
@@ -319,35 +323,41 @@ static void
319namecache_sqlite_expire_blocks (struct Plugin *plugin) 323namecache_sqlite_expire_blocks (struct Plugin *plugin)
320{ 324{
321 struct GNUNET_TIME_Absolute now; 325 struct GNUNET_TIME_Absolute now;
326 struct GNUNET_SQ_QueryParam params[] = {
327 GNUNET_SQ_query_param_absolute_time (&now),
328 GNUNET_SQ_query_param_end
329 };
322 int n; 330 int n;
323 331
324 now = GNUNET_TIME_absolute_get (); 332 now = GNUNET_TIME_absolute_get ();
325 if (SQLITE_OK != sqlite3_bind_int64 (plugin->expire_blocks, 333 if (GNUNET_OK !=
326 1, now.abs_value_us)) 334 GNUNET_SQ_bind (plugin->expire_blocks,
335 params))
327 { 336 {
328 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 337 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
329 "sqlite3_bind_XXXX"); 338 "sqlite3_bind_XXXX");
330 if (SQLITE_OK != sqlite3_reset (plugin->expire_blocks)) 339 GNUNET_SQ_reset (plugin->dbh,
331 LOG_SQLITE (plugin, 340 plugin->expire_blocks);
332 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
333 "sqlite3_reset");
334 return; 341 return;
335 } 342 }
336 n = sqlite3_step (plugin->expire_blocks); 343 n = sqlite3_step (plugin->expire_blocks);
337 if (SQLITE_OK != sqlite3_reset (plugin->expire_blocks)) 344 GNUNET_SQ_reset (plugin->dbh,
338 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 345 plugin->expire_blocks);
339 "sqlite3_reset");
340 switch (n) 346 switch (n)
341 { 347 {
342 case SQLITE_DONE: 348 case SQLITE_DONE:
343 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "sqlite", "Records expired\n"); 349 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
350 "sqlite",
351 "Records expired\n");
344 return; 352 return;
345 case SQLITE_BUSY: 353 case SQLITE_BUSY:
346 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, 354 LOG_SQLITE (plugin,
355 GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
347 "sqlite3_step"); 356 "sqlite3_step");
348 return; 357 return;
349 default: 358 default:
350 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 359 LOG_SQLITE (plugin,
360 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
351 "sqlite3_step"); 361 "sqlite3_step");
352 return; 362 return;
353 } 363 }
@@ -368,8 +378,21 @@ namecache_sqlite_cache_block (void *cls,
368 struct Plugin *plugin = cls; 378 struct Plugin *plugin = cls;
369 struct GNUNET_HashCode query; 379 struct GNUNET_HashCode query;
370 struct GNUNET_TIME_Absolute expiration; 380 struct GNUNET_TIME_Absolute expiration;
371 int64_t dval; 381 size_t block_size = ntohl (block->purpose.size) +
372 size_t block_size; 382 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) +
383 sizeof (struct GNUNET_CRYPTO_EcdsaSignature);
384 struct GNUNET_SQ_QueryParam del_params[] = {
385 GNUNET_SQ_query_param_auto_from_type (&query),
386 GNUNET_SQ_query_param_absolute_time (&expiration),
387 GNUNET_SQ_query_param_end
388 };
389 struct GNUNET_SQ_QueryParam ins_params[] = {
390 GNUNET_SQ_query_param_auto_from_type (&query),
391 GNUNET_SQ_query_param_fixed_size (block,
392 block_size),
393 GNUNET_SQ_query_param_absolute_time (&expiration),
394 GNUNET_SQ_query_param_end
395 };
373 int n; 396 int n;
374 397
375 namecache_sqlite_expire_blocks (plugin); 398 namecache_sqlite_expire_blocks (plugin);
@@ -377,12 +400,6 @@ namecache_sqlite_cache_block (void *cls,
377 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey), 400 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
378 &query); 401 &query);
379 expiration = GNUNET_TIME_absolute_ntoh (block->expiration_time); 402 expiration = GNUNET_TIME_absolute_ntoh (block->expiration_time);
380 dval = (int64_t) expiration.abs_value_us;
381 if (dval < 0)
382 dval = INT64_MAX;
383 block_size = ntohl (block->purpose.size) +
384 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) +
385 sizeof (struct GNUNET_CRYPTO_EcdsaSignature);
386 if (block_size > 64 * 65536) 403 if (block_size > 64 * 65536)
387 { 404 {
388 GNUNET_break (0); 405 GNUNET_break (0);
@@ -390,61 +407,48 @@ namecache_sqlite_cache_block (void *cls,
390 } 407 }
391 408
392 /* delete old version of the block */ 409 /* delete old version of the block */
393 if ( (SQLITE_OK != 410 if (GNUNET_OK !=
394 sqlite3_bind_blob (plugin->delete_block, 1, 411 GNUNET_SQ_bind (plugin->delete_block,
395 &query, sizeof (struct GNUNET_HashCode), 412 del_params))
396 SQLITE_STATIC)) ||
397 (SQLITE_OK !=
398 sqlite3_bind_int64 (plugin->delete_block,
399 2, dval)) )
400 { 413 {
401 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 414 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
402 "sqlite3_bind_XXXX"); 415 "sqlite3_bind_XXXX");
403 if (SQLITE_OK != sqlite3_reset (plugin->delete_block)) 416 GNUNET_SQ_reset (plugin->dbh,
404 LOG_SQLITE (plugin, 417 plugin->delete_block);
405 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
406 "sqlite3_reset");
407 return GNUNET_SYSERR; 418 return GNUNET_SYSERR;
408 } 419 }
409 n = sqlite3_step (plugin->delete_block); 420 n = sqlite3_step (plugin->delete_block);
410 switch (n) 421 switch (n)
411 { 422 {
412 case SQLITE_DONE: 423 case SQLITE_DONE:
413 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "sqlite", "Old block deleted\n"); 424 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
425 "sqlite",
426 "Old block deleted\n");
414 break; 427 break;
415 case SQLITE_BUSY: 428 case SQLITE_BUSY:
416 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, 429 LOG_SQLITE (plugin,
430 GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
417 "sqlite3_step"); 431 "sqlite3_step");
418 break; 432 break;
419 default: 433 default:
420 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 434 LOG_SQLITE (plugin,
435 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
421 "sqlite3_step"); 436 "sqlite3_step");
422 break; 437 break;
423 } 438 }
424 if (SQLITE_OK != sqlite3_reset (plugin->delete_block)) 439 GNUNET_SQ_reset (plugin->dbh,
425 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 440 plugin->delete_block);
426 "sqlite3_reset");
427 441
428 /* insert new version of the block */ 442 /* insert new version of the block */
429 if ((SQLITE_OK != 443 if (GNUNET_OK !=
430 sqlite3_bind_blob (plugin->cache_block, 1, 444 GNUNET_SQ_bind (plugin->cache_block,
431 &query, sizeof (struct GNUNET_HashCode), 445 ins_params))
432 SQLITE_STATIC)) ||
433 (SQLITE_OK !=
434 sqlite3_bind_blob (plugin->cache_block, 2,
435 block, block_size,
436 SQLITE_STATIC)) ||
437 (SQLITE_OK !=
438 sqlite3_bind_int64 (plugin->cache_block, 3,
439 dval)))
440 { 446 {
441 LOG_SQLITE (plugin, 447 LOG_SQLITE (plugin,
442 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 448 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
443 "sqlite3_bind_XXXX"); 449 "sqlite3_bind_XXXX");
444 if (SQLITE_OK != sqlite3_reset (plugin->cache_block)) 450 GNUNET_SQ_reset (plugin->dbh,
445 LOG_SQLITE (plugin, 451 plugin->cache_block);
446 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
447 "sqlite3_reset");
448 return GNUNET_SYSERR; 452 return GNUNET_SYSERR;
449 453
450 } 454 }
@@ -452,9 +456,8 @@ namecache_sqlite_cache_block (void *cls,
452 "Caching block under derived key `%s'\n", 456 "Caching block under derived key `%s'\n",
453 GNUNET_h2s_full (&query)); 457 GNUNET_h2s_full (&query));
454 n = sqlite3_step (plugin->cache_block); 458 n = sqlite3_step (plugin->cache_block);
455 if (SQLITE_OK != sqlite3_reset (plugin->cache_block)) 459 GNUNET_SQ_reset (plugin->dbh,
456 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 460 plugin->cache_block);
457 "sqlite3_reset");
458 switch (n) 461 switch (n)
459 { 462 {
460 case SQLITE_DONE: 463 case SQLITE_DONE:
@@ -462,11 +465,13 @@ namecache_sqlite_cache_block (void *cls,
462 "Record stored\n"); 465 "Record stored\n");
463 return GNUNET_OK; 466 return GNUNET_OK;
464 case SQLITE_BUSY: 467 case SQLITE_BUSY:
465 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, 468 LOG_SQLITE (plugin,
469 GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
466 "sqlite3_step"); 470 "sqlite3_step");
467 return GNUNET_NO; 471 return GNUNET_NO;
468 default: 472 default:
469 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 473 LOG_SQLITE (plugin,
474 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
470 "sqlite3_step"); 475 "sqlite3_step");
471 return GNUNET_SYSERR; 476 return GNUNET_SYSERR;
472 } 477 }
@@ -486,35 +491,50 @@ namecache_sqlite_cache_block (void *cls,
486static int 491static int
487namecache_sqlite_lookup_block (void *cls, 492namecache_sqlite_lookup_block (void *cls,
488 const struct GNUNET_HashCode *query, 493 const struct GNUNET_HashCode *query,
489 GNUNET_NAMECACHE_BlockCallback iter, void *iter_cls) 494 GNUNET_NAMECACHE_BlockCallback iter,
495 void *iter_cls)
490{ 496{
491 struct Plugin *plugin = cls; 497 struct Plugin *plugin = cls;
492 int ret; 498 int ret;
493 int sret; 499 int sret;
494 size_t block_size; 500 size_t block_size;
495 const struct GNUNET_GNSRECORD_Block *block; 501 const struct GNUNET_GNSRECORD_Block *block;
502 struct GNUNET_SQ_QueryParam params[] = {
503 GNUNET_SQ_query_param_auto_from_type (query),
504 GNUNET_SQ_query_param_end
505 };
506 struct GNUNET_SQ_ResultSpec rs[] = {
507 GNUNET_SQ_result_spec_variable_size ((void **) &block,
508 &block_size),
509 GNUNET_SQ_result_spec_end
510 };
496 511
497 if (SQLITE_OK != sqlite3_bind_blob (plugin->lookup_block, 1, 512 if (GNUNET_OK !=
498 query, sizeof (struct GNUNET_HashCode), 513 GNUNET_SQ_bind (plugin->lookup_block,
499 SQLITE_STATIC)) 514 params))
500 { 515 {
501 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 516 LOG_SQLITE (plugin,
517 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
502 "sqlite3_bind_XXXX"); 518 "sqlite3_bind_XXXX");
503 if (SQLITE_OK != sqlite3_reset (plugin->lookup_block)) 519 GNUNET_SQ_reset (plugin->dbh,
504 LOG_SQLITE (plugin, 520 plugin->lookup_block);
505 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
506 "sqlite3_reset");
507 return GNUNET_SYSERR; 521 return GNUNET_SYSERR;
508 } 522 }
509 ret = GNUNET_NO; 523 ret = GNUNET_NO;
510 if (SQLITE_ROW == (sret = sqlite3_step (plugin->lookup_block))) 524 if (SQLITE_ROW ==
525 (sret = sqlite3_step (plugin->lookup_block)))
511 { 526 {
512 block = sqlite3_column_blob (plugin->lookup_block, 0); 527 if (GNUNET_OK !=
513 block_size = sqlite3_column_bytes (plugin->lookup_block, 0); 528 GNUNET_SQ_extract_result (plugin->lookup_block,
514 if ( (block_size < sizeof (struct GNUNET_GNSRECORD_Block)) || 529 rs))
515 (ntohl (block->purpose.size) + 530 {
516 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) + 531 GNUNET_break (0);
517 sizeof (struct GNUNET_CRYPTO_EcdsaSignature) != block_size) ) 532 ret = GNUNET_SYSERR;
533 }
534 else if ( (block_size < sizeof (struct GNUNET_GNSRECORD_Block)) ||
535 (ntohl (block->purpose.size) +
536 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) +
537 sizeof (struct GNUNET_CRYPTO_EcdsaSignature) != block_size) )
518 { 538 {
519 GNUNET_break (0); 539 GNUNET_break (0);
520 ret = GNUNET_SYSERR; 540 ret = GNUNET_SYSERR;
@@ -524,7 +544,8 @@ namecache_sqlite_lookup_block (void *cls,
524 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 544 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
525 "Found block under derived key `%s'\n", 545 "Found block under derived key `%s'\n",
526 GNUNET_h2s_full (query)); 546 GNUNET_h2s_full (query));
527 iter (iter_cls, block); 547 iter (iter_cls,
548 block);
528 ret = GNUNET_YES; 549 ret = GNUNET_YES;
529 } 550 }
530 } 551 }
@@ -532,7 +553,9 @@ namecache_sqlite_lookup_block (void *cls,
532 { 553 {
533 if (SQLITE_DONE != sret) 554 if (SQLITE_DONE != sret)
534 { 555 {
535 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR, "sqlite_step"); 556 LOG_SQLITE (plugin,
557 GNUNET_ERROR_TYPE_ERROR,
558 "sqlite_step");
536 ret = GNUNET_SYSERR; 559 ret = GNUNET_SYSERR;
537 } 560 }
538 else 561 else
@@ -542,10 +565,8 @@ namecache_sqlite_lookup_block (void *cls,
542 GNUNET_h2s_full (query)); 565 GNUNET_h2s_full (query));
543 } 566 }
544 } 567 }
545 if (SQLITE_OK != sqlite3_reset (plugin->lookup_block)) 568 GNUNET_SQ_reset (plugin->dbh,
546 LOG_SQLITE (plugin, 569 plugin->lookup_block);
547 GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
548 "sqlite3_reset");
549 return ret; 570 return ret;
550} 571}
551 572