sqlite plugin requires libsqlite3 => 3.3.1 to share connections

use recursive locking if libsqlite3 < 3.5.0
This commit is contained in:
Martin Willi
2008-06-30 11:06:18 +00:00
parent aafe8ced39
commit 7da767f773
2 changed files with 22 additions and 5 deletions
+9
View File
@@ -684,6 +684,15 @@ if test x$sqlite = xtrue; then
void *test = sqlite3_prepare_v2; void *test = sqlite3_prepare_v2;
], ],
[AC_MSG_RESULT([yes])]; AC_DEFINE_UNQUOTED(HAVE_SQLITE3_PREPARE_V2, 1), [AC_MSG_RESULT([no])]) [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 fi
if test x$openssl = xtrue; then if test x$openssl = xtrue; then
@@ -131,8 +131,8 @@ typedef struct {
int count; int count;
/** column types */ /** column types */
db_type_t *columns; db_type_t *columns;
/** reference to db connection */ /** back reference to parent */
sqlite3 *db; private_sqlite_database_t *database;
} sqlite_enumerator_t; } sqlite_enumerator_t;
/** /**
@@ -141,6 +141,9 @@ typedef struct {
static void sqlite_enumerator_destroy(sqlite_enumerator_t *this) static void sqlite_enumerator_destroy(sqlite_enumerator_t *this)
{ {
sqlite3_finalize(this->stmt); sqlite3_finalize(this->stmt);
#if SQLITE_VERSION_NUMBER < 3005000
this->database->mutex->unlock(this->database->mutex);
#endif
free(this->columns); free(this->columns);
free(this); free(this);
} }
@@ -158,7 +161,8 @@ static bool sqlite_enumerator_enumerate(sqlite_enumerator_t *this, ...)
case SQLITE_ROW: case SQLITE_ROW:
break; break;
default: default:
DBG1("stepping sqlite statement failed: %s", sqlite3_errmsg(this->db)); DBG1("stepping sqlite statement failed: %s",
sqlite3_errmsg(this->database->db));
/* fall */ /* fall */
case SQLITE_DONE: case SQLITE_DONE:
return FALSE; return FALSE;
@@ -218,6 +222,10 @@ static enumerator_t* query(private_sqlite_database_t *this, char *sql, ...)
sqlite_enumerator_t *enumerator = NULL; sqlite_enumerator_t *enumerator = NULL;
int i; 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); va_start(args, sql);
stmt = run(this, sql, &args); stmt = run(this, sql, &args);
@@ -229,7 +237,7 @@ static enumerator_t* query(private_sqlite_database_t *this, char *sql, ...)
enumerator->stmt = stmt; enumerator->stmt = stmt;
enumerator->count = sqlite3_column_count(stmt); enumerator->count = sqlite3_column_count(stmt);
enumerator->columns = malloc(sizeof(db_type_t) * enumerator->count); enumerator->columns = malloc(sizeof(db_type_t) * enumerator->count);
enumerator->db = this->db; enumerator->database = this;
for (i = 0; i < enumerator->count; i++) for (i = 0; i < enumerator->count; i++)
{ {
enumerator->columns[i] = va_arg(args, db_type_t); enumerator->columns[i] = va_arg(args, db_type_t);
@@ -306,7 +314,7 @@ sqlite_database_t *sqlite_database_create(char *uri)
this->public.db.execute = (int (*)(database_t *this, int *rowid, char *sql, ...))execute; this->public.db.execute = (int (*)(database_t *this, int *rowid, char *sql, ...))execute;
this->public.db.destroy = (void(*)(database_t*))destroy; 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) if (sqlite3_open(file, &this->db) != SQLITE_OK)
{ {