[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r7819 - in GNUnet/src: include libs/mysql
From: |
gnunet |
Subject: |
[GNUnet-SVN] r7819 - in GNUnet/src: include libs/mysql |
Date: |
Sun, 2 Nov 2008 12:18:19 -0700 (MST) |
Author: grothoff
Date: 2008-11-02 12:18:19 -0700 (Sun, 02 Nov 2008)
New Revision: 7819
Modified:
GNUnet/src/include/gnunet_mysql.h
GNUnet/src/libs/mysql/lmysql.c
Log:
finished new mysql library -- not yet tested...
Modified: GNUnet/src/include/gnunet_mysql.h
===================================================================
--- GNUnet/src/include/gnunet_mysql.h 2008-11-02 09:10:51 UTC (rev 7818)
+++ GNUnet/src/include/gnunet_mysql.h 2008-11-02 19:18:19 UTC (rev 7819)
@@ -63,7 +63,7 @@
const char * statement);
/**
- * Prepare a statement.
+ * Create a prepared statement.
*
* @return NULL on error
*/
@@ -119,11 +119,14 @@
* @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
* values (size + buffer-reference for pointers); terminated
* with "-1"
+ * @param insert_id NULL or address where to store the row ID of whatever
+ * was inserted (only for INSERT statements!)
* @return GNUNET_SYSERR on error, otherwise
* the number of successfully affected rows
*/
int
GNUNET_MYSQL_prepared_statement_run(struct GNUNET_MysqlStatementHandle * s,
+ unsigned long long * insert_id,
...);
Modified: GNUnet/src/libs/mysql/lmysql.c
===================================================================
--- GNUnet/src/libs/mysql/lmysql.c 2008-11-02 09:10:51 UTC (rev 7818)
+++ GNUnet/src/libs/mysql/lmysql.c 2008-11-02 19:18:19 UTC (rev 7819)
@@ -103,10 +103,10 @@
#include "gnunet_util.h"
#include "gnunet_mysql.h"
-#define DEBUG_MYSQL GNUNET_NO
-
-#define DEBUG_TIME_MYSQL GNUNET_NO
-
+/**
+ * Maximum number of supported parameters for a prepared
+ * statement. Increase if needed.
+ */
#define MAX_PARAM 16
/**
@@ -256,6 +256,12 @@
return GNUNET_OK;
}
+/**
+ * Open the connection with the database (and initialize
+ * our default options).
+ *
+ * @return GNUNET_OK on success
+ */
static int
iopen(struct GNUNET_MysqlDatabaseHandle * ret)
{
@@ -304,6 +310,7 @@
struct GNUNET_MysqlDatabaseHandle * ret;
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
ret = GNUNET_malloc(sizeof(struct GNUNET_MysqlDatabaseHandle));
memset(ret, 0, sizeof(struct GNUNET_MysqlDatabaseHandle));
ret->ectx = ectx;
@@ -322,6 +329,7 @@
}
ret->next = dbs;
dbs = ret;
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return ret;
}
@@ -336,6 +344,7 @@
struct GNUNET_MysqlDatabaseHandle * prev;
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
while (dbh->statements != NULL)
GNUNET_MYSQL_prepared_statement_destroy(dbh->statements);
GNUNET_free (dbh->cnffile);
@@ -354,11 +363,13 @@
mysql_close (dbh->dbf);
GNUNET_free (dbh->cnffile);
GNUNET_free (dbh);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
}
/**
- * Run the given MySQL statement.
+ * Run the given MySQL statement.
+ *
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int
@@ -366,9 +377,11 @@
const char * statement)
{
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
if ( (! dbh->valid) &&
(GNUNET_OK != iopen(dbh)) )
{
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_SYSERR;
}
@@ -379,15 +392,17 @@
LOG_MYSQL (GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_BULK,
"mysql_query", dbh);
iclose ();
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_SYSERR;
}
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_OK;
}
/**
- * Prepare a statement.
+ * Create a prepared statement.
*
* @return NULL on error
*/
@@ -414,6 +429,11 @@
return ret;
}
+/**
+ * Prepare a statement for running.
+ *
+ * @return GNUNET_OK on success
+ */
static int
prepare_statement(struct GNUNET_MysqlStatementHandle * ret)
{
@@ -455,6 +475,7 @@
struct GNUNET_MysqlStatementHandle * prev;
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
prev = NULL;
if (s != s->db->statements)
{
@@ -471,9 +492,18 @@
mysql_stmt_close(s->statement);
GNUNET_free(s->query);
GNUNET_free(s);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
}
+/**
+ * Bind the parameters for the given MySQL statement
+ * and run it.
+ *
+ * @param s statement to bind and run
+ * @param ap arguments for the binding
+ * @return GNUNET_SYSERR on error, GNUNET_OK on success
+ */
static int
init_params(struct GNUNET_MysqlStatementHandle * s,
va_list ap)
@@ -575,25 +605,79 @@
...)
{
va_list ap;
+ int ret;
+ unsigned int rsize;
+ int total;
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
if (GNUNET_OK != prepare_statement(s))
{
GNUNET_mutex_unlock(lock);
+ mysql_thread_end ();
return GNUNET_SYSERR;
}
va_start (ap, processor_cls);
if (GNUNET_OK != init_params(s, ap))
{
va_end (ap);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_SYSERR;
}
va_end (ap);
- /* FIXME: get data!!! */
+ rsize = mysql_stmt_field_count (s->statement);
+ if (rsize > result_size)
+ {
+ GNUNET_GE_BREAK(NULL, 0);
+ mysql_thread_end ();
+ GNUNET_mutex_unlock(lock);
+ return GNUNET_SYSERR;
+ }
+ if (mysql_stmt_bind_result (s->statement, results))
+ {
+ GNUNET_GE_LOG (s->db->ectx,
+ GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+ _("`%s' failed at %s:%d with error: %s\n"),
+ "mysql_stmt_bind_result",
+ __FILE__, __LINE__,
+ mysql_stmt_error (s->statement));
+ iclose ();
+ mysql_thread_end ();
+ GNUNET_mutex_unlock (lock);
+ return GNUNET_SYSERR;
+ }
+ total = 0;
+ while (1)
+ {
+ ret = mysql_stmt_fetch (s->statement);
+ if (ret == MYSQL_NO_DATA)
+ break;
+ if (ret != 0)
+ {
+ GNUNET_GE_LOG (s->db->ectx,
+ GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+ _("`%s' failed at %s:%d with error: %s\n"),
+ "mysql_stmt_fetch",
+ __FILE__, __LINE__,
+ mysql_stmt_error (s->statement));
+ iclose ();
+ mysql_thread_end ();
+ GNUNET_mutex_unlock (lock);
+ return GNUNET_SYSERR;
+ }
+ if (processor != NULL)
+ if (GNUNET_OK !=
+ processor(processor_cls,
+ rsize,
+ results))
+ break;
+ total++;
+ }
mysql_stmt_reset (s->statement);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
- return GNUNET_SYSERR;
+ return total;
}
@@ -603,33 +687,43 @@
* @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
* values (size + buffer-reference for pointers); terminated
* with "-1"
+ * @param insert_id NULL or address where to store the row ID of whatever
+ * was inserted (only for INSERT statements!)
* @return GNUNET_SYSERR on error, otherwise
* the number of successfully affected rows
*/
int
GNUNET_MYSQL_prepared_statement_run(struct GNUNET_MysqlStatementHandle * s,
+ unsigned long long * insert_id,
...)
{
va_list ap;
+ int affected;
GNUNET_mutex_lock(lock);
+ mysql_thread_init ();
if (GNUNET_OK != prepare_statement(s))
{
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_SYSERR;
}
- va_start (ap, s);
+ va_start (ap, insert_id);
if (GNUNET_OK != init_params(s, ap))
{
va_end (ap);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
return GNUNET_SYSERR;
}
va_end (ap);
- /* FIXME: get any data?? */
+ affected = mysql_stmt_affected_rows (s->statement);
+ if (NULL != insert_id)
+ *insert_id = (unsigned long long) mysql_stmt_insert_id (s->statement);
mysql_stmt_reset (s->statement);
+ mysql_thread_end ();
GNUNET_mutex_unlock(lock);
- return GNUNET_OK;
+ return affected;
}
void __attribute__ ((constructor)) GNUNET_mysql_ltdl_init ()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r7819 - in GNUnet/src: include libs/mysql,
gnunet <=