X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmy%2Fmy.c;h=459f09b6a4b65227c88ad532db1d4ea18c054357;hb=2105059516320800eaa8fff1196b58f29a50ba7c;hp=93b0a05b4e1f5377f6aed8a5a197e00e774b3715;hpb=719620aa7ed036e846a08c813b63d4bdb85dc9dc;p=oweals%2Fgnunet.git diff --git a/src/my/my.c b/src/my/my.c index 93b0a05b4..459f09b6a 100644 --- a/src/my/my.c +++ b/src/my/my.c @@ -27,7 +27,6 @@ #include #include "gnunet_my_lib.h" -#define STRING_SIZE 50 /** * Run a prepared SELECT statement. @@ -39,11 +38,10 @@ #GNUNET_YES if we can prepare all statement #GNUNET_SYSERR if we can't prepare all statement */ - int GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc, struct GNUNET_MYSQL_StatementHandle *sh, - const struct GNUNET_MY_QueryParam *params) + struct GNUNET_MY_QueryParam *params) { const struct GNUNET_MY_QueryParam *p; unsigned int num; @@ -57,7 +55,7 @@ GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc, MYSQL_BIND qbind[num]; unsigned int off; - memset(qbind, 0, sizeof(qbind)); + memset (qbind, 0, sizeof(qbind)); off = 0; for (i=0;NULL != (p = ¶ms[i])->conv;i++) { @@ -66,42 +64,68 @@ GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc, p, &qbind[off])) { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Conversion for MySQL query failed at offset %u\n", + i); return GNUNET_SYSERR; } off += p->num_params; } - stmt = GNUNET_MYSQL_statement_get_stmt (mc, sh); + stmt = GNUNET_MYSQL_statement_get_stmt (sh); if (mysql_stmt_bind_param (stmt, qbind)) { - GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "mysql", + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, + "my", _("`%s' failed at %s:%d with error: %s\n"), - "mysql_stmt_bind_param", __FILE__, __LINE__, + "mysql_stmt_bind_param", + __FILE__, __LINE__, mysql_stmt_error (stmt)); GNUNET_MYSQL_statements_invalidate (mc); return GNUNET_SYSERR; } + if (mysql_stmt_execute (stmt)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, + "my", + _("`%s' failed at %s:%d with error: %s\n"), + "mysql_stmt_execute", __FILE__, __LINE__, + mysql_stmt_error (stmt)); + GNUNET_MYSQL_statements_invalidate (mc); + return GNUNET_SYSERR; + } + GNUNET_MY_cleanup_query (params, + qbind); } - if (mysql_stmt_execute (stmt)) - { - GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "mysql", - _("`%s' failed at %s:%d with error: %s\n"), - "mysql_stmt_execute", __FILE__, __LINE__, - mysql_stmt_error (stmt)); - GNUNET_MYSQL_statements_invalidate (mc); - return GNUNET_SYSERR; - } - return GNUNET_OK; } +/** + * Free all memory that was allocated in @a qp during + * #GNUNET_MY_exec_prepared(). + * + * @param qp query specification to clean up + * @param qbind array of parameter to clean up + */ +void +GNUNET_MY_cleanup_query (struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND *qbind) +{ + unsigned int i; + + for (i=0; NULL != qp[i].conv ;i++) + if (NULL != qp[i].cleaner) + qp[i].cleaner (qp[i].conv_cls, + &qbind[i]); +} + + /** * Extract results from a query result according to the given * specification. Always fetches the next row. * - * * @param sh statement that returned results * @param rs specification to extract for * @return @@ -118,15 +142,17 @@ GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh, int ret; MYSQL_STMT *stmt; - stmt = GNUNET_MYSQL_statement_get_stmt (NULL /* FIXME */, sh); + stmt = GNUNET_MYSQL_statement_get_stmt (sh); if (NULL == stmt) { - GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "mysql", - ("`%s' failed at %s:%d with error: %s\n"), - "mysql_stmt_bind_result", __FILE__, __LINE__, - mysql_stmt_error (stmt)); + GNUNET_break (0); return GNUNET_SYSERR; } + if (NULL == rs) + { + mysql_stmt_free_result (stmt); + return GNUNET_NO; + } num_fields = 0; for (i=0;NULL != rs[i].pre_conv;i++) @@ -155,36 +181,45 @@ GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh, stmt, field_off, &result[field_off])) + { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Pre-conversion for MySQL result failed at offset %u\n", i); - GNUNET_MY_cleanup_result (rs); return GNUNET_SYSERR; } field_off += rp->num_fields; } + if (mysql_stmt_bind_result (stmt, result)) { GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "my", - _("`%s' failed at %s:%d with error: %s\n"), - "mysql_stmt_bind_result", __FILE__, __LINE__, + _("%s failed at %s:%d with error: %s\n"), + "mysql_stmt_bind_result", + __FILE__, __LINE__, mysql_stmt_error (stmt)); return GNUNET_SYSERR; } - +#if TEST_OPTIMIZATION + (void) mysql_stmt_store_result (stmt); +#endif ret = mysql_stmt_fetch (stmt); - if (MYSQL_NO_DATA == ret) + { + mysql_stmt_free_result (stmt); return GNUNET_NO; - if ((0 != ret ) & (MYSQL_DATA_TRUNCATED != ret)) + } + if (1 == ret) { GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "my", - _("mysql_stmt_fetch failed at %s:%d with error: %s\n"), + _("%s failed at %s:%d with error: %s\n"), + "mysql_stmt_fetch", __FILE__, __LINE__, mysql_stmt_error (stmt)); + GNUNET_MY_cleanup_result (rs); + mysql_stmt_free_result (stmt); return GNUNET_SYSERR; } field_off = 0; @@ -200,9 +235,10 @@ GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh, field_off, &result[field_off])) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Post-conversion for MySQL result failed at offset %u\n", i); + mysql_stmt_free_result (stmt); GNUNET_MY_cleanup_result (rs); return GNUNET_SYSERR; } @@ -217,16 +253,17 @@ GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh, * Free all memory that was allocated in @a rs during * #GNUNET_MY_extract_result(). * - * @param rs reult specification to clean up + * @param rs result specification to clean up */ void GNUNET_MY_cleanup_result (struct GNUNET_MY_ResultSpec *rs) { unsigned int i; - for (i=0;NULL != rs[i].cleaner;i++) - rs[i].cleaner (rs[i].conv_cls, - &rs[i]); + for (i=0;NULL != rs[i].post_conv;i++) + if (NULL != rs[i].cleaner) + rs[i].cleaner (rs[i].conv_cls, + &rs[i]); }