aboutsummaryrefslogtreecommitdiff
path: root/src/datacache/plugin_datacache_mysql.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/datacache/plugin_datacache_mysql.c')
-rw-r--r--src/datacache/plugin_datacache_mysql.c247
1 files changed, 93 insertions, 154 deletions
diff --git a/src/datacache/plugin_datacache_mysql.c b/src/datacache/plugin_datacache_mysql.c
index f4530ccef..62787eea6 100644
--- a/src/datacache/plugin_datacache_mysql.c
+++ b/src/datacache/plugin_datacache_mysql.c
@@ -222,8 +222,8 @@ get_my_cnf_path (const struct GNUNET_CONFIGURATION_Handle *cfg)
222#endif 222#endif
223 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 223 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
224 _("Trying to use file `%s' for MySQL configuration.\n"), cnffile); 224 _("Trying to use file `%s' for MySQL configuration.\n"), cnffile);
225 if ((0 != STAT (cnffile, &st)) || 225 if ((0 != STAT (cnffile, &st)) || (0 != ACCESS (cnffile, R_OK)) ||
226 (0 != ACCESS (cnffile, R_OK)) || (!S_ISREG (st.st_mode))) 226 (!S_ISREG (st.st_mode)))
227 { 227 {
228 if (configured == GNUNET_YES) 228 if (configured == GNUNET_YES)
229 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 229 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -303,9 +303,9 @@ iopen (struct Plugin *ret)
303 mysql_options (ret->dbf, MYSQL_OPT_READ_TIMEOUT, (const void *) &timeout); 303 mysql_options (ret->dbf, MYSQL_OPT_READ_TIMEOUT, (const void *) &timeout);
304 mysql_options (ret->dbf, MYSQL_OPT_WRITE_TIMEOUT, (const void *) &timeout); 304 mysql_options (ret->dbf, MYSQL_OPT_WRITE_TIMEOUT, (const void *) &timeout);
305 mysql_dbname = NULL; 305 mysql_dbname = NULL;
306 if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (ret->env->cfg, 306 if (GNUNET_YES ==
307 "datacache-mysql", 307 GNUNET_CONFIGURATION_have_value (ret->env->cfg, "datacache-mysql",
308 "DATABASE")) 308 "DATABASE"))
309 GNUNET_assert (GNUNET_OK == 309 GNUNET_assert (GNUNET_OK ==
310 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg, 310 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg,
311 "datacache-mysql", 311 "datacache-mysql",
@@ -314,8 +314,9 @@ iopen (struct Plugin *ret)
314 else 314 else
315 mysql_dbname = GNUNET_strdup ("gnunet"); 315 mysql_dbname = GNUNET_strdup ("gnunet");
316 mysql_user = NULL; 316 mysql_user = NULL;
317 if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (ret->env->cfg, 317 if (GNUNET_YES ==
318 "datacache-mysql", "USER")) 318 GNUNET_CONFIGURATION_have_value (ret->env->cfg, "datacache-mysql",
319 "USER"))
319 { 320 {
320 GNUNET_assert (GNUNET_OK == 321 GNUNET_assert (GNUNET_OK ==
321 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg, 322 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg,
@@ -323,9 +324,9 @@ iopen (struct Plugin *ret)
323 "USER", &mysql_user)); 324 "USER", &mysql_user));
324 } 325 }
325 mysql_password = NULL; 326 mysql_password = NULL;
326 if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (ret->env->cfg, 327 if (GNUNET_YES ==
327 "datacache-mysql", 328 GNUNET_CONFIGURATION_have_value (ret->env->cfg, "datacache-mysql",
328 "PASSWORD")) 329 "PASSWORD"))
329 { 330 {
330 GNUNET_assert (GNUNET_OK == 331 GNUNET_assert (GNUNET_OK ==
331 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg, 332 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg,
@@ -334,8 +335,9 @@ iopen (struct Plugin *ret)
334 &mysql_password)); 335 &mysql_password));
335 } 336 }
336 mysql_server = NULL; 337 mysql_server = NULL;
337 if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (ret->env->cfg, 338 if (GNUNET_YES ==
338 "datacache-mysql", "HOST")) 339 GNUNET_CONFIGURATION_have_value (ret->env->cfg, "datacache-mysql",
340 "HOST"))
339 { 341 {
340 GNUNET_assert (GNUNET_OK == 342 GNUNET_assert (GNUNET_OK ==
341 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg, 343 GNUNET_CONFIGURATION_get_value_string (ret->env->cfg,
@@ -344,8 +346,9 @@ iopen (struct Plugin *ret)
344 &mysql_server)); 346 &mysql_server));
345 } 347 }
346 mysql_port = 0; 348 mysql_port = 0;
347 if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (ret->env->cfg, 349 if (GNUNET_YES ==
348 "datacache-mysql", "PORT")) 350 GNUNET_CONFIGURATION_have_value (ret->env->cfg, "datacache-mysql",
351 "PORT"))
349 { 352 {
350 GNUNET_assert (GNUNET_OK == 353 GNUNET_assert (GNUNET_OK ==
351 GNUNET_CONFIGURATION_get_value_number (ret->env->cfg, 354 GNUNET_CONFIGURATION_get_value_number (ret->env->cfg,
@@ -450,8 +453,8 @@ prepare_statement (struct Plugin *plugin,
450 * @return GNUNET_SYSERR on error, GNUNET_OK on success 453 * @return GNUNET_SYSERR on error, GNUNET_OK on success
451 */ 454 */
452static int 455static int
453init_params (struct Plugin *plugin, 456init_params (struct Plugin *plugin, struct GNUNET_MysqlStatementHandle *s,
454 struct GNUNET_MysqlStatementHandle *s, va_list ap) 457 va_list ap)
455{ 458{
456 MYSQL_BIND qbind[MAX_PARAM]; 459 MYSQL_BIND qbind[MAX_PARAM];
457 unsigned int pc; 460 unsigned int pc;
@@ -512,8 +515,8 @@ init_params (struct Plugin *plugin,
512 { 515 {
513 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 516 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
514 _("`%s' failed at %s:%d with error: %s\n"), 517 _("`%s' failed at %s:%d with error: %s\n"),
515 "mysql_stmt_bind_param", 518 "mysql_stmt_bind_param", __FILE__, __LINE__,
516 __FILE__, __LINE__, mysql_stmt_error (s->statement)); 519 mysql_stmt_error (s->statement));
517 iclose (plugin); 520 iclose (plugin);
518 return GNUNET_SYSERR; 521 return GNUNET_SYSERR;
519 } 522 }
@@ -521,8 +524,8 @@ init_params (struct Plugin *plugin,
521 { 524 {
522 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 525 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
523 _("`%s' failed at %s:%d with error: %s\n"), 526 _("`%s' failed at %s:%d with error: %s\n"),
524 "mysql_stmt_execute", 527 "mysql_stmt_execute", __FILE__, __LINE__,
525 __FILE__, __LINE__, mysql_stmt_error (s->statement)); 528 mysql_stmt_error (s->statement));
526 iclose (plugin); 529 iclose (plugin);
527 return GNUNET_SYSERR; 530 return GNUNET_SYSERR;
528 } 531 }
@@ -538,8 +541,7 @@ init_params (struct Plugin *plugin,
538 * @param values values returned by MySQL 541 * @param values values returned by MySQL
539 * @return GNUNET_OK to continue iterating, GNUNET_SYSERR to abort 542 * @return GNUNET_OK to continue iterating, GNUNET_SYSERR to abort
540 */ 543 */
541typedef int (*GNUNET_MysqlDataProcessor) (void *cls, 544typedef int (*GNUNET_MysqlDataProcessor) (void *cls, unsigned int num_values,
542 unsigned int num_values,
543 MYSQL_BIND * values); 545 MYSQL_BIND * values);
544 546
545 547
@@ -561,12 +563,10 @@ typedef int (*GNUNET_MysqlDataProcessor) (void *cls,
561 */ 563 */
562static int 564static int
563prepared_statement_run_select (struct Plugin *plugin, 565prepared_statement_run_select (struct Plugin *plugin,
564 struct GNUNET_MysqlStatementHandle 566 struct GNUNET_MysqlStatementHandle *s,
565 *s, 567 unsigned int result_size, MYSQL_BIND * results,
566 unsigned int result_size, 568 GNUNET_MysqlDataProcessor processor,
567 MYSQL_BIND * results, 569 void *processor_cls, ...)
568 GNUNET_MysqlDataProcessor
569 processor, void *processor_cls, ...)
570{ 570{
571 va_list ap; 571 va_list ap;
572 int ret; 572 int ret;
@@ -596,8 +596,8 @@ prepared_statement_run_select (struct Plugin *plugin,
596 { 596 {
597 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 597 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
598 _("`%s' failed at %s:%d with error: %s\n"), 598 _("`%s' failed at %s:%d with error: %s\n"),
599 "mysql_stmt_bind_result", 599 "mysql_stmt_bind_result", __FILE__, __LINE__,
600 __FILE__, __LINE__, mysql_stmt_error (s->statement)); 600 mysql_stmt_error (s->statement));
601 iclose (plugin); 601 iclose (plugin);
602 return GNUNET_SYSERR; 602 return GNUNET_SYSERR;
603 } 603 }
@@ -612,8 +612,8 @@ prepared_statement_run_select (struct Plugin *plugin,
612 { 612 {
613 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 613 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
614 _("`%s' failed at %s:%d with error: %s\n"), 614 _("`%s' failed at %s:%d with error: %s\n"),
615 "mysql_stmt_fetch", 615 "mysql_stmt_fetch", __FILE__, __LINE__,
616 __FILE__, __LINE__, mysql_stmt_error (s->statement)); 616 mysql_stmt_error (s->statement));
617 iclose (plugin); 617 iclose (plugin);
618 return GNUNET_SYSERR; 618 return GNUNET_SYSERR;
619 } 619 }
@@ -676,17 +676,17 @@ static int
676itable (struct Plugin *plugin) 676itable (struct Plugin *plugin)
677{ 677{
678#define MRUNS(a) (GNUNET_OK != run_statement (plugin, a) ) 678#define MRUNS(a) (GNUNET_OK != run_statement (plugin, a) )
679 if (MRUNS ("CREATE TEMPORARY TABLE gn080dstore (" 679 if (MRUNS
680 " type INT(11) UNSIGNED NOT NULL DEFAULT 0," 680 ("CREATE TEMPORARY TABLE gn080dstore ("
681 " puttime BIGINT UNSIGNED NOT NULL DEFAULT 0," 681 " type INT(11) UNSIGNED NOT NULL DEFAULT 0,"
682 " expire BIGINT UNSIGNED NOT NULL DEFAULT 0," 682 " puttime BIGINT UNSIGNED NOT NULL DEFAULT 0,"
683 " hash BINARY(64) NOT NULL DEFAULT ''," 683 " expire BIGINT UNSIGNED NOT NULL DEFAULT 0,"
684 " vhash BINARY(64) NOT NULL DEFAULT ''," 684 " hash BINARY(64) NOT NULL DEFAULT '',"
685 " value BLOB NOT NULL DEFAULT ''," 685 " vhash BINARY(64) NOT NULL DEFAULT '',"
686 " INDEX hashidx (hash(64),type,expire)," 686 " value BLOB NOT NULL DEFAULT '',"
687 " INDEX allidx (hash(64),vhash(64),type)," 687 " INDEX hashidx (hash(64),type,expire),"
688 " INDEX expireidx (puttime)" ") ENGINE=InnoDB") || 688 " INDEX allidx (hash(64),vhash(64),type)," " INDEX expireidx (puttime)"
689 MRUNS ("SET AUTOCOMMIT = 1")) 689 ") ENGINE=InnoDB") || MRUNS ("SET AUTOCOMMIT = 1"))
690 return GNUNET_SYSERR; 690 return GNUNET_SYSERR;
691#undef MRUNS 691#undef MRUNS
692#define PINIT(a,b) (NULL == (a = prepared_statement_create(plugin, b))) 692#define PINIT(a,b) (NULL == (a = prepared_statement_create(plugin, b)))
@@ -714,11 +714,8 @@ itable (struct Plugin *plugin)
714 * @return 0 on error, number of bytes used otherwise 714 * @return 0 on error, number of bytes used otherwise
715 */ 715 */
716static size_t 716static size_t
717mysql_plugin_put (void *cls, 717mysql_plugin_put (void *cls, const GNUNET_HashCode * key, size_t size,
718 const GNUNET_HashCode * key, 718 const char *data, enum GNUNET_BLOCK_Type type,
719 size_t size,
720 const char *data,
721 enum GNUNET_BLOCK_Type type,
722 struct GNUNET_TIME_Absolute discard_time) 719 struct GNUNET_TIME_Absolute discard_time)
723{ 720{
724 struct Plugin *plugin = cls; 721 struct Plugin *plugin = cls;
@@ -745,23 +742,12 @@ mysql_plugin_put (void *cls,
745 v_now = (unsigned long long) now.abs_value; 742 v_now = (unsigned long long) now.abs_value;
746 v_discard_time = (unsigned long long) discard_time.abs_value; 743 v_discard_time = (unsigned long long) discard_time.abs_value;
747 if (GNUNET_OK == 744 if (GNUNET_OK ==
748 prepared_statement_run (plugin, 745 prepared_statement_run (plugin, plugin->update_value, NULL,
749 plugin->update_value, 746 MYSQL_TYPE_LONGLONG, &v_now, GNUNET_YES,
750 NULL, 747 MYSQL_TYPE_LONGLONG, &v_discard_time, GNUNET_YES,
751 MYSQL_TYPE_LONGLONG, 748 MYSQL_TYPE_BLOB, key, sizeof (GNUNET_HashCode),
752 &v_now, 749 &k_length, MYSQL_TYPE_BLOB, &vhash,
753 GNUNET_YES, 750 sizeof (GNUNET_HashCode), &h_length,
754 MYSQL_TYPE_LONGLONG,
755 &v_discard_time,
756 GNUNET_YES,
757 MYSQL_TYPE_BLOB,
758 key,
759 sizeof (GNUNET_HashCode),
760 &k_length,
761 MYSQL_TYPE_BLOB,
762 &vhash,
763 sizeof (GNUNET_HashCode),
764 &h_length,
765 MYSQL_TYPE_LONG, &v_type, GNUNET_YES, -1)) 751 MYSQL_TYPE_LONG, &v_type, GNUNET_YES, -1))
766 return GNUNET_OK; 752 return GNUNET_OK;
767 753
@@ -770,29 +756,16 @@ mysql_plugin_put (void *cls,
770 k_length = sizeof (GNUNET_HashCode); 756 k_length = sizeof (GNUNET_HashCode);
771 v_length = size; 757 v_length = size;
772 if (GNUNET_OK != 758 if (GNUNET_OK !=
773 (ret = prepared_statement_run (plugin, 759 (ret =
774 plugin->insert_value, 760 prepared_statement_run (plugin, plugin->insert_value, NULL,
775 NULL, 761 MYSQL_TYPE_LONG, &type, GNUNET_YES,
776 MYSQL_TYPE_LONG, 762 MYSQL_TYPE_LONGLONG, &v_now, GNUNET_YES,
777 &type, 763 MYSQL_TYPE_LONGLONG, &v_discard_time, GNUNET_YES,
778 GNUNET_YES, 764 MYSQL_TYPE_BLOB, key, sizeof (GNUNET_HashCode),
779 MYSQL_TYPE_LONGLONG, 765 &k_length, MYSQL_TYPE_BLOB, &vhash,
780 &v_now, 766 sizeof (GNUNET_HashCode), &h_length,
781 GNUNET_YES, 767 MYSQL_TYPE_BLOB, data, (unsigned long) size,
782 MYSQL_TYPE_LONGLONG, 768 &v_length, -1)))
783 &v_discard_time,
784 GNUNET_YES,
785 MYSQL_TYPE_BLOB,
786 key,
787 sizeof (GNUNET_HashCode),
788 &k_length,
789 MYSQL_TYPE_BLOB,
790 &vhash,
791 sizeof (GNUNET_HashCode),
792 &h_length,
793 MYSQL_TYPE_BLOB,
794 data,
795 (unsigned long) size, &v_length, -1)))
796 { 769 {
797 if (ret == GNUNET_SYSERR) 770 if (ret == GNUNET_SYSERR)
798 itable (plugin); 771 itable (plugin);
@@ -821,10 +794,9 @@ return_ok (void *cls, unsigned int num_values, MYSQL_BIND * values)
821 * @return the number of results found 794 * @return the number of results found
822 */ 795 */
823static unsigned int 796static unsigned int
824mysql_plugin_get (void *cls, 797mysql_plugin_get (void *cls, const GNUNET_HashCode * key,
825 const GNUNET_HashCode * key, 798 enum GNUNET_BLOCK_Type type, GNUNET_DATACACHE_Iterator iter,
826 enum GNUNET_BLOCK_Type type, 799 void *iter_cls)
827 GNUNET_DATACACHE_Iterator iter, void *iter_cls)
828{ 800{
829 struct Plugin *plugin = cls; 801 struct Plugin *plugin = cls;
830 MYSQL_BIND rbind[3]; 802 MYSQL_BIND rbind[3];
@@ -852,22 +824,13 @@ mysql_plugin_get (void *cls,
852 v_type = type; 824 v_type = type;
853 v_now = (unsigned long long) now.abs_value; 825 v_now = (unsigned long long) now.abs_value;
854 if ((GNUNET_OK != 826 if ((GNUNET_OK !=
855 (ret = prepared_statement_run_select (plugin, 827 (ret =
856 plugin->count_value, 828 prepared_statement_run_select (plugin, plugin->count_value, 1, rbind,
857 1, 829 return_ok, NULL, MYSQL_TYPE_BLOB, key,
858 rbind, 830 sizeof (GNUNET_HashCode), &h_length,
859 return_ok, 831 MYSQL_TYPE_LONG, &v_type, GNUNET_YES,
860 NULL, 832 MYSQL_TYPE_LONGLONG, &v_now, GNUNET_YES,
861 MYSQL_TYPE_BLOB, 833 -1))) || (-1 == total))
862 key,
863 sizeof
864 (GNUNET_HashCode),
865 &h_length,
866 MYSQL_TYPE_LONG,
867 &v_type, GNUNET_YES,
868 MYSQL_TYPE_LONGLONG,
869 &v_now, GNUNET_YES,
870 -1))) || (-1 == total))
871 { 834 {
872 if (ret == GNUNET_SYSERR) 835 if (ret == GNUNET_SYSERR)
873 itable (plugin); 836 itable (plugin);
@@ -890,25 +853,13 @@ mysql_plugin_get (void *cls,
890 rbind[1].buffer = &v_expire; 853 rbind[1].buffer = &v_expire;
891 off = (off + 1) % total; 854 off = (off + 1) % total;
892 if (GNUNET_OK != 855 if (GNUNET_OK !=
893 (ret = prepared_statement_run_select (plugin, 856 (ret =
894 plugin->select_value, 857 prepared_statement_run_select (plugin, plugin->select_value, 2, rbind,
895 2, 858 return_ok, NULL, MYSQL_TYPE_BLOB, key,
896 rbind, 859 sizeof (GNUNET_HashCode), &h_length,
897 return_ok, 860 MYSQL_TYPE_LONG, &v_type, GNUNET_YES,
898 NULL, 861 MYSQL_TYPE_LONGLONG, &v_now, GNUNET_YES,
899 MYSQL_TYPE_BLOB, 862 MYSQL_TYPE_LONG, &off, GNUNET_YES, -1)))
900 key,
901 sizeof
902 (GNUNET_HashCode),
903 &h_length,
904 MYSQL_TYPE_LONG,
905 &v_type,
906 GNUNET_YES,
907 MYSQL_TYPE_LONGLONG,
908 &v_now,
909 GNUNET_YES,
910 MYSQL_TYPE_LONG,
911 &off, GNUNET_YES, -1)))
912 { 863 {
913 if (ret == GNUNET_SYSERR) 864 if (ret == GNUNET_SYSERR)
914 itable (plugin); 865 itable (plugin);
@@ -965,32 +916,20 @@ mysql_plugin_del (void *cls)
965 rbind[3].length = &v_length; 916 rbind[3].length = &v_length;
966 rbind[3].buffer = buffer; 917 rbind[3].buffer = buffer;
967 if ((GNUNET_OK != 918 if ((GNUNET_OK !=
968 (ret = prepared_statement_run_select (plugin, 919 (ret =
969 plugin->select_old_value, 920 prepared_statement_run_select (plugin, plugin->select_old_value, 4,
970 4, 921 rbind, return_ok, NULL, -1))) ||
971 rbind,
972 return_ok,
973 NULL,
974 -1))) ||
975 (GNUNET_OK != 922 (GNUNET_OK !=
976 (ret = prepared_statement_run (plugin, 923 (ret =
977 plugin->delete_value, 924 prepared_statement_run (plugin, plugin->delete_value, NULL,
978 NULL, 925 MYSQL_TYPE_BLOB, &v_key,
979 MYSQL_TYPE_BLOB, 926 sizeof (GNUNET_HashCode), &k_length,
980 &v_key, 927 MYSQL_TYPE_BLOB, &vhash,
981 sizeof (GNUNET_HashCode), 928 sizeof (GNUNET_HashCode), &h_length,
982 &k_length, 929 MYSQL_TYPE_LONG, &v_type, GNUNET_YES,
983 MYSQL_TYPE_BLOB, 930 MYSQL_TYPE_BLOB, buffer,
984 &vhash, 931 (unsigned long) sizeof (buffer), &v_length,
985 sizeof (GNUNET_HashCode), 932 -1))))
986 &h_length,
987 MYSQL_TYPE_LONG,
988 &v_type,
989 GNUNET_YES,
990 MYSQL_TYPE_BLOB,
991 buffer,
992 (unsigned long)
993 sizeof (buffer), &v_length, -1))))
994 { 933 {
995 if (ret == GNUNET_SYSERR) 934 if (ret == GNUNET_SYSERR)
996 itable (plugin); 935 itable (plugin);
@@ -1036,8 +975,8 @@ libgnunet_plugin_datacache_mysql_init (void *cls)
1036 api->get = &mysql_plugin_get; 975 api->get = &mysql_plugin_get;
1037 api->put = &mysql_plugin_put; 976 api->put = &mysql_plugin_put;
1038 api->del = &mysql_plugin_del; 977 api->del = &mysql_plugin_del;
1039 GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, 978 GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, "mysql",
1040 "mysql", _("MySQL datacache running\n")); 979 _("MySQL datacache running\n"));
1041 return api; 980 return api;
1042} 981}
1043 982