aboutsummaryrefslogtreecommitdiff
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)
-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 1c3166dc77..67d2e63d2e 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,
/**
* Close database connection and all prepared statements (we got a DB
- * disconnect error).
+ * error).
*
* @param mc mysql context
*/
-static void
-iclose (struct GNUNET_MYSQL_Context *mc)
+void
+GNUNET_MYSQL_statements_invalidate (struct GNUNET_MYSQL_Context *mc)
{
struct GNUNET_MYSQL_StatementHandle *sh;
@@ -351,7 +351,7 @@ GNUNET_MYSQL_context_destroy (struct GNUNET_MYSQL_Context *mc)
{
struct GNUNET_MYSQL_StatementHandle *sh;
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
while (NULL != (sh = mc->shead))
{
GNUNET_CONTAINER_DLL_remove (mc->shead, mc->stail, sh);
@@ -402,7 +402,7 @@ GNUNET_MYSQL_statement_run (struct GNUNET_MYSQL_Context *mc,
if (mysql_error (mc->dbf)[0])
{
LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_query", mc);
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
return GNUNET_OK;
@@ -427,7 +427,7 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
sh->statement = mysql_stmt_init (mc->dbf);
if (NULL == sh->statement)
{
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
if (0 != mysql_stmt_prepare (sh->statement, sh->query, strlen (sh->query)))
@@ -435,7 +435,7 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
LOG_MYSQL (GNUNET_ERROR_TYPE_ERROR, "mysql_stmt_prepare", mc);
mysql_stmt_close (sh->statement);
sh->statement = NULL;
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
sh->valid = GNUNET_YES;
@@ -444,6 +444,24 @@ prepare_statement (struct GNUNET_MYSQL_Context *mc,
/**
+ * Get internal handle for a prepared statement. This function should rarely
+ * be used, and if, with caution! On failures during the interaction with
+ * the handle, you must call 'GNUNET_MYSQL_statements_invalidate'!
+ *
+ * @param mc mysql context
+ * @param sh prepared statement to introspect
+ * @return MySQL statement handle, NULL on error
+ */
+MYSQL_STMT *
+GNUNET_MYSQL_statement_get_stmt (struct GNUNET_MYSQL_Context *mc,
+ struct GNUNET_MYSQL_StatementHandle *sh)
+{
+ (void) prepare_statement (mc, sh);
+ return sh->statement;
+}
+
+
+/**
* Bind the parameters for the given MySQL statement
* and run it.
*
@@ -519,7 +537,7 @@ init_params (struct GNUNET_MYSQL_Context *mc,
_("`%s' failed at %s:%d with error: %s\n"),
"mysql_stmt_bind_param", __FILE__, __LINE__,
mysql_stmt_error (sh->statement));
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
if (mysql_stmt_execute (sh->statement))
@@ -529,75 +547,71 @@ init_params (struct GNUNET_MYSQL_Context *mc,
_("`%s' failed at %s:%d with error: %s\n"),
"mysql_stmt_execute", __FILE__, __LINE__,
mysql_stmt_error (sh->statement));
- iclose (mc);
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
return GNUNET_OK;
}
+
/**
* Run a prepared SELECT statement.
*
* @param mc mysql context
- * @param sh handle to SELECT statment
+ * @param s statement to run
* @param result_size number of elements in results array
* @param results pointer to already initialized MYSQL_BIND
* array (of sufficient size) for passing results
- * @param processor function to call on each result
- * @param processor_cls extra argument to processor
- * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
+ * @param ap pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
* values (size + buffer-reference for pointers); terminated
* with "-1"
* @return GNUNET_SYSERR on error, otherwise
* the number of successfully affected (or queried) rows
*/
int
-GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc,
- struct GNUNET_MYSQL_StatementHandle *sh,
- unsigned int result_size, MYSQL_BIND * results,
- GNUNET_MYSQL_DataProcessor processor,
- void *processor_cls, ...)
+GNUNET_MYSQL_statement_run_prepared_select_va (struct GNUNET_MYSQL_Context *mc,
+ struct GNUNET_MYSQL_StatementHandle *s,
+ unsigned int result_size,
+ MYSQL_BIND * results,
+ GNUNET_MYSQL_DataProcessor processor,
+ void *processor_cls,
+ va_list ap)
{
- va_list ap;
int ret;
unsigned int rsize;
int total;
- if (GNUNET_OK != prepare_statement (mc, sh))
+ if (GNUNET_OK != prepare_statement (mc, s))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
- va_start (ap, processor_cls);
- if (GNUNET_OK != init_params (mc, sh, ap))
+ if (GNUNET_OK != init_params (mc, s, ap))
{
GNUNET_break (0);
- va_end (ap);
return GNUNET_SYSERR;
}
- va_end (ap);
- rsize = mysql_stmt_field_count (sh->statement);
+ rsize = mysql_stmt_field_count (s->statement);
if (rsize > result_size)
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
- if (mysql_stmt_bind_result (sh->statement, results))
+ if (mysql_stmt_bind_result (s->statement, results))
{
- 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 (sh->statement));
- iclose (mc);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("`%s' failed at %s:%d with error: %s\n"),
+ "mysql_stmt_bind_result", __FILE__, __LINE__,
+ mysql_stmt_error (s->statement));
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
-
+
total = 0;
while (1)
{
- ret = mysql_stmt_fetch (sh->statement);
+ ret = mysql_stmt_fetch (s->statement);
if (ret == MYSQL_NO_DATA)
break;
if (ret != 0)
@@ -606,21 +620,54 @@ GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc,
"mysql",
_("`%s' failed at %s:%d with error: %s\n"),
"mysql_stmt_fetch", __FILE__, __LINE__,
- mysql_stmt_error (sh->statement));
- iclose (mc);
+ mysql_stmt_error (s->statement));
+ GNUNET_MYSQL_statements_invalidate (mc);
return GNUNET_SYSERR;
}
- if (processor != NULL)
- if (GNUNET_OK != processor (processor_cls, rsize, results))
- break;
total++;
+ if ( (NULL == processor) ||
+ (GNUNET_OK != processor (processor_cls, rsize, results)) )
+ break;
}
- mysql_stmt_reset (sh->statement);
+ mysql_stmt_reset (s->statement);
return total;
}
/**
+ * Run a prepared SELECT statement.
+ *
+ * @param mc mysql context
+ * @param sh handle to SELECT statment
+ * @param result_size number of elements in results array
+ * @param results pointer to already initialized MYSQL_BIND
+ * array (of sufficient size) for passing results
+ * @param processor function to call on each result
+ * @param processor_cls extra argument to processor
+ * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
+ * values (size + buffer-reference for pointers); terminated
+ * with "-1"
+ * @return GNUNET_SYSERR on error, otherwise
+ * the number of successfully affected (or queried) rows
+ */
+int
+GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_Context *mc,
+ struct GNUNET_MYSQL_StatementHandle *sh,
+ unsigned int result_size, MYSQL_BIND * results,
+ GNUNET_MYSQL_DataProcessor processor,
+ void *processor_cls, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start (ap, processor_cls);
+ ret = GNUNET_MYSQL_statement_run_prepared_select_va (mc, sh, result_size, results, processor, processor_cls, ap);
+ va_end (ap);
+ return ret;
+}
+
+
+/**
* Run a prepared statement that does NOT produce results.
*
* @param mc mysql context