diff options
Diffstat (limited to 'src/sql.c')
-rw-r--r-- | src/sql.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/sql.c b/src/sql.c new file mode 100644 index 0000000..4b1a02b --- /dev/null +++ b/src/sql.c @@ -0,0 +1,107 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <mysql/mysql.h> +#include "trans.h" + +MYSQL mysql; +MYSQL_RES *result; + +void +sql_connect() +{ + if (!mysql_real_connect(&mysql, + sql_host, sql_user, + sql_password, sql_database, sql_port, + NULL, 0)) { + fprintf(stderr, + "cannot connect to MySQL server: %s\n", + mysql_error(&mysql)); + exit(1); + } + +} + +void +sql_close() +{ + mysql_close(&mysql); +} + +int +va_sql_query(char *fmt, va_list ap) +{ + char *buf = NULL; + int rc; + + if (result) { + mysql_free_result(result); + result = NULL; + } + + vasprintf(&buf, fmt, ap); + if (debug) + fprintf(stderr, "Executing query: %s\n", buf); + rc = mysql_query(&mysql, buf); + if (rc) { + fprintf(stderr, "MySQL Error: %s\n", mysql_error(&mysql)); + if (!debug) + fprintf(stderr, "The failed query was: %s\n", buf); + } else { + result = mysql_store_result(&mysql); + if (result) { + if (debug) + fprintf(stderr, "Query returned %lu rows\n", + mysql_num_rows(result)); + } else { + if (mysql_field_count(&mysql) == 0) { + /* query does not return data */ + if (debug) + fprintf(stderr, + "Query affected %lu rows\n", + mysql_affected_rows(&mysql)); + } else { + fprintf(stderr, + "MySQL Error: %s\n", + mysql_error(&mysql)); + if (!debug) + fprintf(stderr, + "The failed query was: %s\n", + buf); + rc = 1; + } + } + } + + free(buf); + return rc; +} + +int +sql_query(char *fmt, ...) +{ + va_list ap; + int rc; + va_start(ap, fmt); + rc = va_sql_query(fmt, ap); + va_end(ap); + return rc; +} + +int +sql_query_n(unsigned long *pret, char *fmt, ...) +{ + va_list ap; + int rc; + va_start(ap, fmt); + rc = va_sql_query(fmt, ap); + va_end(ap); + if (rc == 0) { + MYSQL_ROW row = mysql_fetch_row(result); + if (row) + *pret = strtoul (row[0], NULL, 0); + else + rc = 1; + } + return rc; +} |