From 123f69c6f3860c6d0cfbb69b8e9912cbd1c81ef9 Mon Sep 17 00:00:00 2001 From: Marius Tolzmann Date: Wed, 27 May 2015 15:52:30 +0200 Subject: [PATCH] mx_mysql: Add mx_mysql_do_statement() --- mx_mysql.c | 43 +++++++++++++++++++++++++++++++++++++++++++ mx_mysql.h | 4 ++++ 2 files changed, 47 insertions(+) diff --git a/mx_mysql.c b/mx_mysql.c index faf6e796..33557f29 100644 --- a/mx_mysql.c +++ b/mx_mysql.c @@ -1132,6 +1132,49 @@ int mx_mysql_bind_init(struct mx_mysql_bind *bind, unsigned long count, enum mx_ return 0; } +int mx_mysql_do_statement(struct mx_mysql *mysql, char *query, struct mx_mysql_bind *param, struct mx_mysql_bind *result, void *from, void **to, size_t size) +{ + struct mx_mysql_stmt *stmt = NULL; + unsigned long long num_rows = 0; + int res; + int cnt = 0; + char *tmpdata; + + assert(mysql); + + stmt = mx_mysql_statement_prepare_with_bindings(mysql, query, param, result); + if (!stmt) { + mx_log_err("mx_mysql_statement_prepare(): %m"); + return -errno; + } + + res = mx_mysql_statement_execute(stmt, &num_rows); + if (res < 0) { + mx_log_err("mx_mysql_statement_execute(): %m"); + mx_mysql_statement_close(&stmt); + return res; + } + + if (result && result->count && num_rows) { + tmpdata = mx_calloc_forever(num_rows, size); + + for (cnt = 0; cnt < num_rows; cnt++) { + res = mx_mysql_statement_fetch(stmt); + if (res < 0) { + mx_log_err("mx_mysql_statement_fetch(): %m"); + mx_free_null(tmpdata); + mx_mysql_statement_close(&stmt); + return res; + } + memcpy(tmpdata+(cnt*size), from, size); + } + *to = tmpdata; + } + mx_mysql_statement_close(&stmt); + + return cnt; +} + struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_mysql *mysql, char *statement, struct mx_mysql_bind *param, struct mx_mysql_bind *result) { int res; diff --git a/mx_mysql.h b/mx_mysql.h index d4ad1ddc..483f137c 100644 --- a/mx_mysql.h +++ b/mx_mysql.h @@ -113,6 +113,10 @@ int mx_mysql_end(void); int mx_mysql_finish(struct mx_mysql **mysql); +#define mx_mysql_do_statement_noresult(m, q, p) \ + mx_mysql_do_statement(m, q, p, NULL, NULL, NULL, 0) +int mx_mysql_do_statement(struct mx_mysql *mysql, char *query, struct mx_mysql_bind *param, struct mx_mysql_bind *result, void *from, void **to, size_t size); + int mx_mysql_statement_init(struct mx_mysql *mysql, struct mx_mysql_stmt **stmt); struct mx_mysql_stmt *mx_mysql_statement_prepare(struct mx_mysql *mysql, char *statement); struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_mysql *mysql, char *statement, struct mx_mysql_bind *param, struct mx_mysql_bind *result);