diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-03-21 14:45:19 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-03-21 14:45:19 +0000 |
commit | dde852407a26aa2da817e87acc413fe1f50f81dd (patch) | |
tree | 28d255f66f55b71672552d2d4744fd7942a4e1ac /src/mysql/mysql.c | |
parent | 17c30ef801a526e67a09d761f137dd25ebea5fe7 (diff) | |
download | gnunet-dde852407a26aa2da817e87acc413fe1f50f81dd.tar.gz gnunet-dde852407a26aa2da817e87acc413fe1f50f81dd.zip |
-using new mysql helper library also with datastore
Diffstat (limited to 'src/mysql/mysql.c')
-rw-r--r-- | src/mysql/mysql.c | 127 |
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 | */ |
322 | static void | 322 | void |
323 | iclose (struct GNUNET_MYSQL_Context *mc) | 323 | GNUNET_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 | */ | ||
455 | MYSQL_STMT * | ||
456 | GNUNET_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 | */ |
555 | int | 572 | int |
556 | GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc, | 573 | GNUNET_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 | */ | ||
653 | int | ||
654 | GNUNET_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 |