35#include <mysql/mysql.h>
50static int db_backend_mysql_transaction_rollback(
void*);
55static int __mysql_initialized = 0;
132 if (bind->
bind && bind->
bind->buffer) {
133 free(bind->
bind->buffer);
151 if(mysql_query(backend_mysql->
db,
"SELECT 1")) {
152 ods_log_warning(
"db_backend_mysql: connection lost, trying to reconnect");
153 if(!mysql_real_connect(backend_mysql->
db, backend_mysql->
db_host, backend_mysql->
db_user, backend_mysql->
db_pass,
155 mysql_autocommit(backend_mysql->
db, 1)) {
156 if (backend_mysql->
db) {
157 ods_log_error(
"db_backend_mysql: reconnect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
158 mysql_close(backend_mysql->
db);
159 backend_mysql->
db = NULL;
163 result = mysql_store_result(backend_mysql->
db);
164 mysql_free_result(result);
175 unsigned long i, params;
178 MYSQL_BIND* mysql_bind;
179 MYSQL_RES* result_metadata = NULL;
182 if (!backend_mysql) {
185 if (!backend_mysql->
db) {
198 checkconnection(backend_mysql);
203 ods_log_debug(
"%s", sql);
205 || !((*statement)->statement = mysql_stmt_init(backend_mysql->
db))
206 || mysql_stmt_prepare((*statement)->statement, sql, size))
208 if ((*statement)->statement) {
209 ods_log_info(
"DB prepare SQL %s", sql);
210 ods_log_info(
"DB prepare Err %d: %s", mysql_stmt_errno((*statement)->statement), mysql_stmt_error((*statement)->statement));
212 __db_backend_mysql_finish(*statement);
223 if ((params = mysql_stmt_param_count((*statement)->statement)) > 0) {
224 if (!((*statement)->mysql_bind_input = calloc(params,
sizeof(MYSQL_BIND)))) {
225 __db_backend_mysql_finish(*statement);
230 for (i = 0; i < params; i++) {
232 __db_backend_mysql_finish(*statement);
237 bind->
bind = &((*statement)->mysql_bind_input[i]);
238 if (!(*statement)->bind_input) {
239 (*statement)->bind_input = bind;
241 if ((*statement)->bind_input_end) {
242 (*statement)->bind_input_end->
next = bind;
244 (*statement)->bind_input_end = bind;
251 if (object_field_list
253 && (result_metadata = mysql_stmt_result_metadata((*statement)->statement)))
256 || !((*statement)->mysql_bind_output = calloc(params,
sizeof(MYSQL_BIND))))
258 mysql_free_result(result_metadata);
259 __db_backend_mysql_finish(*statement);
264 (*statement)->
fields = params;
265 field = mysql_fetch_field(result_metadata);
267 for (i = 0; i < params; i++) {
272 mysql_free_result(result_metadata);
273 __db_backend_mysql_finish(*statement);
278 bind->
bind = (mysql_bind = &((*statement)->mysql_bind_output[i]));
279 mysql_bind->is_null = (
my_bool*)0;
280 mysql_bind->error = &bind->
error;
281 mysql_bind->length = &bind->
length;
285 switch (field->type) {
286 case MYSQL_TYPE_TINY:
287 case MYSQL_TYPE_SHORT:
288 case MYSQL_TYPE_LONG:
289 case MYSQL_TYPE_INT24:
290 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
292 mysql_free_result(result_metadata);
293 __db_backend_mysql_finish(*statement);
298 bind->
length = mysql_bind->buffer_length;
299 mysql_bind->is_unsigned = 1;
302 case MYSQL_TYPE_LONGLONG:
303 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
305 mysql_free_result(result_metadata);
306 __db_backend_mysql_finish(*statement);
311 bind->
length = mysql_bind->buffer_length;
312 mysql_bind->is_unsigned = 1;
315 case MYSQL_TYPE_STRING:
316 case MYSQL_TYPE_VAR_STRING:
317 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
322 bind->
length = field->length + 1;
326 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
327 mysql_free_result(result_metadata);
328 __db_backend_mysql_finish(*statement);
332 mysql_bind->buffer_length = bind->
length;
333 mysql_bind->is_unsigned = 0;
337 mysql_free_result(result_metadata);
338 __db_backend_mysql_finish(*statement);
352 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
354 mysql_free_result(result_metadata);
355 __db_backend_mysql_finish(*statement);
360 bind->
length = mysql_bind->buffer_length;
361 mysql_bind->is_unsigned = 0;
365 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
367 mysql_free_result(result_metadata);
368 __db_backend_mysql_finish(*statement);
373 bind->
length = mysql_bind->buffer_length;
374 mysql_bind->is_unsigned = 1;
378 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
380 mysql_free_result(result_metadata);
381 __db_backend_mysql_finish(*statement);
386 bind->
length = mysql_bind->buffer_length;
387 mysql_bind->is_unsigned = 0;
391 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
393 mysql_free_result(result_metadata);
394 __db_backend_mysql_finish(*statement);
399 bind->
length = mysql_bind->buffer_length;
400 mysql_bind->is_unsigned = 1;
404 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
409 bind->
length = field->length + 1;
413 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
414 mysql_free_result(result_metadata);
415 __db_backend_mysql_finish(*statement);
419 mysql_bind->buffer_length = bind->
length;
420 mysql_bind->is_unsigned = 0;
425 switch (field->type) {
426 case MYSQL_TYPE_TINY:
427 case MYSQL_TYPE_SHORT:
428 case MYSQL_TYPE_LONG:
429 case MYSQL_TYPE_INT24:
430 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
431 if (field->flags & UNSIGNED_FLAG) {
433 mysql_free_result(result_metadata);
434 __db_backend_mysql_finish(*statement);
439 mysql_bind->is_unsigned = 1;
443 mysql_free_result(result_metadata);
444 __db_backend_mysql_finish(*statement);
449 mysql_bind->is_unsigned = 0;
451 bind->
length = mysql_bind->buffer_length;
454 case MYSQL_TYPE_LONGLONG:
455 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
456 if (field->flags & UNSIGNED_FLAG) {
458 mysql_free_result(result_metadata);
459 __db_backend_mysql_finish(*statement);
464 mysql_bind->is_unsigned = 1;
468 mysql_free_result(result_metadata);
469 __db_backend_mysql_finish(*statement);
474 mysql_bind->is_unsigned = 0;
476 bind->
length = mysql_bind->buffer_length;
479 case MYSQL_TYPE_STRING:
480 case MYSQL_TYPE_VAR_STRING:
481 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
486 bind->
length = field->length + 1;
490 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
491 mysql_free_result(result_metadata);
492 __db_backend_mysql_finish(*statement);
496 mysql_bind->buffer_length = bind->
length;
497 mysql_bind->is_unsigned = 0;
501 mysql_free_result(result_metadata);
502 __db_backend_mysql_finish(*statement);
512 if (!(*statement)->bind_output) {
515 if ((*statement)->bind_output_end) {
516 (*statement)->bind_output_end->
next = bind;
518 (*statement)->bind_output_end = bind;
520 field = mysql_fetch_field(result_metadata);
526 if (object_field || field) {
527 mysql_free_result(result_metadata);
528 __db_backend_mysql_finish(*statement);
533 if (result_metadata) {
534 mysql_free_result(result_metadata);
558 if (!statement->
bound) {
562 ods_log_info(
"DB bind result Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
565 statement->
bound = 1;
571 ret = mysql_stmt_fetch(statement->
statement);
573 ods_log_info(
"DB fetch Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
576 else if (ret == MYSQL_DATA_TRUNCATED) {
589 for (i = 0, bind = statement->
bind_output; bind; i++, bind = bind->
next) {
594 ods_log_info(
"DB fetch Err data truncated");
601 ods_log_info(
"DB fetch Err data truncated");
609 ods_log_info(
"DB fetch Err data truncated");
615 else if (ret == MYSQL_NO_DATA) {
623 ods_log_info(
"DB fetch UNKNOWN %d Err %d: %s", ret, mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
649 ods_log_info(
"DB bind param Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
656 if (mysql_stmt_execute(statement->
statement)) {
657 ods_log_info(
"DB execute Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
664static int db_backend_mysql_initialize(
void* data) {
667 if (!backend_mysql) {
671 if (!__mysql_initialized) {
672 if (mysql_library_init(0, NULL, NULL)) {
675 __mysql_initialized = 1;
680static int db_backend_mysql_shutdown(
void* data) {
683 if (!backend_mysql) {
687 if (__mysql_initialized) {
689 __mysql_initialized = 0;
703 unsigned int port = 0;
705 if (!__mysql_initialized) {
708 if (!backend_mysql) {
711 if (backend_mysql->
db) {
714 if (!configuration_list) {
723 if (port_configuration) {
734 backend_mysql->
timeout = (
unsigned int)timeout;
743 if (!(backend_mysql->
db = mysql_init(NULL))
744 || mysql_options(backend_mysql->
db, MYSQL_OPT_CONNECT_TIMEOUT, &backend_mysql->
timeout)
745 || !mysql_real_connect(backend_mysql->
db,
748 || mysql_autocommit(backend_mysql->
db, 1))
750 if (backend_mysql->
db) {
751 ods_log_error(
"db_backend_mysql: connect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
752 mysql_close(backend_mysql->
db);
753 backend_mysql->
db = NULL;
761static int db_backend_mysql_disconnect(
void* data) {
764 if (!__mysql_initialized) {
767 if (!backend_mysql) {
770 if (!backend_mysql->
db) {
775 db_backend_mysql_transaction_rollback(backend_mysql);
778 mysql_close(backend_mysql->
db);
779 backend_mysql->
db = NULL;
793static int __db_backend_mysql_build_clause(
const db_object_t*
object,
const db_clause_list_t* clause_list,
char** sqlp,
int* left) {
822 if ((ret = snprintf(*sqlp, *left,
" AND")) >= *left) {
828 if ((ret = snprintf(*sqlp, *left,
" OR")) >= *left) {
842 if ((ret = snprintf(*sqlp, *left,
" %s.%s = ?",
851 if ((ret = snprintf(*sqlp, *left,
" %s.%s != ?",
860 if ((ret = snprintf(*sqlp, *left,
" %s.%s < ?",
869 if ((ret = snprintf(*sqlp, *left,
" %s.%s <= ?",
878 if ((ret = snprintf(*sqlp, *left,
" %s.%s >= ?",
887 if ((ret = snprintf(*sqlp, *left,
" %s.%s > ?",
896 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NULL",
905 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NOT NULL",
914 if ((ret = snprintf(*sqlp, *left,
" (")) >= *left) {
919 if (__db_backend_mysql_build_clause(
object,
db_clause_list(clause), sqlp, left)) {
922 if ((ret = snprintf(*sqlp, *left,
" )")) >= *left) {
967 (*bind)->bind->length = &((*bind)->bind->buffer_length);
968 (*bind)->bind->is_null = (
my_bool*)0;
983 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
984 (*bind)->bind->buffer = (
void*)int32;
986 (*bind)->bind->is_unsigned = 0;
993 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
994 (*bind)->bind->buffer = (
void*)uint32;
996 (*bind)->bind->is_unsigned = 1;
1003 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
1004 (*bind)->bind->buffer = (
void*)int64;
1006 (*bind)->bind->is_unsigned = 0;
1013 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
1014 (*bind)->bind->buffer = (
void*)uint64;
1016 (*bind)->bind->is_unsigned = 1;
1023 (*bind)->bind->buffer_type = MYSQL_TYPE_STRING;
1024 (*bind)->bind->buffer = (
void*)text;
1025 (*bind)->bind->buffer_length = strlen(text);
1026 (*bind)->bind->is_unsigned = 0;
1033 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
1034 (*bind)->bind->buffer = (
void*)&((*bind)->value_enum);
1035 (*bind)->bind->buffer_length =
sizeof(int);
1036 (*bind)->bind->is_unsigned = 0;
1053 *bind = (*bind)->
next;
1054 if (__db_backend_mysql_bind_clause(bind,
db_clause_list(clause))) {
1064 *bind = (*bind)->
next;
1087 bind->
bind->length = &(bind->
bind->buffer_length);
1096 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1097 bind->
bind->buffer = (
void*)int32;
1099 bind->
bind->is_unsigned = 0;
1106 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1107 bind->
bind->buffer = (
void*)uint32;
1109 bind->
bind->is_unsigned = 1;
1116 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1117 bind->
bind->buffer = (
void*)int64;
1119 bind->
bind->is_unsigned = 0;
1126 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1127 bind->
bind->buffer = (
void*)uint64;
1129 bind->
bind->is_unsigned = 1;
1136 bind->
bind->buffer_type = MYSQL_TYPE_STRING;
1137 bind->
bind->buffer = (
void*)text;
1138 bind->
bind->buffer_length = strlen(text);
1139 bind->
bind->is_unsigned = 0;
1146 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1148 bind->
bind->buffer_length =
sizeof(int);
1149 bind->
bind->is_unsigned = 0;
1177 if (__db_backend_mysql_bind_value(*bind,
db_value_set_at(value_set, i))) {
1184static db_result_t* db_backend_mysql_next(
void* data,
int finish) {
1203 __db_backend_mysql_finish(statement);
1207 if (__db_backend_mysql_fetch(statement)) {
1222 while (object_field) {
1223 if (!bind || !bind->
bind || !bind->
bind->buffer) {
1232 switch (bind->
bind->buffer_type) {
1233 case MYSQL_TYPE_LONG:
1234 if ((bind->
bind->is_unsigned
1236 || (!bind->
bind->is_unsigned
1244 case MYSQL_TYPE_LONGLONG:
1245 if ((bind->
bind->is_unsigned
1247 || (!bind->
bind->is_unsigned
1255 case MYSQL_TYPE_STRING:
1285 if (bind->
bind->buffer_type != MYSQL_TYPE_LONG
1286 || (bind->
bind->is_unsigned
1288 || (!bind->
bind->is_unsigned
1298 if (bind->
bind->buffer_type != MYSQL_TYPE_LONGLONG
1299 || (bind->
bind->is_unsigned
1301 || (!bind->
bind->is_unsigned
1310 if (bind->
bind->buffer_type != MYSQL_TYPE_STRING
1339 int ret, left, first;
1344 if (!__mysql_initialized) {
1347 if (!backend_mysql) {
1353 if (!object_field_list) {
1364 while (object_field) {
1366 if (revision_field) {
1373 revision_field = object_field;
1380 memset(sql, 0, left);
1386 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s () VALUES ()",
db_object_table(
object))) >= left) {
1393 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s (",
db_object_table(
object))) >= left) {
1404 while (object_field) {
1425 if (revision_field) {
1441 if ((ret = snprintf(sqlp, left,
" ) VALUES (")) >= left) {
1452 while (object_field) {
1454 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1460 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1473 if (revision_field) {
1475 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1481 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1489 if ((ret = snprintf(sqlp, left,
" )")) >= left) {
1503 __db_backend_mysql_finish(statement);
1510 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1511 __db_backend_mysql_finish(statement);
1518 if (revision_field) {
1520 || __db_backend_mysql_bind_value(bind, &revision))
1523 __db_backend_mysql_finish(statement);
1532 if (__db_backend_mysql_execute(statement)
1533 || mysql_stmt_affected_rows(statement->
statement) != 1)
1535 __db_backend_mysql_finish(statement);
1538 __db_backend_mysql_finish(statement);
1549 int ret, left, first;
1554 if (!__mysql_initialized) {
1557 if (!backend_mysql) {
1566 memset(sql, 0, left);
1568 if ((ret = snprintf(sqlp, left,
"SELECT")) >= left) {
1576 while (object_field) {
1594 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
1603 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
1620 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1626 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1634 __db_backend_mysql_finish(statement);
1641 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1642 __db_backend_mysql_finish(statement);
1650 if (__db_backend_mysql_execute(statement)) {
1651 __db_backend_mysql_finish(statement);
1659 __db_backend_mysql_finish(statement);
1674 int ret, left, first;
1683 if (!__mysql_initialized) {
1686 if (!backend_mysql) {
1692 if (!object_field_list) {
1703 while (object_field) {
1705 if (revision_field) {
1712 revision_field = object_field;
1716 if (revision_field) {
1724 revision_clause = clause;
1729 if (!revision_clause) {
1737 revision_number = int32;
1744 revision_number = uint32;
1751 revision_number = int64;
1758 revision_number = uint64;
1768 memset(sql, 0, left);
1770 if ((ret = snprintf(sqlp, left,
"UPDATE %s SET",
db_object_table(
object))) >= left) {
1781 while (object_field) {
1802 if (revision_field) {
1823 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1829 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1840 __db_backend_mysql_finish(statement);
1850 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1851 __db_backend_mysql_finish(statement);
1859 if (revision_field) {
1861 || __db_backend_mysql_bind_value(bind, &revision))
1864 __db_backend_mysql_finish(statement);
1877 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1878 __db_backend_mysql_finish(statement);
1886 if (__db_backend_mysql_execute(statement)) {
1887 __db_backend_mysql_finish(statement);
1895 if (revision_field) {
1896 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
1897 __db_backend_mysql_finish(statement);
1902 __db_backend_mysql_finish(statement);
1917 if (!__mysql_initialized) {
1920 if (!backend_mysql) {
1931 while (object_field) {
1933 if (revision_field) {
1940 revision_field = object_field;
1944 if (revision_field) {
1963 memset(sql, 0, left);
1965 if ((ret = snprintf(sqlp, left,
"DELETE FROM %s",
db_object_table(
object))) >= left) {
1973 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1979 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1987 __db_backend_mysql_finish(statement);
1994 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1995 __db_backend_mysql_finish(statement);
2000 if (__db_backend_mysql_execute(statement)) {
2001 __db_backend_mysql_finish(statement);
2009 if (revision_field) {
2010 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
2011 __db_backend_mysql_finish(statement);
2016 __db_backend_mysql_finish(statement);
2031 if (!__mysql_initialized) {
2034 if (!backend_mysql) {
2046 memset(sql, 0, left);
2048 if ((ret = snprintf(sqlp, left,
"SELECT COUNT(*)")) >= left) {
2054 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
2063 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
2080 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
2086 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
2102 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), object_field_list)
2106 __db_backend_mysql_finish(statement);
2114 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
2115 __db_backend_mysql_finish(statement);
2120 if (__db_backend_mysql_execute(statement)) {
2121 __db_backend_mysql_finish(statement);
2125 if (__db_backend_mysql_fetch(statement)) {
2126 __db_backend_mysql_finish(statement);
2131 if (!bind || !bind->
bind || !bind->
bind->buffer
2132 || bind->
bind->buffer_type != MYSQL_TYPE_LONG
2133 || !bind->
bind->is_unsigned
2136 __db_backend_mysql_finish(statement);
2141 __db_backend_mysql_finish(statement);
2146static void db_backend_mysql_free(
void* data) {
2149 if (backend_mysql) {
2150 if (backend_mysql->
db) {
2151 (void)db_backend_mysql_disconnect(backend_mysql);
2153 free(backend_mysql);
2157static int db_backend_mysql_transaction_begin(
void* data) {
2159 static const char* sql =
"BEGIN TRANSACTION";
2162 if (!__mysql_initialized) {
2165 if (!backend_mysql) {
2172 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2176 if (__db_backend_mysql_execute(statement)) {
2177 __db_backend_mysql_finish(statement);
2180 __db_backend_mysql_finish(statement);
2186static int db_backend_mysql_transaction_commit(
void* data) {
2188 static const char* sql =
"COMMIT TRANSACTION";
2191 if (!__mysql_initialized) {
2194 if (!backend_mysql) {
2201 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2205 if (__db_backend_mysql_execute(statement)) {
2206 __db_backend_mysql_finish(statement);
2209 __db_backend_mysql_finish(statement);
2215static int db_backend_mysql_transaction_rollback(
void* data) {
2217 static const char* sql =
"ROLLBACK TRANSACTION";
2220 if (!__mysql_initialized) {
2223 if (!backend_mysql) {
2230 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2234 if (__db_backend_mysql_execute(statement)) {
2235 __db_backend_mysql_finish(statement);
2238 __db_backend_mysql_finish(statement);
2266 free(backend_mysql);
2270 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)
db_backend_handle_t * db_backend_handle_new(void)
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)
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)
db_backend_handle_t * db_backend_mysql_new_handle(void)
struct db_backend_mysql_statement db_backend_mysql_statement_t
struct db_backend_mysql db_backend_mysql_t
#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 db_value_t * db_clause_value(const db_clause_t *clause)
db_clause_type_t db_clause_type(const db_clause_t *clause)
const db_clause_t * db_clause_next(const db_clause_t *clause)
const char * db_clause_field(const db_clause_t *clause)
const db_clause_t * db_clause_list_begin(const db_clause_list_t *clause_list)
@ 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_from_table(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 char * db_join_to_table(const db_join_t *join)
const db_join_t * db_join_next(const db_join_t *join)
const char * db_join_to_field(const db_join_t *join)
db_object_field_list_t * db_object_field_list_new_copy(const db_object_field_list_t *from_object_field_list)
const db_object_field_t * db_object_field_list_begin(const db_object_field_list_t *object_field_list)
db_type_t db_object_field_type(const db_object_field_t *object_field)
db_object_field_t * db_object_field_new(void)
int db_object_field_list_add(db_object_field_list_t *object_field_list, db_object_field_t *object_field)
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 db_object_field_list_t * db_object_object_field_list(const db_object_t *object)
size_t db_object_field_list_size(const db_object_field_list_t *object_field_list)
const char * db_object_table(const db_object_t *object)
db_object_field_list_t * db_object_field_list_new(void)
const char * db_object_field_name(const db_object_field_t *object_field)
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_t * db_object_field_next(const db_object_field_t *object_field)
int db_result_set_value_set(db_result_t *result, db_value_set_t *value_set)
db_result_list_t * db_result_list_new(void)
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)
db_result_t * db_result_new(void)
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
const db_type_int64_t * db_value_int64(const db_value_t *value)
const db_type_int32_t * db_value_int32(const db_value_t *value)
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_value_t * db_value_set_at(const db_value_set_t *value_set, size_t at)
int db_value_set_primary_key(db_value_t *value)
db_value_t * db_value_set_get(db_value_set_t *value_set, size_t at)
void db_value_set_free(db_value_set_t *value_set)
int db_value_from_uint32(db_value_t *value, db_type_uint32_t from_uint32)
db_value_set_t * db_value_set_new(size_t size)
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_uint32_t * db_value_uint32(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)
int db_value_enum_value(const db_value_t *value, int *enum_value)
const db_type_uint64_t * db_value_uint64(const db_value_t *value)
int db_value_to_uint64(const db_value_t *value, db_type_uint64_t *to_uint64)
void db_value_reset(db_value_t *value)
int db_value_from_uint64(db_value_t *value, db_type_uint64_t from_uint64)
const char * db_value_text(const db_value_t *value)
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