35 #include <mysql/mysql.h>
45 static int db_backend_mysql_transaction_rollback(
void*);
50 static int __mysql_initialized = 0;
127 if (bind->
bind && bind->
bind->buffer) {
128 free(bind->
bind->buffer);
146 if(mysql_query(backend_mysql->
db,
"SELECT 1")) {
147 ods_log_warning(
"db_backend_mysql: connection lost, trying to reconnect");
148 if(!mysql_real_connect(backend_mysql->
db, backend_mysql->
db_host, backend_mysql->
db_user, backend_mysql->
db_pass,
150 mysql_autocommit(backend_mysql->
db, 1)) {
151 if (backend_mysql->
db) {
152 ods_log_error(
"db_backend_mysql: reconnect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
153 mysql_close(backend_mysql->
db);
154 backend_mysql->
db = NULL;
158 result = mysql_store_result(backend_mysql->
db);
159 mysql_free_result(result);
170 unsigned long i, params;
173 MYSQL_BIND* mysql_bind;
174 MYSQL_RES* result_metadata = NULL;
177 if (!backend_mysql) {
180 if (!backend_mysql->
db) {
193 checkconnection(backend_mysql);
198 ods_log_debug(
"%s", sql);
200 || !((*statement)->statement = mysql_stmt_init(backend_mysql->
db))
201 || mysql_stmt_prepare((*statement)->statement, sql, size))
203 if ((*statement)->statement) {
204 ods_log_info(
"DB prepare SQL %s", sql);
205 ods_log_info(
"DB prepare Err %d: %s", mysql_stmt_errno((*statement)->statement), mysql_stmt_error((*statement)->statement));
207 __db_backend_mysql_finish(*statement);
212 (*statement)->backend_mysql = backend_mysql;
218 if ((params = mysql_stmt_param_count((*statement)->statement)) > 0) {
219 if (!((*statement)->mysql_bind_input = calloc(params,
sizeof(MYSQL_BIND)))) {
220 __db_backend_mysql_finish(*statement);
225 for (i = 0; i < params; i++) {
227 __db_backend_mysql_finish(*statement);
232 bind->
bind = &((*statement)->mysql_bind_input[i]);
233 if (!(*statement)->bind_input) {
234 (*statement)->bind_input = bind;
236 if ((*statement)->bind_input_end) {
237 (*statement)->bind_input_end->
next = bind;
239 (*statement)->bind_input_end = bind;
246 if (object_field_list
248 && (result_metadata = mysql_stmt_result_metadata((*statement)->statement)))
251 || !((*statement)->mysql_bind_output = calloc(params,
sizeof(MYSQL_BIND))))
253 mysql_free_result(result_metadata);
254 __db_backend_mysql_finish(*statement);
259 (*statement)->fields = params;
260 field = mysql_fetch_field(result_metadata);
262 for (i = 0; i < params; i++) {
267 mysql_free_result(result_metadata);
268 __db_backend_mysql_finish(*statement);
273 bind->
bind = (mysql_bind = &((*statement)->mysql_bind_output[i]));
274 mysql_bind->is_null = (
my_bool*)0;
275 mysql_bind->error = &bind->
error;
276 mysql_bind->length = &bind->
length;
280 switch (field->type) {
281 case MYSQL_TYPE_TINY:
282 case MYSQL_TYPE_SHORT:
283 case MYSQL_TYPE_LONG:
284 case MYSQL_TYPE_INT24:
285 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
287 mysql_free_result(result_metadata);
288 __db_backend_mysql_finish(*statement);
293 bind->
length = mysql_bind->buffer_length;
294 mysql_bind->is_unsigned = 1;
297 case MYSQL_TYPE_LONGLONG:
298 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
300 mysql_free_result(result_metadata);
301 __db_backend_mysql_finish(*statement);
306 bind->
length = mysql_bind->buffer_length;
307 mysql_bind->is_unsigned = 1;
310 case MYSQL_TYPE_STRING:
311 case MYSQL_TYPE_VAR_STRING:
312 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
317 bind->
length = field->length + 1;
321 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
322 mysql_free_result(result_metadata);
323 __db_backend_mysql_finish(*statement);
327 mysql_bind->buffer_length = bind->
length;
328 mysql_bind->is_unsigned = 0;
332 mysql_free_result(result_metadata);
333 __db_backend_mysql_finish(*statement);
347 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
349 mysql_free_result(result_metadata);
350 __db_backend_mysql_finish(*statement);
355 bind->
length = mysql_bind->buffer_length;
356 mysql_bind->is_unsigned = 0;
360 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
362 mysql_free_result(result_metadata);
363 __db_backend_mysql_finish(*statement);
368 bind->
length = mysql_bind->buffer_length;
369 mysql_bind->is_unsigned = 1;
373 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
375 mysql_free_result(result_metadata);
376 __db_backend_mysql_finish(*statement);
381 bind->
length = mysql_bind->buffer_length;
382 mysql_bind->is_unsigned = 0;
386 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
388 mysql_free_result(result_metadata);
389 __db_backend_mysql_finish(*statement);
394 bind->
length = mysql_bind->buffer_length;
395 mysql_bind->is_unsigned = 1;
399 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
404 bind->
length = field->length + 1;
408 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
409 mysql_free_result(result_metadata);
410 __db_backend_mysql_finish(*statement);
414 mysql_bind->buffer_length = bind->
length;
415 mysql_bind->is_unsigned = 0;
420 switch (field->type) {
421 case MYSQL_TYPE_TINY:
422 case MYSQL_TYPE_SHORT:
423 case MYSQL_TYPE_LONG:
424 case MYSQL_TYPE_INT24:
425 mysql_bind->buffer_type = MYSQL_TYPE_LONG;
426 if (field->flags & UNSIGNED_FLAG) {
428 mysql_free_result(result_metadata);
429 __db_backend_mysql_finish(*statement);
434 mysql_bind->is_unsigned = 1;
438 mysql_free_result(result_metadata);
439 __db_backend_mysql_finish(*statement);
444 mysql_bind->is_unsigned = 0;
446 bind->
length = mysql_bind->buffer_length;
449 case MYSQL_TYPE_LONGLONG:
450 mysql_bind->buffer_type = MYSQL_TYPE_LONGLONG;
451 if (field->flags & UNSIGNED_FLAG) {
453 mysql_free_result(result_metadata);
454 __db_backend_mysql_finish(*statement);
459 mysql_bind->is_unsigned = 1;
463 mysql_free_result(result_metadata);
464 __db_backend_mysql_finish(*statement);
469 mysql_bind->is_unsigned = 0;
471 bind->
length = mysql_bind->buffer_length;
474 case MYSQL_TYPE_STRING:
475 case MYSQL_TYPE_VAR_STRING:
476 mysql_bind->buffer_type = MYSQL_TYPE_STRING;
481 bind->
length = field->length + 1;
485 if (!(mysql_bind->buffer = calloc(1, bind->
length))) {
486 mysql_free_result(result_metadata);
487 __db_backend_mysql_finish(*statement);
491 mysql_bind->buffer_length = bind->
length;
492 mysql_bind->is_unsigned = 0;
496 mysql_free_result(result_metadata);
497 __db_backend_mysql_finish(*statement);
507 if (!(*statement)->bind_output) {
508 (*statement)->bind_output = bind;
510 if ((*statement)->bind_output_end) {
511 (*statement)->bind_output_end->
next = bind;
513 (*statement)->bind_output_end = bind;
515 field = mysql_fetch_field(result_metadata);
521 if (object_field || field) {
522 mysql_free_result(result_metadata);
523 __db_backend_mysql_finish(*statement);
528 if (result_metadata) {
529 mysql_free_result(result_metadata);
553 if (!statement->
bound) {
557 ods_log_info(
"DB bind result Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
560 statement->
bound = 1;
566 ret = mysql_stmt_fetch(statement->
statement);
568 ods_log_info(
"DB fetch Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
571 else if (ret == MYSQL_DATA_TRUNCATED) {
584 for (i = 0, bind = statement->
bind_output; bind; i++, bind = bind->
next) {
589 ods_log_info(
"DB fetch Err data truncated");
596 ods_log_info(
"DB fetch Err data truncated");
604 ods_log_info(
"DB fetch Err data truncated");
610 else if (ret == MYSQL_NO_DATA) {
618 ods_log_info(
"DB fetch UNKNOWN %d Err %d: %s", ret, mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
644 ods_log_info(
"DB bind param Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
651 if (mysql_stmt_execute(statement->
statement)) {
652 ods_log_info(
"DB execute Err %d: %s", mysql_stmt_errno(statement->
statement), mysql_stmt_error(statement->
statement));
659 static int db_backend_mysql_initialize(
void* data) {
662 if (!backend_mysql) {
666 if (!__mysql_initialized) {
667 if (mysql_library_init(0, NULL, NULL)) {
670 __mysql_initialized = 1;
675 static int db_backend_mysql_shutdown(
void* data) {
678 if (!backend_mysql) {
682 if (__mysql_initialized) {
684 __mysql_initialized = 0;
698 unsigned int port = 0;
700 if (!__mysql_initialized) {
703 if (!backend_mysql) {
706 if (backend_mysql->
db) {
709 if (!configuration_list) {
718 if (port_configuration) {
729 backend_mysql->
timeout = (
unsigned int)timeout;
738 if (!(backend_mysql->
db = mysql_init(NULL))
739 || mysql_options(backend_mysql->
db, MYSQL_OPT_CONNECT_TIMEOUT, &backend_mysql->
timeout)
740 || !mysql_real_connect(backend_mysql->
db,
743 || mysql_autocommit(backend_mysql->
db, 1))
745 if (backend_mysql->
db) {
746 ods_log_error(
"db_backend_mysql: connect failed %d: %s", mysql_errno(backend_mysql->
db), mysql_error(backend_mysql->
db));
747 mysql_close(backend_mysql->
db);
748 backend_mysql->
db = NULL;
756 static int db_backend_mysql_disconnect(
void* data) {
759 if (!__mysql_initialized) {
762 if (!backend_mysql) {
765 if (!backend_mysql->
db) {
770 db_backend_mysql_transaction_rollback(backend_mysql);
773 mysql_close(backend_mysql->
db);
774 backend_mysql->
db = NULL;
788 static int __db_backend_mysql_build_clause(
const db_object_t*
object,
const db_clause_list_t* clause_list,
char** sqlp,
int* left) {
817 if ((ret = snprintf(*sqlp, *left,
" AND")) >= *left) {
823 if ((ret = snprintf(*sqlp, *left,
" OR")) >= *left) {
837 if ((ret = snprintf(*sqlp, *left,
" %s.%s = ?",
846 if ((ret = snprintf(*sqlp, *left,
" %s.%s != ?",
855 if ((ret = snprintf(*sqlp, *left,
" %s.%s < ?",
864 if ((ret = snprintf(*sqlp, *left,
" %s.%s <= ?",
873 if ((ret = snprintf(*sqlp, *left,
" %s.%s >= ?",
882 if ((ret = snprintf(*sqlp, *left,
" %s.%s > ?",
891 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NULL",
900 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NOT NULL",
909 if ((ret = snprintf(*sqlp, *left,
" (")) >= *left) {
914 if (__db_backend_mysql_build_clause(
object,
db_clause_list(clause), sqlp, left)) {
917 if ((ret = snprintf(*sqlp, *left,
" )")) >= *left) {
962 (*bind)->bind->length = &((*bind)->bind->buffer_length);
963 (*bind)->bind->is_null = (
my_bool*)0;
978 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
979 (*bind)->bind->buffer = (
void*)int32;
981 (*bind)->bind->is_unsigned = 0;
988 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
989 (*bind)->bind->buffer = (
void*)uint32;
991 (*bind)->bind->is_unsigned = 1;
998 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
999 (*bind)->bind->buffer = (
void*)int64;
1001 (*bind)->bind->is_unsigned = 0;
1008 (*bind)->bind->buffer_type = MYSQL_TYPE_LONGLONG;
1009 (*bind)->bind->buffer = (
void*)uint64;
1011 (*bind)->bind->is_unsigned = 1;
1018 (*bind)->bind->buffer_type = MYSQL_TYPE_STRING;
1019 (*bind)->bind->buffer = (
void*)text;
1020 (*bind)->bind->buffer_length = strlen(text);
1021 (*bind)->bind->is_unsigned = 0;
1028 (*bind)->bind->buffer_type = MYSQL_TYPE_LONG;
1029 (*bind)->bind->buffer = (
void*)&((*bind)->value_enum);
1030 (*bind)->bind->buffer_length =
sizeof(int);
1031 (*bind)->bind->is_unsigned = 0;
1048 *bind = (*bind)->
next;
1049 if (__db_backend_mysql_bind_clause(bind,
db_clause_list(clause))) {
1059 *bind = (*bind)->
next;
1082 bind->
bind->length = &(bind->
bind->buffer_length);
1091 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1092 bind->
bind->buffer = (
void*)int32;
1094 bind->
bind->is_unsigned = 0;
1101 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1102 bind->
bind->buffer = (
void*)uint32;
1104 bind->
bind->is_unsigned = 1;
1111 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1112 bind->
bind->buffer = (
void*)int64;
1114 bind->
bind->is_unsigned = 0;
1121 bind->
bind->buffer_type = MYSQL_TYPE_LONGLONG;
1122 bind->
bind->buffer = (
void*)uint64;
1124 bind->
bind->is_unsigned = 1;
1131 bind->
bind->buffer_type = MYSQL_TYPE_STRING;
1132 bind->
bind->buffer = (
void*)text;
1133 bind->
bind->buffer_length = strlen(text);
1134 bind->
bind->is_unsigned = 0;
1141 bind->
bind->buffer_type = MYSQL_TYPE_LONG;
1143 bind->
bind->buffer_length =
sizeof(int);
1144 bind->
bind->is_unsigned = 0;
1172 if (__db_backend_mysql_bind_value(*bind,
db_value_set_at(value_set, i))) {
1179 static db_result_t* db_backend_mysql_next(
void* data,
int finish) {
1198 __db_backend_mysql_finish(statement);
1202 if (__db_backend_mysql_fetch(statement)) {
1217 while (object_field) {
1218 if (!bind || !bind->
bind || !bind->
bind->buffer) {
1227 switch (bind->
bind->buffer_type) {
1228 case MYSQL_TYPE_LONG:
1229 if ((bind->
bind->is_unsigned
1231 || (!bind->
bind->is_unsigned
1239 case MYSQL_TYPE_LONGLONG:
1240 if ((bind->
bind->is_unsigned
1242 || (!bind->
bind->is_unsigned
1250 case MYSQL_TYPE_STRING:
1280 if (bind->
bind->buffer_type != MYSQL_TYPE_LONG
1281 || (bind->
bind->is_unsigned
1283 || (!bind->
bind->is_unsigned
1293 if (bind->
bind->buffer_type != MYSQL_TYPE_LONGLONG
1294 || (bind->
bind->is_unsigned
1296 || (!bind->
bind->is_unsigned
1305 if (bind->
bind->buffer_type != MYSQL_TYPE_STRING
1334 int ret, left, first;
1339 if (!__mysql_initialized) {
1342 if (!backend_mysql) {
1348 if (!object_field_list) {
1359 while (object_field) {
1361 if (revision_field) {
1368 revision_field = object_field;
1375 memset(sql, 0, left);
1381 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s () VALUES ()",
db_object_table(
object))) >= left) {
1388 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s (",
db_object_table(
object))) >= left) {
1399 while (object_field) {
1420 if (revision_field) {
1436 if ((ret = snprintf(sqlp, left,
" ) VALUES (")) >= left) {
1447 while (object_field) {
1449 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1455 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1468 if (revision_field) {
1470 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
1476 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
1484 if ((ret = snprintf(sqlp, left,
" )")) >= left) {
1498 __db_backend_mysql_finish(statement);
1505 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1506 __db_backend_mysql_finish(statement);
1513 if (revision_field) {
1515 || __db_backend_mysql_bind_value(bind, &revision))
1518 __db_backend_mysql_finish(statement);
1527 if (__db_backend_mysql_execute(statement)
1528 || mysql_stmt_affected_rows(statement->
statement) != 1)
1530 __db_backend_mysql_finish(statement);
1533 __db_backend_mysql_finish(statement);
1544 int ret, left, first;
1549 if (!__mysql_initialized) {
1552 if (!backend_mysql) {
1561 memset(sql, 0, left);
1563 if ((ret = snprintf(sqlp, left,
"SELECT")) >= left) {
1571 while (object_field) {
1589 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
1598 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
1615 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1621 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1629 __db_backend_mysql_finish(statement);
1636 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1637 __db_backend_mysql_finish(statement);
1645 if (__db_backend_mysql_execute(statement)) {
1646 __db_backend_mysql_finish(statement);
1654 __db_backend_mysql_finish(statement);
1669 int ret, left, first;
1678 if (!__mysql_initialized) {
1681 if (!backend_mysql) {
1687 if (!object_field_list) {
1698 while (object_field) {
1700 if (revision_field) {
1707 revision_field = object_field;
1711 if (revision_field) {
1719 revision_clause = clause;
1724 if (!revision_clause) {
1732 revision_number = int32;
1739 revision_number = uint32;
1746 revision_number = int64;
1753 revision_number = uint64;
1763 memset(sql, 0, left);
1765 if ((ret = snprintf(sqlp, left,
"UPDATE %s SET",
db_object_table(
object))) >= left) {
1776 while (object_field) {
1797 if (revision_field) {
1818 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1824 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1835 __db_backend_mysql_finish(statement);
1845 if (__db_backend_mysql_bind_value_set(&bind, value_set)) {
1846 __db_backend_mysql_finish(statement);
1854 if (revision_field) {
1856 || __db_backend_mysql_bind_value(bind, &revision))
1859 __db_backend_mysql_finish(statement);
1872 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1873 __db_backend_mysql_finish(statement);
1881 if (__db_backend_mysql_execute(statement)) {
1882 __db_backend_mysql_finish(statement);
1890 if (revision_field) {
1891 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
1892 __db_backend_mysql_finish(statement);
1897 __db_backend_mysql_finish(statement);
1912 if (!__mysql_initialized) {
1915 if (!backend_mysql) {
1926 while (object_field) {
1928 if (revision_field) {
1935 revision_field = object_field;
1939 if (revision_field) {
1958 memset(sql, 0, left);
1960 if ((ret = snprintf(sqlp, left,
"DELETE FROM %s",
db_object_table(
object))) >= left) {
1968 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1974 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
1982 __db_backend_mysql_finish(statement);
1989 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
1990 __db_backend_mysql_finish(statement);
1995 if (__db_backend_mysql_execute(statement)) {
1996 __db_backend_mysql_finish(statement);
2004 if (revision_field) {
2005 if (mysql_stmt_affected_rows(statement->
statement) < 1) {
2006 __db_backend_mysql_finish(statement);
2011 __db_backend_mysql_finish(statement);
2026 if (!__mysql_initialized) {
2029 if (!backend_mysql) {
2041 memset(sql, 0, left);
2043 if ((ret = snprintf(sqlp, left,
"SELECT COUNT(*)")) >= left) {
2049 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
2058 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
2075 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
2081 if (__db_backend_mysql_build_clause(
object, clause_list, &sqlp, &left)) {
2097 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), object_field_list)
2101 __db_backend_mysql_finish(statement);
2109 if (__db_backend_mysql_bind_clause(&bind, clause_list)) {
2110 __db_backend_mysql_finish(statement);
2115 if (__db_backend_mysql_execute(statement)) {
2116 __db_backend_mysql_finish(statement);
2120 if (__db_backend_mysql_fetch(statement)) {
2121 __db_backend_mysql_finish(statement);
2126 if (!bind || !bind->
bind || !bind->
bind->buffer
2127 || bind->
bind->buffer_type != MYSQL_TYPE_LONG
2128 || !bind->
bind->is_unsigned
2131 __db_backend_mysql_finish(statement);
2136 __db_backend_mysql_finish(statement);
2141 static void db_backend_mysql_free(
void* data) {
2144 if (backend_mysql) {
2145 if (backend_mysql->
db) {
2146 (void)db_backend_mysql_disconnect(backend_mysql);
2148 free(backend_mysql);
2152 static int db_backend_mysql_transaction_begin(
void* data) {
2154 static const char* sql =
"BEGIN TRANSACTION";
2157 if (!__mysql_initialized) {
2160 if (!backend_mysql) {
2167 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2171 if (__db_backend_mysql_execute(statement)) {
2172 __db_backend_mysql_finish(statement);
2175 __db_backend_mysql_finish(statement);
2181 static int db_backend_mysql_transaction_commit(
void* data) {
2183 static const char* sql =
"COMMIT TRANSACTION";
2186 if (!__mysql_initialized) {
2189 if (!backend_mysql) {
2196 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2200 if (__db_backend_mysql_execute(statement)) {
2201 __db_backend_mysql_finish(statement);
2204 __db_backend_mysql_finish(statement);
2210 static int db_backend_mysql_transaction_rollback(
void* data) {
2212 static const char* sql =
"ROLLBACK TRANSACTION";
2215 if (!__mysql_initialized) {
2218 if (!backend_mysql) {
2225 if (__db_backend_mysql_prepare(backend_mysql, &statement, sql, strlen(sql), NULL)) {
2229 if (__db_backend_mysql_execute(statement)) {
2230 __db_backend_mysql_finish(statement);
2233 __db_backend_mysql_finish(statement);
2261 free(backend_mysql);
2265 return backend_handle;