summaryrefslogtreecommitdiff
path: root/src/mysql
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-03-21 14:45:19 +0000
committerChristian Grothoff <christian@grothoff.org>2012-03-21 14:45:19 +0000
commitdde852407a26aa2da817e87acc413fe1f50f81dd (patch)
tree28d255f66f55b71672552d2d4744fd7942a4e1ac /src/mysql
parent17c30ef801a526e67a09d761f137dd25ebea5fe7 (diff)
downloadgnunet-dde852407a26aa2da817e87acc413fe1f50f81dd.tar.gz
gnunet-dde852407a26aa2da817e87acc413fe1f50f81dd.zip
-using new mysql helper library also with datastore
Diffstat (limited to 'src/mysql')
-rw-r--r--src/mysql/mysql.c127
1 files changed, 87 insertions, 40 deletions
diff --git a/src/mysql/mysql.c b/src/mysql/mysql.c
index 1c3166dc7..67d2e63d2 100644
--- a/src/mysql/mysql.c
+++ b/src/mysql/mysql.c
@@ -315,12 +315,12 @@ GNUNET_MYSQL_context_create (const struct GNUNET_CONFIGURATION_Handle *cfg,
315 315
316/** 316/**
317 * Close database connection and all prepared statements (we got a DB 317 * Close database connection and all prepared statements (we got a DB
318 * disconnect error). 318 * error).
319 * 319 *
320 * @param mc mysql context 320 * @param mc mysql context
321 */ 321 */
322static void 322void
323iclose (struct GNUNET_MYSQL_Context *mc) 323GNUNET_MYSQL_statements_invalidate (struct GNUNET_MYSQL_Context *mc)
324{ 324{
325 struct GNUNET_MYSQL_StatementHandle *sh; 325 struct GNUNET_MYSQL_StatementHandle *sh;
326 326
@@ -351,7 +351,7 @@ GNUNET_MYSQL_context_destroy (struct GNUNET_MYSQL_Context *mc)
351{ 351{
352 struct GNUNET_MYSQL_StatementHandle *sh; 352 struct GNUNET_MYSQL_StatementHandle *sh;
353 353
354 iclose (mc); 354 GNUNET_MYSQL_statements_invalidate (mc);
355 while (NULL != (sh = mc->shead)) 355 while (NULL != (sh = mc->shead))
356 { 356 {
357 GNUNET_CONTAINER_DLL_remove (mc->shead, mc->stail, sh); 357 GNUNET_CONTAINER_DLL_remove (mc->shead, mc->stail, sh);
@@ -402,7 +402,7 @@ GNUNET_MYSQL_statement_run (struct GNUNET_MYSQL_Context *mc,
402 if (mysql_error (mc->dbf)[0]) 402 if (mysql_error (mc->dbf)[0])
403 { 403 {
404 LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_query", mc); 404 LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_query", mc);
405 iclose (mc); 405 GNUNET_MYSQL_statements_invalidate (mc);
406 return GNUNET_SYSERR; 406 return GNUNET_SYSERR;
407 } 407 }
408 return GNUNET_OK; 408 return GNUNET_OK;
@@ -427,7 +427,7 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
427 sh->statement = mysql_stmt_init (mc->dbf); 427 sh->statement = mysql_stmt_init (mc->dbf);
428 if (NULL == sh->statement) 428 if (NULL == sh->statement)
429 { 429 {
430 iclose (mc); 430 GNUNET_MYSQL_statements_invalidate (mc);
431 return GNUNET_SYSERR; 431 return GNUNET_SYSERR;
432 } 432 }
433 if (0 != mysql_stmt_prepare (sh->statement, sh->query, strlen (sh->query))) 433 if (0 != mysql_stmt_prepare (sh->statement, sh->query, strlen (sh->query)))
@@ -435,7 +435,7 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
435 LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_stmt_prepare", mc); 435 LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_stmt_prepare", mc);
436 mysql_stmt_close (sh->statement); 436 mysql_stmt_close (sh->statement);
437 sh->statement = NULL; 437 sh->statement = NULL;
438 iclose (mc); 438 GNUNET_MYSQL_statements_invalidate (mc);
439 return GNUNET_SYSERR; 439 return GNUNET_SYSERR;
440 } 440 }
441 sh->valid = GNUNET_YES; 441 sh->valid = GNUNET_YES;
@@ -444,6 +444,24 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
444 444
445 445
446/** 446/**
447 * Get internal handle for a prepared statement. This function should rarely
448 * be used, and if, with caution! On failures during the interaction with
449 * the handle, you must call 'GNUNET_MYSQL_statements_invalidate'!
450 *
451 * @param mc mysql context
452 * @param sh prepared statement to introspect
453 * @return MySQL statement handle, NULL on error
454 */
455MYSQL_STMT *
456GNUNET_MYSQL_statement_get_stmt (struct GNUNET_MYSQL_Context *mc,
457 struct GNUNET_MYSQL_StatementHandle *sh)
458{
459 (void) prepare_statement (mc, sh);
460 return sh->statement;
461}
462
463
464/**
447 * Bind the parameters for the given MySQL statement 465 * Bind the parameters for the given MySQL statement
448 * and run it. 466 * and run it.
449 * 467 *
@@ -519,7 +537,7 @@ init_params (struct GNUNET_MYSQL_Context *mc,
519 _("`%s' failed at %s:%d with error: %s\n"), 537 _("`%s' failed at %s:%d with error: %s\n"),
520 "mysql_stmt_bind_param", __FILE__, __LINE__, 538 "mysql_stmt_bind_param", __FILE__, __LINE__,
521 mysql_stmt_error (sh->statement)); 539 mysql_stmt_error (sh->statement));
522 iclose (mc); 540 GNUNET_MYSQL_statements_invalidate (mc);
523 return GNUNET_SYSERR; 541 return GNUNET_SYSERR;
524 } 542 }
525 if (mysql_stmt_execute (sh->statement)) 543 if (mysql_stmt_execute (sh->statement))
@@ -529,75 +547,71 @@ init_params (struct GNUNET_MYSQL_Context *mc,
529 _("`%s' failed at %s:%d with error: %s\n"), 547 _("`%s' failed at %s:%d with error: %s\n"),
530 "mysql_stmt_execute", __FILE__, __LINE__, 548 "mysql_stmt_execute", __FILE__, __LINE__,
531 mysql_stmt_error (sh->statement)); 549 mysql_stmt_error (sh->statement));
532 iclose (mc); 550 GNUNET_MYSQL_statements_invalidate (mc);
533 return GNUNET_SYSERR; 551 return GNUNET_SYSERR;
534 } 552 }
535 return GNUNET_OK; 553 return GNUNET_OK;
536} 554}
537 555
538 556
557
539/** 558/**
540 * Run a prepared SELECT statement. 559 * Run a prepared SELECT statement.
541 * 560 *
542 * @param mc mysql context 561 * @param mc mysql context
543 * @param sh handle to SELECT statment 562 * @param s statement to run
544 * @param result_size number of elements in results array 563 * @param result_size number of elements in results array
545 * @param results pointer to already initialized MYSQL_BIND 564 * @param results pointer to already initialized MYSQL_BIND
546 * array (of sufficient size) for passing results 565 * array (of sufficient size) for passing results
547 * @param processor function to call on each result 566 * @param ap pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
548 * @param processor_cls extra argument to processor
549 * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
550 * values (size + buffer-reference for pointers); terminated 567 * values (size + buffer-reference for pointers); terminated
551 * with "-1" 568 * with "-1"
552 * @return GNUNET_SYSERR on error, otherwise 569 * @return GNUNET_SYSERR on error, otherwise
553 * the number of successfully affected (or queried) rows 570 * the number of successfully affected (or queried) rows
554 */ 571 */
555int 572int
556GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc, 573GNUNET_MYSQL_statement_run_prepared_select_va (struct GNUNET_MYSQL_Context *mc,
557 struct GNUNET_MYSQL_StatementHandle *sh, 574 struct GNUNET_MYSQL_StatementHandle *s,
558 unsigned int result_size, MYSQL_BIND * results, 575 unsigned int result_size,
559 GNUNET_MYSQL_DataProcessor processor, 576 MYSQL_BIND * results,
560 void *processor_cls, ...) 577 GNUNET_MYSQL_DataProcessor processor,
578 void *processor_cls,
579 va_list ap)
561{ 580{
562 va_list ap;
563 int ret; 581 int ret;
564 unsigned int rsize; 582 unsigned int rsize;
565 int total; 583 int total;
566 584
567 if (GNUNET_OK != prepare_statement (mc, sh)) 585 if (GNUNET_OK != prepare_statement (mc, s))
568 { 586 {
569 GNUNET_break (0); 587 GNUNET_break (0);
570 return GNUNET_SYSERR; 588 return GNUNET_SYSERR;
571 } 589 }
572 va_start (ap, processor_cls); 590 if (GNUNET_OK != init_params (mc, s, ap))
573 if (GNUNET_OK != init_params (mc, sh, ap))
574 { 591 {
575 GNUNET_break (0); 592 GNUNET_break (0);
576 va_end (ap);
577 return GNUNET_SYSERR; 593 return GNUNET_SYSERR;
578 } 594 }
579 va_end (ap); 595 rsize = mysql_stmt_field_count (s->statement);
580 rsize = mysql_stmt_field_count (sh->statement);
581 if (rsize > result_size) 596 if (rsize > result_size)
582 { 597 {
583 GNUNET_break (0); 598 GNUNET_break (0);
584 return GNUNET_SYSERR; 599 return GNUNET_SYSERR;
585 } 600 }
586 if (mysql_stmt_bind_result (sh->statement, results)) 601 if (mysql_stmt_bind_result (s->statement, results))
587 { 602 {
588 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, 603 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
589 "mysql", 604 _("`%s' failed at %s:%d with error: %s\n"),
590 _("`%s' failed at %s:%d with error: %s\n"), 605 "mysql_stmt_bind_result", __FILE__, __LINE__,
591 "mysql_stmt_bind_result", __FILE__, __LINE__, 606 mysql_stmt_error (s->statement));
592 mysql_stmt_error (sh->statement)); 607 GNUNET_MYSQL_statements_invalidate (mc);
593 iclose (mc);
594 return GNUNET_SYSERR; 608 return GNUNET_SYSERR;
595 } 609 }
596 610
597 total = 0; 611 total = 0;
598 while (1) 612 while (1)
599 { 613 {
600 ret = mysql_stmt_fetch (sh->statement); 614 ret = mysql_stmt_fetch (s->statement);
601 if (ret == MYSQL_NO_DATA) 615 if (ret == MYSQL_NO_DATA)
602 break; 616 break;
603 if (ret != 0) 617 if (ret != 0)
@@ -606,21 +620,54 @@ GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc,
606 "mysql", 620 "mysql",
607 _("`%s' failed at %s:%d with error: %s\n"), 621 _("`%s' failed at %s:%d with error: %s\n"),
608 "mysql_stmt_fetch", __FILE__, __LINE__, 622 "mysql_stmt_fetch", __FILE__, __LINE__,
609 mysql_stmt_error (sh->statement)); 623 mysql_stmt_error (s->statement));
610 iclose (mc); 624 GNUNET_MYSQL_statements_invalidate (mc);
611 return GNUNET_SYSERR; 625 return GNUNET_SYSERR;
612 } 626 }
613 if (processor != NULL)
614 if (GNUNET_OK != processor (processor_cls, rsize, results))
615 break;
616 total++; 627 total++;
628 if ( (NULL == processor) ||
629 (GNUNET_OK != processor (processor_cls, rsize, results)) )
630 break;
617 } 631 }
618 mysql_stmt_reset (sh->statement); 632 mysql_stmt_reset (s->statement);
619 return total; 633 return total;
620} 634}
621 635
622 636
623/** 637/**
638 * Run a prepared SELECT statement.
639 *
640 * @param mc mysql context
641 * @param sh handle to SELECT statment
642 * @param result_size number of elements in results array
643 * @param results pointer to already initialized MYSQL_BIND
644 * array (of sufficient size) for passing results
645 * @param processor function to call on each result
646 * @param processor_cls extra argument to processor
647 * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
648 * values (size + buffer-reference for pointers); terminated
649 * with "-1"
650 * @return GNUNET_SYSERR on error, otherwise
651 * the number of successfully affected (or queried) rows
652 */
653int
654GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc,
655 struct GNUNET_MYSQL_StatementHandle *sh,
656 unsigned int result_size, MYSQL_BIND * results,
657 GNUNET_MYSQL_DataProcessor processor,
658 void *processor_cls, ...)
659{
660 va_list ap;
661 int ret;
662
663 va_start (ap, processor_cls);
664 ret = GNUNET_MYSQL_statement_run_prepared_select_va (mc, sh, result_size, results, processor, processor_cls, ap);
665 va_end (ap);
666 return ret;
667}
668
669
670/**
624 * Run a prepared statement that does NOT produce results. 671 * Run a prepared statement that does NOT produce results.
625 * 672 *
626 * @param mc mysql context 673 * @param mc mysql context