void *test = sqlite3_prepare_v2;
],
[AC_MSG_RESULT([yes])]; AC_DEFINE_UNQUOTED(HAVE_SQLITE3_PREPARE_V2, 1), [AC_MSG_RESULT([no])])
+ AC_MSG_CHECKING([sqlite3.h version >= 3.3.1])
+ AC_TRY_COMPILE(
+ [#include <sqlite3.h>],
+ [
+ #if SQLITE_VERSION_NUMBER < 3003001
+ #error bad sqlite
+ #endif
+ ],
+ [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); AC_MSG_ERROR([SQLite version >= 3.3.1 required!])])
fi
if test x$openssl = xtrue; then
int count;
/** column types */
db_type_t *columns;
- /** reference to db connection */
- sqlite3 *db;
+ /** back reference to parent */
+ private_sqlite_database_t *database;
} sqlite_enumerator_t;
/**
static void sqlite_enumerator_destroy(sqlite_enumerator_t *this)
{
sqlite3_finalize(this->stmt);
+#if SQLITE_VERSION_NUMBER < 3005000
+ this->database->mutex->unlock(this->database->mutex);
+#endif
free(this->columns);
free(this);
}
case SQLITE_ROW:
break;
default:
- DBG1("stepping sqlite statement failed: %s", sqlite3_errmsg(this->db));
+ DBG1("stepping sqlite statement failed: %s",
+ sqlite3_errmsg(this->database->db));
/* fall */
case SQLITE_DONE:
return FALSE;
sqlite_enumerator_t *enumerator = NULL;
int i;
+#if SQLITE_VERSION_NUMBER < 3005000
+ /* sqlite connections prior to 3.5 may be used by a single thread only, */
+ this->mutex->lock(this->mutex);
+#endif
va_start(args, sql);
stmt = run(this, sql, &args);
enumerator->stmt = stmt;
enumerator->count = sqlite3_column_count(stmt);
enumerator->columns = malloc(sizeof(db_type_t) * enumerator->count);
- enumerator->db = this->db;
+ enumerator->database = this;
for (i = 0; i < enumerator->count; i++)
{
enumerator->columns[i] = va_arg(args, db_type_t);
this->public.db.execute = (int (*)(database_t *this, int *rowid, char *sql, ...))execute;
this->public.db.destroy = (void(*)(database_t*))destroy;
- this->mutex = mutex_create(MUTEX_DEFAULT);
+ this->mutex = mutex_create(MUTEX_RECURSIVE);
if (sqlite3_open(file, &this->db) != SQLITE_OK)
{