44 static int db_backend_sqlite_transaction_rollback(
void*);
49 static int __sqlite3_initialized = 0;
60 static pthread_mutex_t __sqlite_mutex = PTHREAD_MUTEX_INITIALIZER;
61 static pthread_cond_t __sqlite_cond = PTHREAD_COND_INITIALIZER;
91 static int __db_backend_sqlite_busy_handler(
void *data,
int retry) {
93 struct timespec busy_ts;
97 if (!backend_sqlite) {
101 ods_log_deeebug(
"db_backend_sqlite_busy_handler: Database busy, waiting...");
103 if (pthread_mutex_lock(&__sqlite_mutex)) {
104 ods_log_error(
"db_backend_sqlite_busy_handler: Mutex error");
107 if (clock_gettime(CLOCK_REALTIME, &busy_ts)) {
108 pthread_mutex_unlock(&__sqlite_mutex);
112 busy_ts.tv_nsec += backend_sqlite->
usleep * 1000;
113 if (busy_ts.tv_nsec > 999999999) {
114 busy_ts.tv_sec += (busy_ts.tv_nsec / 1000000000);
115 busy_ts.tv_nsec -= (busy_ts.tv_nsec / 1000000000) * 1000000000;
118 rc = pthread_cond_timedwait(&__sqlite_cond, &__sqlite_mutex, &busy_ts);
119 if (rc == ETIMEDOUT) {
121 ods_log_deeebug(
"db_backend_sqlite_busy_handler: Woke up, checking database...");
122 pthread_mutex_unlock(&__sqlite_mutex);
125 pthread_mutex_unlock(&__sqlite_mutex);
129 ods_log_error(
"db_backend_sqlite_busy_handler: pthread_cond_timedwait() error %d", rc);
130 pthread_mutex_unlock(&__sqlite_mutex);
134 ods_log_deeebug(
"db_backend_sqlite_busy_handler: Woke up, checking database...");
135 pthread_mutex_unlock(&__sqlite_mutex);
142 static inline int __db_backend_sqlite_prepare(
db_backend_sqlite_t* backend_sqlite, sqlite3_stmt** statement,
const char* sql,
size_t size) {
145 if (!backend_sqlite) {
148 if (!backend_sqlite->
db) {
163 ret = sqlite3_prepare_v2(backend_sqlite->
db,
168 if (ret != SQLITE_OK) {
172 sqlite3_finalize(*statement);
184 static inline int __db_backend_sqlite_step(
db_backend_sqlite_t* backend_sqlite, sqlite3_stmt* statement) {
191 if (!backend_sqlite) {
192 return SQLITE_INTERNAL;
195 return SQLITE_INTERNAL;
199 ret = sqlite3_step(statement);
244 static inline int __db_backend_sqlite_finalize(sqlite3_stmt* statement) {
247 ret = sqlite3_finalize(statement);
248 pthread_cond_broadcast(&__sqlite_cond);
253 static int db_backend_sqlite_initialize(
void* data) {
256 if (!backend_sqlite) {
260 if (!__sqlite3_initialized) {
261 int ret = sqlite3_initialize();
262 if (ret != SQLITE_OK) {
265 __sqlite3_initialized = 1;
270 static int db_backend_sqlite_shutdown(
void* data) {
273 if (!backend_sqlite) {
277 if (__sqlite3_initialized) {
278 int ret = sqlite3_shutdown();
279 if (ret != SQLITE_OK) {
282 __sqlite3_initialized = 0;
294 if (!__sqlite3_initialized) {
297 if (!backend_sqlite) {
300 if (backend_sqlite->
db) {
303 if (!configuration_list) {
314 if (backend_sqlite->
timeout < 1) {
322 if (backend_sqlite->
usleep < 1) {
327 ret = sqlite3_open_v2(
329 &(backend_sqlite->
db),
330 SQLITE_OPEN_READWRITE
331 | SQLITE_OPEN_FULLMUTEX,
333 if (ret != SQLITE_OK) {
337 if ((ret = sqlite3_busy_handler(backend_sqlite->
db, __db_backend_sqlite_busy_handler, backend_sqlite)) != SQLITE_OK) {
338 ods_log_error(
"db_backend_sqlite: sqlite3_busy_handler() error %d", ret);
339 sqlite3_close(backend_sqlite->
db);
340 backend_sqlite->
db = NULL;
351 static int db_backend_sqlite_disconnect(
void* data) {
355 if (!__sqlite3_initialized) {
358 if (!backend_sqlite) {
361 if (!backend_sqlite->
db) {
366 db_backend_sqlite_transaction_rollback(backend_sqlite);
368 ret = sqlite3_close(backend_sqlite->
db);
369 if (ret != SQLITE_OK) {
372 backend_sqlite->
db = NULL;
385 static int __db_backend_sqlite_build_clause(
const db_object_t*
object,
const db_clause_list_t* clause_list,
char** sqlp,
int* left) {
414 if ((ret = snprintf(*sqlp, *left,
" AND")) >= *left) {
420 if ((ret = snprintf(*sqlp, *left,
" OR")) >= *left) {
434 if ((ret = snprintf(*sqlp, *left,
" %s.%s = ?",
443 if ((ret = snprintf(*sqlp, *left,
" %s.%s != ?",
452 if ((ret = snprintf(*sqlp, *left,
" %s.%s < ?",
461 if ((ret = snprintf(*sqlp, *left,
" %s.%s <= ?",
470 if ((ret = snprintf(*sqlp, *left,
" %s.%s >= ?",
479 if ((ret = snprintf(*sqlp, *left,
" %s.%s > ?",
488 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NULL",
497 if ((ret = snprintf(*sqlp, *left,
" %s.%s IS NOT NULL",
506 if ((ret = snprintf(*sqlp, *left,
" (")) >= *left) {
511 if (__db_backend_sqlite_build_clause(
object,
db_clause_list(clause), sqlp, left)) {
514 if ((ret = snprintf(*sqlp, *left,
" )")) >= *left) {
538 static int __db_backend_sqlite_bind_clause(sqlite3_stmt* statement,
const db_clause_list_t* clause_list,
int* bind) {
542 sqlite3_int64 to_int64;
577 ret = sqlite3_bind_int(statement, (*bind)++, to_int);
578 if (ret != SQLITE_OK) {
588 ret = sqlite3_bind_int(statement, (*bind)++, to_int);
589 if (ret != SQLITE_OK) {
599 ret = sqlite3_bind_int64(statement, (*bind)++, to_int64);
600 if (ret != SQLITE_OK) {
610 ret = sqlite3_bind_int64(statement, (*bind)++, to_int64);
611 if (ret != SQLITE_OK) {
618 if (ret != SQLITE_OK) {
627 ret = sqlite3_bind_int(statement, (*bind)++, to_int);
628 if (ret != SQLITE_OK) {
643 if (__db_backend_sqlite_bind_clause(statement,
db_clause_list(clause), bind)) {
656 static db_result_t* db_backend_sqlite_next(
void* data,
int finish) {
664 sqlite3_int64 from_int64;
682 __db_backend_sqlite_finalize(statement->
statement);
701 while (object_field) {
704 from_int = sqlite3_column_int(statement->
statement, bind);
707 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
722 from_int = sqlite3_column_int(statement->
statement, bind);
725 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
734 from_int = sqlite3_column_int(statement->
statement, bind);
737 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
746 from_int64 = sqlite3_column_int64(statement->
statement, bind);
749 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
758 from_int64 = sqlite3_column_int64(statement->
statement, bind);
761 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
770 text = (
const char*)sqlite3_column_text(statement->
statement, bind);
773 || (ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
783 switch (sqlite3_column_type(statement->
statement, bind)) {
785 from_int64 = sqlite3_column_int64(statement->
statement, bind);
788 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
797 text = (
const char*)sqlite3_column_text(statement->
statement, bind);
800 || (ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)
831 int ret, left, bind, first;
832 sqlite3_stmt* statement = NULL;
835 sqlite3_int64 to_int64;
841 if (!__sqlite3_initialized) {
844 if (!backend_sqlite) {
850 if (!object_field_list) {
861 while (object_field) {
863 if (revision_field) {
870 revision_field = object_field;
877 memset(sql, 0, left);
883 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s DEFAULT VALUES",
db_object_table(
object))) >= left) {
890 if ((ret = snprintf(sqlp, left,
"INSERT INTO %s (",
db_object_table(
object))) >= left) {
901 while (object_field) {
922 if (revision_field) {
938 if ((ret = snprintf(sqlp, left,
" ) VALUES (")) >= left) {
949 while (object_field) {
951 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
957 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
970 if (revision_field) {
972 if ((ret = snprintf(sqlp, left,
" ?")) >= left) {
978 if ((ret = snprintf(sqlp, left,
", ?")) >= left) {
986 if ((ret = snprintf(sqlp, left,
" )")) >= left) {
996 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql,
sizeof(sql))) {
1006 __db_backend_sqlite_finalize(statement);
1013 __db_backend_sqlite_finalize(statement);
1017 ret = sqlite3_bind_int(statement, bind++, to_int);
1018 if (ret != SQLITE_OK) {
1019 __db_backend_sqlite_finalize(statement);
1026 __db_backend_sqlite_finalize(statement);
1030 ret = sqlite3_bind_int(statement, bind++, to_int);
1031 if (ret != SQLITE_OK) {
1032 __db_backend_sqlite_finalize(statement);
1039 __db_backend_sqlite_finalize(statement);
1043 ret = sqlite3_bind_int64(statement, bind++, to_int64);
1044 if (ret != SQLITE_OK) {
1045 __db_backend_sqlite_finalize(statement);
1052 __db_backend_sqlite_finalize(statement);
1056 ret = sqlite3_bind_int64(statement, bind++, to_int64);
1057 if (ret != SQLITE_OK) {
1058 __db_backend_sqlite_finalize(statement);
1064 ret = sqlite3_bind_text(statement, bind++,
db_value_text(value), -1, SQLITE_TRANSIENT);
1065 if (ret != SQLITE_OK) {
1066 __db_backend_sqlite_finalize(statement);
1073 __db_backend_sqlite_finalize(statement);
1076 ret = sqlite3_bind_int(statement, bind++, to_int);
1077 if (ret != SQLITE_OK) {
1078 __db_backend_sqlite_finalize(statement);
1084 __db_backend_sqlite_finalize(statement);
1092 if (revision_field) {
1093 ret = sqlite3_bind_int(statement, bind++, 1);
1094 if (ret != SQLITE_OK) {
1095 __db_backend_sqlite_finalize(statement);
1103 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1104 __db_backend_sqlite_finalize(statement);
1107 __db_backend_sqlite_finalize(statement);
1118 int ret, left, first, fields, bind;
1122 if (!__sqlite3_initialized) {
1125 if (!backend_sqlite) {
1134 memset(sql, 0, left);
1136 if ((ret = snprintf(sqlp, left,
"SELECT")) >= left) {
1145 while (object_field) {
1164 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
1173 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
1190 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1196 if (__db_backend_sqlite_build_clause(
object, clause_list, &sqlp, &left)) {
1206 statement->
object = object;
1207 statement->
fields = fields;
1210 if (__db_backend_sqlite_prepare(backend_sqlite, &(statement->
statement), sql,
sizeof(sql))) {
1217 if (__db_backend_sqlite_bind_clause(statement->
statement, clause_list, &bind)) {
1218 __db_backend_sqlite_finalize(statement->
statement);
1228 __db_backend_sqlite_finalize(statement->
statement);
1241 sqlite3_int64 revision_number = -1;
1245 int ret, left, bind, first;
1246 sqlite3_stmt* statement = NULL;
1249 sqlite3_int64 to_int64;
1255 if (!__sqlite3_initialized) {
1258 if (!backend_sqlite) {
1264 if (!object_field_list) {
1275 while (object_field) {
1277 if (revision_field) {
1284 revision_field = object_field;
1288 if (revision_field) {
1296 revision_clause = clause;
1301 if (!revision_clause) {
1309 revision_number = int32;
1316 revision_number = uint32;
1323 revision_number = int64;
1330 revision_number = uint64;
1340 memset(sql, 0, left);
1342 if ((ret = snprintf(sqlp, left,
"UPDATE %s SET",
db_object_table(
object))) >= left) {
1353 while (object_field) {
1374 if (revision_field) {
1395 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1401 if (__db_backend_sqlite_build_clause(
object, clause_list, &sqlp, &left)) {
1409 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql,
sizeof(sql))) {
1419 __db_backend_sqlite_finalize(statement);
1426 __db_backend_sqlite_finalize(statement);
1430 ret = sqlite3_bind_int(statement, bind++, to_int);
1431 if (ret != SQLITE_OK) {
1432 __db_backend_sqlite_finalize(statement);
1439 __db_backend_sqlite_finalize(statement);
1443 ret = sqlite3_bind_int(statement, bind++, to_int);
1444 if (ret != SQLITE_OK) {
1445 __db_backend_sqlite_finalize(statement);
1452 __db_backend_sqlite_finalize(statement);
1456 ret = sqlite3_bind_int64(statement, bind++, to_int64);
1457 if (ret != SQLITE_OK) {
1458 __db_backend_sqlite_finalize(statement);
1465 __db_backend_sqlite_finalize(statement);
1469 ret = sqlite3_bind_int64(statement, bind++, to_int64);
1470 if (ret != SQLITE_OK) {
1471 __db_backend_sqlite_finalize(statement);
1477 ret = sqlite3_bind_text(statement, bind++,
db_value_text(value), -1, SQLITE_TRANSIENT);
1478 if (ret != SQLITE_OK) {
1479 __db_backend_sqlite_finalize(statement);
1486 __db_backend_sqlite_finalize(statement);
1489 ret = sqlite3_bind_int(statement, bind++, to_int);
1490 if (ret != SQLITE_OK) {
1491 __db_backend_sqlite_finalize(statement);
1497 __db_backend_sqlite_finalize(statement);
1505 if (revision_field) {
1506 ret = sqlite3_bind_int64(statement, bind++, revision_number + 1);
1507 if (ret != SQLITE_OK) {
1508 __db_backend_sqlite_finalize(statement);
1517 if (__db_backend_sqlite_bind_clause(statement, clause_list, &bind)) {
1518 __db_backend_sqlite_finalize(statement);
1526 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1527 __db_backend_sqlite_finalize(statement);
1530 __db_backend_sqlite_finalize(statement);
1536 if (revision_field) {
1537 if (sqlite3_changes(backend_sqlite->
db) < 1) {
1549 int ret, left, bind;
1550 sqlite3_stmt* statement = NULL;
1555 if (!__sqlite3_initialized) {
1558 if (!backend_sqlite) {
1569 while (object_field) {
1571 if (revision_field) {
1578 revision_field = object_field;
1582 if (revision_field) {
1601 memset(sql, 0, left);
1603 if ((ret = snprintf(sqlp, left,
"DELETE FROM %s",
db_object_table(
object))) >= left) {
1611 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1617 if (__db_backend_sqlite_build_clause(
object, clause_list, &sqlp, &left)) {
1622 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql,
sizeof(sql))) {
1628 if (__db_backend_sqlite_bind_clause(statement, clause_list, &bind)) {
1629 __db_backend_sqlite_finalize(statement);
1634 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1635 __db_backend_sqlite_finalize(statement);
1638 __db_backend_sqlite_finalize(statement);
1644 if (revision_field) {
1645 if (sqlite3_changes(backend_sqlite->
db) < 1) {
1658 int ret, left, bind;
1659 sqlite3_stmt* statement = NULL;
1662 if (!__sqlite3_initialized) {
1665 if (!backend_sqlite) {
1677 memset(sql, 0, left);
1679 if ((ret = snprintf(sqlp, left,
"SELECT COUNT(*)")) >= left) {
1685 if ((ret = snprintf(sqlp, left,
" FROM %s",
db_object_table(
object))) >= left) {
1694 if ((ret = snprintf(sqlp, left,
" INNER JOIN %s ON %s.%s = %s.%s",
1711 if ((ret = snprintf(sqlp, left,
" WHERE")) >= left) {
1717 if (__db_backend_sqlite_build_clause(
object, clause_list, &sqlp, &left)) {
1722 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql,
sizeof(sql))) {
1728 if (__db_backend_sqlite_bind_clause(statement, clause_list, &bind)) {
1729 __db_backend_sqlite_finalize(statement);
1734 ret = __db_backend_sqlite_step(backend_sqlite, statement);
1735 if (ret != SQLITE_DONE && ret != SQLITE_ROW) {
1736 __db_backend_sqlite_finalize(statement);
1740 sqlite_count = sqlite3_column_int(statement, 0);
1741 ret = sqlite3_errcode(backend_sqlite->
db);
1742 if ((ret != SQLITE_OK && ret != SQLITE_ROW && ret != SQLITE_DONE)) {
1743 __db_backend_sqlite_finalize(statement);
1747 *count = sqlite_count;
1748 __db_backend_sqlite_finalize(statement);
1752 static void db_backend_sqlite_free(
void* data) {
1755 if (backend_sqlite) {
1756 if (backend_sqlite->
db) {
1757 (void)db_backend_sqlite_disconnect(backend_sqlite);
1759 free(backend_sqlite);
1763 static int db_backend_sqlite_transaction_begin(
void* data) {
1765 static const char* sql =
"BEGIN TRANSACTION";
1766 sqlite3_stmt* statement = NULL;
1768 if (!__sqlite3_initialized) {
1771 if (!backend_sqlite) {
1778 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql, strlen(sql))) {
1782 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1783 __db_backend_sqlite_finalize(statement);
1786 __db_backend_sqlite_finalize(statement);
1792 static int db_backend_sqlite_transaction_commit(
void* data) {
1794 static const char* sql =
"COMMIT TRANSACTION";
1795 sqlite3_stmt* statement = NULL;
1797 if (!__sqlite3_initialized) {
1800 if (!backend_sqlite) {
1807 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql, strlen(sql))) {
1811 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1812 __db_backend_sqlite_finalize(statement);
1815 __db_backend_sqlite_finalize(statement);
1821 static int db_backend_sqlite_transaction_rollback(
void* data) {
1823 static const char* sql =
"ROLLBACK TRANSACTION";
1824 sqlite3_stmt* statement = NULL;
1826 if (!__sqlite3_initialized) {
1829 if (!backend_sqlite) {
1836 if (__db_backend_sqlite_prepare(backend_sqlite, &statement, sql, strlen(sql))) {
1840 if (__db_backend_sqlite_step(backend_sqlite, statement) != SQLITE_DONE) {
1841 __db_backend_sqlite_finalize(statement);
1844 __db_backend_sqlite_finalize(statement);
1872 free(backend_sqlite);
1875 return backend_handle;
1877 free(backend_sqlite);
int db_value_from_uint32(db_value_t *value, db_type_uint32_t from_uint32)
int db_value_from_int64(db_value_t *value, db_type_int64_t from_int64)
int db_backend_handle_set_create(db_backend_handle_t *backend_handle, db_backend_handle_create_t create_function)
struct db_backend_sqlite db_backend_sqlite_t
void ods_log_debug(const char *format,...)
const db_value_t * db_value_set_at(const db_value_set_t *value_set, size_t at)
void db_value_set_free(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_to_uint64(const db_value_t *value, db_type_uint64_t *to_uint64)
int db_value_enum_value(const db_value_t *value, int *enum_value)
const char * db_join_to_table(const db_join_t *join)
const db_join_t * db_join_next(const db_join_t *join)
db_result_t * db_result_new(void)
int db_value_from_uint64(db_value_t *value, db_type_uint64_t from_uint64)
int db_backend_handle_set_data(db_backend_handle_t *backend_handle, void *data)
const db_clause_list_t * db_clause_list(const db_clause_t *clause)
int db_value_to_int64(const db_value_t *value, db_type_int64_t *to_int64)
void ods_log_info(const char *format,...)
const char * db_join_to_field(const db_join_t *join)
void db_backend_handle_free(db_backend_handle_t *backend_handle)
const char * db_clause_field(const db_clause_t *clause)
db_backend_handle_t * db_backend_handle_new(void)
void ods_log_error(const char *format,...)
const char * db_object_table(const db_object_t *object)
int db_value_from_text(db_value_t *value, const char *from_text)
int db_backend_handle_set_connect(db_backend_handle_t *backend_handle, db_backend_handle_connect_t connect_function)
const char * db_object_field_name(const db_object_field_t *object_field)
int db_backend_handle_set_update(db_backend_handle_t *backend_handle, db_backend_handle_update_t update_function)
int db_backend_handle_set_free(db_backend_handle_t *backend_handle, db_backend_handle_free_t free_function)
const db_object_field_t * db_object_field_next(const db_object_field_t *object_field)
const db_clause_t * db_clause_list_begin(const db_clause_list_t *clause_list)
size_t db_value_set_size(const db_value_set_t *value_set)
int db_value_set_primary_key(db_value_t *value)
const db_clause_t * db_clause_next(const db_clause_t *clause)
const db_object_t * object
void ods_log_crit(const char *format,...)
void db_result_list_free(db_result_list_t *result_list)
int db_result_set_value_set(db_result_t *result, db_value_set_t *value_set)
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_delete(db_backend_handle_t *backend_handle, db_backend_handle_delete_t delete_function)
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)
int db_backend_handle_set_shutdown(db_backend_handle_t *backend_handle, db_backend_handle_shutdown_t shutdown_function)
struct db_backend_sqlite_statement db_backend_sqlite_statement_t
db_backend_handle_t * db_backend_sqlite_new_handle(void)
db_value_set_t * db_value_set_new(size_t size)
const char * db_join_from_field(const db_join_t *join)
db_backend_sqlite_t * backend_sqlite
void db_result_free(db_result_t *result)
db_type_t db_object_field_type(const db_object_field_t *object_field)
const db_configuration_t * db_configuration_list_find(const db_configuration_list_t *configuration_list, const char *name)
int db_value_from_int32(db_value_t *value, db_type_int32_t from_int32)
db_result_list_t * db_result_list_new(void)
void ods_log_deeebug(const char *format,...)
const db_object_field_list_t * db_object_object_field_list(const db_object_t *object)
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_disconnect(db_backend_handle_t *backend_handle, db_backend_handle_disconnect_t disconnect_function)
const char * db_join_from_table(const db_join_t *join)
#define DB_BACKEND_SQLITE_DEFAULT_USLEEP
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_count(db_backend_handle_t *backend_handle, db_backend_handle_count_t count_function)
db_type_t db_value_type(const db_value_t *value)
#define DB_BACKEND_SQLITE_DEFAULT_TIMEOUT
const db_value_t * db_clause_value(const db_clause_t *clause)
const char * db_configuration_value(const db_configuration_t *configuration)
const char * db_value_text(const db_value_t *value)
db_clause_type_t db_clause_type(const db_clause_t *clause)
const db_join_t * db_join_list_begin(const db_join_list_t *join_list)
int db_backend_handle_set_read(db_backend_handle_t *backend_handle, db_backend_handle_read_t read_function)
const db_object_field_t * db_object_field_list_begin(const db_object_field_list_t *object_field_list)
uint64_t db_type_uint64_t
uint32_t db_type_uint32_t
db_value_t * db_value_set_get(db_value_set_t *value_set, size_t at)
int db_backend_handle_set_initialize(db_backend_handle_t *backend_handle, db_backend_handle_initialize_t initialize_function)
db_clause_operator_t db_clause_operator(const db_clause_t *clause)
int db_value_to_int32(const db_value_t *value, db_type_int32_t *to_int32)