35 #include <mysql/mysql.h>
44 static int db_backend_mysql_transaction_rollback(
void*);
49 static int __mysql_initialized = 0;
126 if (bind->
bind && bind->
bind->buffer) {
127 free(bind->
bind->buffer);
145 if(mysql_query(backend_mysql->
db,
"SELECT 1")) {
146 ods_log_warning(
"db_backend_mysql: connection lost, trying to reconnect");
147 if(!mysql_real_connect(backend_mysql->
db, backend_mysql->
db_host, backend_mysql->
db_user, backend_mysql->
db_pass,
149 mysql_autocommit(backend_mysql->
db, 1)) {
150 if (backend_mysql->
db) {
151 ods_log_error(
"db_backend_mysql: reconnect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
152 mysql_close(backend_mysql->
db);
153 backend_mysql->
db = NULL;
157 result = mysql_store_result(backend_mysql->
db);
158 mysql_free_result(result);
169 unsigned long i, params;
172 MYSQL_BIND* mysql_bind;
173 MYSQL_RES* result_metadata = NULL;
176 if (!backend_mysql) {
179 if (!backend_mysql->
db) {
192 checkconnection(backend_mysql);
197 ods_log_debug(
"%s", sql);
199 || !((*statement)->statement = mysql_stmt_init(backend_mysql->
db))
200 || mysql_stmt_prepare((*statement)->statement, sql, size))
202 if ((*statement)->statement) {
203 ods_log_info(
"DB prepare SQL %s", sql);
204 ods_log_info(
"DB prepare Err %d: %s", mysql_stmt_errno((*statement)->statement), mysql_stmt_error((*statement)->statement));
206 __db_backend_mysql_finish(*statement);
211 (*statement)->backend_mysql = backend_mysql;
217 if ((params = mysql_stmt_param_count((*statement)->statement)) > 0) {
218 if (!((*statement)->mysql_bind_input = calloc(params,
sizeof(MYSQL_BIND)))) {
219 __db_backend_mysql_finish(*statement);
224 for (i = 0; i < params; i++) {
226 __db_backend_mysql_finish(*statement);
231 bind->
bind = &((*statement)->mysql_bind_input[i]);
232 if (!(*statement)->bind_input) {
233 (*statement)->bind_input = bind;
235 if ((*statement)->bind_input_end) {
236 (*statement)->bind_input_end->
next = bind;
238 (*statement)->bind_input_end = bind;
245 if (object_field_list
247 && (result_metadata = mysql_stmt_result_metadata((*statement)->statement)))
250 || !((*statement)->mysql_bind_output = calloc(params,
sizeof(MYSQL_BIND))))
252 mysql_free_result(result_metadata);
253 __db_backend_mysql_finish(*statement);
258 (*statement)->fields = params;
259 field = mysql_fetch_field(result_metadata);
261 for (i = 0; i < params; i++) {
266 mysql_free_result(result_metadata);
267 __db_backend_mysql_finish(*statement);
272 bind->
bind = (mysql_bind = &((*statement)->mysql_bind_output[i]));
273 mysql_bind->is_null = (my_bool*)0;
274 mysql_bind->error = &bind->
error;
275 mysql_bind->length = &bind->
length;
279 switch (field->type) {
280 case MYSQL_TYPE_TINY:
281 case MYSQL_TYPE_SHORT:
282 case MYSQL_TYPE_LONG:
283 case MYSQL_TYPE_INT24:
284 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
286 mysql_free_result(result_metadata);
287 __db_backend_mysql_finish(*statement);
292 bind->
length = mysql_bind->buffer_length;
293 mysql_bind->is_unsigned = 1;
296 case MYSQL_TYPE_LONGLONG:
297 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
299 mysql_free_result(result_metadata);
300 __db_backend_mysql_finish(*statement);
305 bind->
length = mysql_bind->buffer_length;
306 mysql_bind->is_unsigned = 1;
309 case MYSQL_TYPE_STRING:
310 case MYSQL_TYPE_VAR_STRING:
311 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
316 bind->
length = field->length + 1;
320 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
321 mysql_free_result(result_metadata);
322 __db_backend_mysql_finish(*statement);
326 mysql_bind->buffer_length = bind->
length;
327 mysql_bind->is_unsigned = 0;
331 mysql_free_result(result_metadata);
332 __db_backend_mysql_finish(*statement);
346 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
348 mysql_free_result(result_metadata);
349 __db_backend_mysql_finish(*statement);
354 bind->
length = mysql_bind->buffer_length;
355 mysql_bind->is_unsigned = 0;
359 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
361 mysql_free_result(result_metadata);
362 __db_backend_mysql_finish(*statement);
367 bind->
length = mysql_bind->buffer_length;
368 mysql_bind->is_unsigned = 1;
372 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
374 mysql_free_result(result_metadata);
375 __db_backend_mysql_finish(*statement);
380 bind->
length = mysql_bind->buffer_length;
381 mysql_bind->is_unsigned = 0;
385 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
387 mysql_free_result(result_metadata);
388 __db_backend_mysql_finish(*statement);
393 bind->
length = mysql_bind->buffer_length;
394 mysql_bind->is_unsigned = 1;
398 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
403 bind->
length = field->length + 1;
407 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
408 mysql_free_result(result_metadata);
409 __db_backend_mysql_finish(*statement);
413 mysql_bind->buffer_length = bind->
length;
414 mysql_bind->is_unsigned = 0;
419 switch (field->type) {
420 case MYSQL_TYPE_TINY:
421 case MYSQL_TYPE_SHORT:
422 case MYSQL_TYPE_LONG:
423 case MYSQL_TYPE_INT24:
424 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
425 if (field->flags & UNSIGNED_FLAG) {
427 mysql_free_result(result_metadata);
428 __db_backend_mysql_finish(*statement);
433 mysql_bind->is_unsigned = 1;
437 mysql_free_result(result_metadata);
438 __db_backend_mysql_finish(*statement);
443 mysql_bind->is_unsigned = 0;
445 bind->
length = mysql_bind->buffer_length;
448 case MYSQL_TYPE_LONGLONG:
449 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
450 if (field->flags & UNSIGNED_FLAG) {
452 mysql_free_result(result_metadata);
453 __db_backend_mysql_finish(*statement);
458 mysql_bind->is_unsigned = 1;
462 mysql_free_result(result_metadata);
463 __db_backend_mysql_finish(*statement);
468 mysql_bind->is_unsigned = 0;
470 bind->
length = mysql_bind->buffer_length;
473 case MYSQL_TYPE_STRING:
474 case MYSQL_TYPE_VAR_STRING:
475 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
480 bind->
length = field->length + 1;
484 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
485 mysql_free_result(result_metadata);
486 __db_backend_mysql_finish(*statement);
490 mysql_bind->buffer_length = bind->
length;
491 mysql_bind->is_unsigned = 0;
495 mysql_free_result(result_metadata);
496 __db_backend_mysql_finish(*statement);
506 if (!(*statement)->bind_output) {
507 (*statement)->bind_output = bind;
509 if ((*statement)->bind_output_end) {
510 (*statement)->bind_output_end->
next = bind;
512 (*statement)->bind_output_end = bind;
514 field = mysql_fetch_field(result_metadata);
520 if (object_field || field) {
521 mysql_free_result(result_metadata);
522 __db_backend_mysql_finish(*statement);
527 if (result_metadata) {
528 mysql_free_result(result_metadata);
552 if (!statement->
bound) {
556 ods_log_info(
"DB bind result Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
559 statement->
bound = 1;
565 ret = mysql_stmt_fetch(statement->
statement);
567 ods_log_info(
"DB fetch Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
570 else if (ret == MYSQL_DATA_TRUNCATED) {
583 for (i = 0, bind = statement->
bind_output; bind; i++, bind = bind->
next) {
588 ods_log_info(
"DB fetch Err data truncated");
595 ods_log_info(
"DB fetch Err data truncated");
603 ods_log_info(
"DB fetch Err data truncated");
609 else if (ret == MYSQL_NO_DATA) {
617 ods_log_info(
"DB fetch UNKNOWN %d Err %d: %s", ret, mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
643 ods_log_info(
"DB bind param Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
650 if (mysql_stmt_execute(statement->
statement)) {
651 ods_log_info(
"DB execute Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
658 static int db_backend_mysql_initialize(
void* data) {
661 if (!backend_mysql) {
665 if (!__mysql_initialized) {
666 if (mysql_library_init(0, NULL, NULL)) {
669 __mysql_initialized = 1;
674 static int db_backend_mysql_shutdown(
void* data) {
677 if (!backend_mysql) {
681 if (__mysql_initialized) {
683 __mysql_initialized = 0;
697 unsigned int port = 0;
699 if (!__mysql_initialized) {
702 if (!backend_mysql) {
705 if (backend_mysql->
db) {
708 if (!configuration_list) {
717 if (port_configuration) {
728 backend_mysql->
timeout = (
unsigned int)timeout;
737 if (!(backend_mysql->
db = mysql_init(NULL))
738 || mysql_options(backend_mysql->
db, MYSQL_OPT_CONNECT_TIMEOUT, &backend_mysql->
timeout)
739 || !mysql_real_connect(backend_mysql->
db,
742 || mysql_autocommit(backend_mysql->
db, 1))
744 if (backend_mysql->
db) {
745 ods_log_error(
"db_backend_mysql: connect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
746 mysql_close(backend_mysql->
db);
747 backend_mysql->
db = NULL;
755 static int db_backend_mysql_disconnect(
void* data) {
758 if (!__mysql_initialized) {
761 if (!backend_mysql) {
764 if (!backend_mysql->
db) {
769 db_backend_mysql_transaction_rollback(backend_mysql);
772 mysql_close(backend_mysql->
db);
773 backend_mysql->
db = NULL;
787 static int __db_backend_mysql_build_clause(
const db_object_t*
object,
const db_clause_list_t* clause_list,
char** sqlp,
int* left) {
816 if ((ret = snprintf(*sqlp, *left,
" AND")) >= *left) {
822 if ((ret = snprintf(*sqlp, *left,
" OR")) >= *left) {
836 if ((ret = snprintf(*sqlp, *left,
" %s.%s = ?",
845 if ((ret = snprintf(*sqlp, *left,
" %s.%s != ?",
854 if ((ret = snprintf(*sqlp, *left,
" %s.%s < ?",
863 if ((ret = snprintf(*sqlp, *left,
" %s.%s <= ?",
872 if ((ret = snprintf(*sqlp, *left,
" %s.%s >= ?",
881 if ((ret = snprintf(*sqlp, *left,
" %s.%s > ?",
890 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NULL",
899 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NOT NULL",
908 if ((ret = snprintf(*sqlp, *left,
" (")) >= *left) {
913 if (__db_backend_mysql_build_clause(
object,
db_clause_list(clause), sqlp, left)) {
916 if ((ret = snprintf(*sqlp, *left,
" )")) >= *left) {
961 (*bind)->bind->length = &((*bind)->bind->buffer_length);
962 (*bind)->bind->is_null = (my_bool*)0;
977 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
978 (*bind)->bind->buffer = (
void*)int32;
980 (*bind)->bind->is_unsigned = 0;
987 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
988 (*bind)->bind->buffer = (
void*)uint32;
990 (*bind)->bind->is_unsigned = 1;
997 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
998 (*bind)->bind->buffer = (
void*)int64;
1000 (*bind)->bind->is_unsigned = 0;
1007 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
1008 (*bind)->bind->buffer = (
void*)uint64;
1010 (*bind)->bind->is_unsigned = 1;
1017 (*bind)->bind->buffer_type = MYSQL_TYPE_STRING;
1018 (*bind)->bind->buffer = (
void*)text;
1019 (*bind)->bind->buffer_length = strlen(text);
1020 (*bind)->bind->is_unsigned = 0;
1027 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
1028 (*bind)->bind->buffer = (
void*)&((*bind)->value_enum);
1029 (*bind)->bind->buffer_length =
sizeof(int);
1030 (*bind)->bind->is_unsigned = 0;
1047 *bind = (*bind)->
next;
1048 if (__db_backend_mysql_bind_clause(bind,
db_clause_list(clause))) {
1058 *bind = (*bind)->
next;
1081 bind->
bind->length = &(bind->
bind->buffer_length);
1082 bind->
bind->is_null = (my_bool*)0;
1090 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1091 bind->
bind->buffer = (
void*)int32;
1093 bind->
bind->is_unsigned = 0;
1100 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1101 bind->
bind->buffer = (
void*)uint32;
1103 bind->
bind->is_unsigned = 1;
1110 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1111 bind->
bind->buffer = (
void*)int64;
1113 bind->
bind->is_unsigned = 0;
1120 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1121 bind->
bind->buffer = (
void*)uint64;
1123 bind->
bind->is_unsigned = 1;
1130 bind->
bind->buffer_type = MYSQL_TYPE_STRING;
1131 bind->
bind->buffer = (
void*)text;
1132 bind->
bind->buffer_length = strlen(text);
1133 bind->
bind->is_unsigned = 0;
1140 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1142 bind->
bind->buffer_length =
sizeof(int);
1143 bind->
bind->is_unsigned = 0;
1171 if (__db_backend_mysql_bind_value(*bind,
db_value_set_at(value_set, i))) {
1178 static db_result_t* db_backend_mysql_next(
void* data,
int finish) {
1197 __db_backend_mysql_finish(statement);
1201 if (__db_backend_mysql_fetch(statement)) {
1216 while (object_field) {
1217 if (!bind || !bind->
bind || !bind->
bind->buffer) {
1226 switch (bind->
bind->buffer_type) {
1227 case MYSQL_TYPE_LONG:
1228 if ((bind->
bind->is_unsigned
1230 || (!bind->
bind->is_unsigned
1238 case MYSQL_TYPE_LONGLONG:
1239 if ((bind->
bind->is_unsigned
1241 || (!bind->
bind->is_unsigned
1249 case MYSQL_TYPE_STRING:
1279 if (bind->
bind->buffer_type != MYSQL_TYPE_LONG
1280 || (bind->
bind->is_unsigned
1282 || (!bind->
bind->is_unsigned
1292 if (bind->
bind->buffer_type != MYSQL_TYPE_LONGLONG
1293 || (bind->
bind->is_unsigned
1295 || (!bind->
bind->is_unsigned
1304 if (bind->
bind->buffer_type != MYSQL_TYPE_STRING
1333 int ret, left, first;
1338 if (!__mysql_initialized) {
1341 if (!backend_mysql) {
1347 if (!object_field_list) {
1358 while (object_field) {
1360 if (revision_field) {
1367 revision_field = object_field;
1374 memset(sql, 0, left);
1380 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s () VALUES ()",
db_object_table(
object))) >= left) {
1387 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s (",
db_object_table(
object))) >= left) {
1398 while (object_field) {
1419 if (revision_field) {
1435 if ((ret = snprintf(sqlp, left,
" ) VALUES (")) >= left) {
1446 while (object_field) {
1448 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1454 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1467 if (revision_field) {
1469 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1475 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1483 if ((ret = snprintf(sqlp, left,
" )")) >= left) {
1497 __db_backend_mysql_finish(statement);
1504 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1505 __db_backend_mysql_finish(statement);
1512 if (revision_field) {
1514 || __db_backend_mysql_bind_value(bind, &revision))
1517 __db_backend_mysql_finish(statement);
1526 if (__db_backend_mysql_execute(statement)
1527 || mysql_stmt_affected_rows(statement->
statement) != 1)
1529 __db_backend_mysql_finish(statement);
1532 __db_backend_mysql_finish(statement);
1543 int ret, left, first;
1548 if (!__mysql_initialized) {
1551 if (!backend_mysql) {
1560 memset(sql, 0, left);
1562 if ((ret = snprintf(sqlp, left,
"SELECT")) >= left) {
1570 while (object_field) {
1588 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
1597 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
1614 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1620 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1628 __db_backend_mysql_finish(statement);
1635 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1636 __db_backend_mysql_finish(statement);
1644 if (__db_backend_mysql_execute(statement)) {
1645 __db_backend_mysql_finish(statement);
1653 __db_backend_mysql_finish(statement);
1668 int ret, left, first;
1677 if (!__mysql_initialized) {
1680 if (!backend_mysql) {
1686 if (!object_field_list) {
1697 while (object_field) {
1699 if (revision_field) {
1706 revision_field = object_field;
1710 if (revision_field) {
1718 revision_clause = clause;
1723 if (!revision_clause) {
1731 revision_number = int32;
1738 revision_number = uint32;
1745 revision_number = int64;
1752 revision_number = uint64;
1762 memset(sql, 0, left);
1764 if ((ret = snprintf(sqlp, left,
"UPDATE %s SET",
db_object_table(
object))) >= left) {
1775 while (object_field) {
1796 if (revision_field) {
1817 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1823 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1834 __db_backend_mysql_finish(statement);
1844 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1845 __db_backend_mysql_finish(statement);
1853 if (revision_field) {
1855 || __db_backend_mysql_bind_value(bind, &revision))
1858 __db_backend_mysql_finish(statement);
1871 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1872 __db_backend_mysql_finish(statement);
1880 if (__db_backend_mysql_execute(statement)) {
1881 __db_backend_mysql_finish(statement);
1889 if (revision_field) {
1890 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
1891 __db_backend_mysql_finish(statement);
1896 __db_backend_mysql_finish(statement);
1911 if (!__mysql_initialized) {
1914 if (!backend_mysql) {
1925 while (object_field) {
1927 if (revision_field) {
1934 revision_field = object_field;
1938 if (revision_field) {
1957 memset(sql, 0, left);
1959 if ((ret = snprintf(sqlp, left,
"DELETE FROM %s",
db_object_table(
object))) >= left) {
1967 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1973 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1981 __db_backend_mysql_finish(statement);
1988 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1989 __db_backend_mysql_finish(statement);
1994 if (__db_backend_mysql_execute(statement)) {
1995 __db_backend_mysql_finish(statement);
2003 if (revision_field) {
2004 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
2005 __db_backend_mysql_finish(statement);
2010 __db_backend_mysql_finish(statement);
2025 if (!__mysql_initialized) {
2028 if (!backend_mysql) {
2040 memset(sql, 0, left);
2042 if ((ret = snprintf(sqlp, left,
"SELECT COUNT(*)")) >= left) {
2048 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
2057 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
2074 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
2080 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
2096 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), object_field_list)
2100 __db_backend_mysql_finish(statement);
2108 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
2109 __db_backend_mysql_finish(statement);
2114 if (__db_backend_mysql_execute(statement)) {
2115 __db_backend_mysql_finish(statement);
2119 if (__db_backend_mysql_fetch(statement)) {
2120 __db_backend_mysql_finish(statement);
2125 if (!bind || !bind->
bind || !bind->
bind->buffer
2126 || bind->
bind->buffer_type != MYSQL_TYPE_LONG
2127 || !bind->
bind->is_unsigned
2130 __db_backend_mysql_finish(statement);
2135 __db_backend_mysql_finish(statement);
2140 static void db_backend_mysql_free(
void* data) {
2143 if (backend_mysql) {
2144 if (backend_mysql->
db) {
2145 (void)db_backend_mysql_disconnect(backend_mysql);
2147 free(backend_mysql);
2151 static int db_backend_mysql_transaction_begin(
void* data) {
2153 static const char* sql =
"BEGIN TRANSACTION";
2156 if (!__mysql_initialized) {
2159 if (!backend_mysql) {
2166 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2170 if (__db_backend_mysql_execute(statement)) {
2171 __db_backend_mysql_finish(statement);
2174 __db_backend_mysql_finish(statement);
2180 static int db_backend_mysql_transaction_commit(
void* data) {
2182 static const char* sql =
"COMMIT TRANSACTION";
2185 if (!__mysql_initialized) {
2188 if (!backend_mysql) {
2195 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2199 if (__db_backend_mysql_execute(statement)) {
2200 __db_backend_mysql_finish(statement);
2203 __db_backend_mysql_finish(statement);
2209 static int db_backend_mysql_transaction_rollback(
void* data) {
2211 static const char* sql =
"ROLLBACK TRANSACTION";
2214 if (!__mysql_initialized) {
2217 if (!backend_mysql) {
2224 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2228 if (__db_backend_mysql_execute(statement)) {
2229 __db_backend_mysql_finish(statement);
2232 __db_backend_mysql_finish(statement);
2260 free(backend_mysql);
2264 return backend_handle;
int db_backend_handle_set_count(db_backend_handle_t *backend_handle, db_backend_handle_count_t count_function)
int db_backend_handle_set_update(db_backend_handle_t *backend_handle, db_backend_handle_update_t update_function)
int db_backend_handle_set_shutdown(db_backend_handle_t *backend_handle, db_backend_handle_shutdown_t shutdown_function)
int db_backend_handle_set_initialize(db_backend_handle_t *backend_handle, db_backend_handle_initialize_t initialize_function)
void db_backend_handle_free(db_backend_handle_t *backend_handle)
int db_backend_handle_set_disconnect(db_backend_handle_t *backend_handle, db_backend_handle_disconnect_t disconnect_function)
int db_backend_handle_set_delete(db_backend_handle_t *backend_handle, db_backend_handle_delete_t delete_function)
int db_backend_handle_set_transaction_rollback(db_backend_handle_t *backend_handle, db_backend_handle_transaction_rollback_t transaction_rollback_function)
db_backend_handle_t * db_backend_handle_new(void)
int db_backend_handle_set_transaction_commit(db_backend_handle_t *backend_handle, db_backend_handle_transaction_commit_t transaction_commit_function)
int db_backend_handle_set_transaction_begin(db_backend_handle_t *backend_handle, db_backend_handle_transaction_begin_t transaction_begin_function)
int db_backend_handle_set_read(db_backend_handle_t *backend_handle, db_backend_handle_read_t read_function)
int db_backend_handle_set_create(db_backend_handle_t *backend_handle, db_backend_handle_create_t create_function)
int db_backend_handle_set_data(db_backend_handle_t *backend_handle, void *data)
int db_backend_handle_set_free(db_backend_handle_t *backend_handle, db_backend_handle_free_t free_function)
int db_backend_handle_set_connect(db_backend_handle_t *backend_handle, db_backend_handle_connect_t connect_function)
struct db_backend_mysql_statement db_backend_mysql_statement_t
struct db_backend_mysql db_backend_mysql_t
db_backend_handle_t * db_backend_mysql_new_handle(void)
#define DB_BACKEND_MYSQL_STRING_MIN_SIZE
#define DB_BACKEND_MYSQL_DEFAULT_TIMEOUT
db_clause_operator_t db_clause_operator(const db_clause_t *clause)
const char * db_clause_field(const db_clause_t *clause)
db_clause_type_t db_clause_type(const db_clause_t *clause)
const db_clause_t * db_clause_list_begin(const db_clause_list_t *clause_list)
const db_value_t * db_clause_value(const db_clause_t *clause)
const db_clause_list_t * db_clause_list(const db_clause_t *clause)
const db_clause_t * db_clause_next(const db_clause_t *clause)
@ DB_CLAUSE_GREATER_OR_EQUAL
@ DB_CLAUSE_LESS_OR_EQUAL
const char * db_configuration_value(const db_configuration_t *configuration)
const db_configuration_t * db_configuration_list_find(const db_configuration_list_t *configuration_list, const char *name)
const char * db_join_to_table(const db_join_t *join)
const char * db_join_to_field(const db_join_t *join)
const char * db_join_from_table(const db_join_t *join)
const db_join_t * db_join_next(const db_join_t *join)
const char * db_join_from_field(const db_join_t *join)
const db_join_t * db_join_list_begin(const db_join_list_t *join_list)
const db_object_field_t * db_object_field_next(const db_object_field_t *object_field)
db_type_t db_object_field_type(const db_object_field_t *object_field)
int db_object_field_list_add(db_object_field_list_t *object_field_list, db_object_field_t *object_field)
const char * db_object_field_name(const db_object_field_t *object_field)
db_object_field_t * db_object_field_new(void)
const db_object_field_t * db_object_field_list_begin(const db_object_field_list_t *object_field_list)
db_object_field_list_t * db_object_field_list_new_copy(const db_object_field_list_t *from_object_field_list)
int db_object_field_set_name(db_object_field_t *object_field, const char *name)
int db_object_field_set_type(db_object_field_t *object_field, db_type_t type)
const char * db_object_table(const db_object_t *object)
size_t db_object_field_list_size(const db_object_field_list_t *object_field_list)
db_object_field_list_t * db_object_field_list_new(void)
void db_object_field_free(db_object_field_t *object_field)
void db_object_field_list_free(db_object_field_list_t *object_field_list)
const db_object_field_list_t * db_object_object_field_list(const db_object_t *object)
db_result_list_t * db_result_list_new(void)
db_result_t * db_result_new(void)
int db_result_set_value_set(db_result_t *result, db_value_set_t *value_set)
int db_result_list_set_next(db_result_list_t *result_list, db_result_list_next_t next_function, void *next_data, size_t size)
void db_result_free(db_result_t *result)
void db_result_list_free(db_result_list_t *result_list)
uint64_t db_type_uint64_t
uint32_t db_type_uint32_t
int db_value_to_int32(const db_value_t *value, db_type_int32_t *to_int32)
db_type_t db_value_type(const db_value_t *value)
const db_type_uint32_t * db_value_uint32(const db_value_t *value)
int db_value_set_primary_key(db_value_t *value)
void db_value_set_free(db_value_set_t *value_set)
const char * db_value_text(const db_value_t *value)
int db_value_from_uint32(db_value_t *value, db_type_uint32_t from_uint32)
int db_value_to_int64(const db_value_t *value, db_type_int64_t *to_int64)
int db_value_from_text(db_value_t *value, const char *from_text)
int db_value_from_int32(db_value_t *value, db_type_int32_t from_int32)
int db_value_from_int64(db_value_t *value, db_type_int64_t from_int64)
const db_type_uint64_t * db_value_uint64(const db_value_t *value)
size_t db_value_set_size(const db_value_set_t *value_set)
int db_value_to_uint32(const db_value_t *value, db_type_uint32_t *to_uint32)
int db_value_from_text2(db_value_t *value, const char *from_text, size_t size)
const db_type_int32_t * db_value_int32(const db_value_t *value)
const db_value_t * db_value_set_at(const db_value_set_t *value_set, size_t at)
int db_value_enum_value(const db_value_t *value, int *enum_value)
db_value_set_t * db_value_set_new(size_t size)
int db_value_to_uint64(const db_value_t *value, db_type_uint64_t *to_uint64)
void db_value_reset(db_value_t *value)
db_value_t * db_value_set_get(db_value_set_t *value_set, size_t at)
const db_type_int64_t * db_value_int64(const db_value_t *value)
int db_value_from_uint64(db_value_t *value, db_type_uint64_t from_uint64)
db_backend_mysql_bind_t * next
db_backend_mysql_bind_t * bind_input
db_backend_mysql_bind_t * bind_output_end
db_backend_mysql_bind_t * bind_input_end
db_backend_mysql_bind_t * bind_output
db_backend_mysql_t * backend_mysql
db_object_field_list_t * object_field_list
MYSQL_BIND * mysql_bind_input
MYSQL_BIND * mysql_bind_output