sqlite plugin requires libsqlite3 => 3.3.1 to share connections
use recursive locking if libsqlite3 < 3.5.0
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user