Fix races in enum

This commit is contained in:
Ron Pedde 2006-01-17 21:35:39 +00:00
parent 8e7bd9cd8b
commit bf9e414169
2 changed files with 29 additions and 28 deletions

View File

@ -60,7 +60,6 @@ static pthread_mutex_t db_sqlite2_mutex = PTHREAD_MUTEX_INITIALIZER; /**< sqlite
static sqlite_vm *db_sqlite2_pvm; static sqlite_vm *db_sqlite2_pvm;
static int db_sqlite2_reload=0; static int db_sqlite2_reload=0;
static char *db_sqlite2_enum_query; static char *db_sqlite2_enum_query;
static int db_sqlite2_in_enum=0;
static char db_sqlite2_path[PATH_MAX + 1]; static char db_sqlite2_path[PATH_MAX + 1];
@ -72,6 +71,7 @@ void db_sqlite2_lock(void);
void db_sqlite2_unlock(void); void db_sqlite2_unlock(void);
extern char *db_sqlite2_initial1; extern char *db_sqlite2_initial1;
extern char *db_sqlite2_initial2; extern char *db_sqlite2_initial2;
int db_sqlite2_enum_begin_helper(char **pe);
/** /**
* lock the db_mutex * lock the db_mutex
@ -214,19 +214,21 @@ int db_sqlite2_exec(char **pe, int loglevel, char *fmt, ...) {
*/ */
int db_sqlite2_enum_begin(char **pe, char *fmt, ...) { int db_sqlite2_enum_begin(char **pe, char *fmt, ...) {
va_list ap; va_list ap;
va_start(ap, fmt);
db_sqlite2_lock();
db_sqlite2_enum_query = sqlite_vmprintf(fmt,ap);
va_end(ap);
return db_sqlite2_enum_begin_helper(pe);
}
int db_sqlite2_enum_begin_helper(char **pe) {
int err; int err;
char *perr; char *perr;
const char *ptail; const char *ptail;
if(!db_sqlite2_in_enum) {
va_start(ap, fmt);
db_sqlite2_lock();
db_sqlite2_enum_query = sqlite_vmprintf(fmt,ap);
va_end(ap);
}
DPRINTF(E_DBG,L_DB,"Executing: %s\n",db_sqlite2_enum_query); DPRINTF(E_DBG,L_DB,"Executing: %s\n",db_sqlite2_enum_query);
db_sqlite2_in_enum=1;
err=sqlite_compile(db_sqlite2_songs,db_sqlite2_enum_query, err=sqlite_compile(db_sqlite2_songs,db_sqlite2_enum_query,
&ptail,&db_sqlite2_pvm,&perr); &ptail,&db_sqlite2_pvm,&perr);
@ -234,7 +236,6 @@ int db_sqlite2_enum_begin(char **pe, char *fmt, ...) {
if(err != SQLITE_OK) { if(err != SQLITE_OK) {
db_get_error(pe,DB_E_SQL_ERROR,perr); db_get_error(pe,DB_E_SQL_ERROR,perr);
sqlite_freemem(perr); sqlite_freemem(perr);
db_sqlite2_in_enum=0;
db_sqlite2_unlock(); db_sqlite2_unlock();
sqlite_freemem(db_sqlite2_enum_query); sqlite_freemem(db_sqlite2_enum_query);
return DB_E_SQL_ERROR; return DB_E_SQL_ERROR;
@ -244,6 +245,7 @@ int db_sqlite2_enum_begin(char **pe, char *fmt, ...) {
return DB_E_SUCCESS; return DB_E_SUCCESS;
} }
/** /**
* fetch the next row * fetch the next row
* *
@ -288,7 +290,6 @@ int db_sqlite2_enum_end(char **pe) {
int err; int err;
char *perr; char *perr;
db_sqlite2_in_enum=0;
sqlite_freemem(db_sqlite2_enum_query); sqlite_freemem(db_sqlite2_enum_query);
err = sqlite_finalize(db_sqlite2_pvm,&perr); err = sqlite_finalize(db_sqlite2_pvm,&perr);
@ -307,7 +308,7 @@ int db_sqlite2_enum_end(char **pe) {
* restart the enumeration * restart the enumeration
*/ */
int db_sqlite2_enum_restart(char **pe) { int db_sqlite2_enum_restart(char **pe) {
return db_sqlite2_enum_begin(pe,NULL); return db_sqlite2_enum_begin_helper(pe);
} }
@ -325,7 +326,7 @@ int db_sqlite2_event(int event_type) {
db_sqlite2_exec(NULL,E_DBG,"drop index idx_playlistid"); db_sqlite2_exec(NULL,E_DBG,"drop index idx_playlistid");
db_sqlite2_exec(NULL,E_DBG,"drop table songs"); db_sqlite2_exec(NULL,E_DBG,"drop table songs");
// db_sqlite2_exec(NULL,E_DBG,"drop table playlists"); // db_sqlite2_exec(NULL,E_DBG,"drop table playlists");
db_sqlite2_exec(NULL,E_DBG,"delete from playlists where not type=1"); db_sqlite2_exec(NULL,E_DBG,"delete from playlists where not type=1");
db_sqlite2_exec(NULL,E_DBG,"drop table playlistitems"); db_sqlite2_exec(NULL,E_DBG,"drop table playlistitems");
db_sqlite2_exec(NULL,E_DBG,"drop table config"); db_sqlite2_exec(NULL,E_DBG,"drop table config");
@ -399,7 +400,7 @@ int db_sqlite2_event(int event_type) {
* *
* @returns autoupdate value * @returns autoupdate value
*/ */
int db_sqlite2_insert_id(void) { int db_sqlite2_insert_id(void) {
return sqlite_last_insert_rowid(db_sqlite2_songs); return sqlite_last_insert_rowid(db_sqlite2_songs);
} }

View File

@ -60,7 +60,6 @@ static pthread_mutex_t db_sqlite3_mutex = PTHREAD_MUTEX_INITIALIZER; /**< sqlite
static sqlite3_stmt *db_sqlite3_stmt; static sqlite3_stmt *db_sqlite3_stmt;
static int db_sqlite3_reload=0; static int db_sqlite3_reload=0;
static char *db_sqlite3_enum_query; static char *db_sqlite3_enum_query;
static int db_sqlite3_in_enum=0;
static char **db_sqlite3_row = NULL; static char **db_sqlite3_row = NULL;
static char db_sqlite3_path[PATH_MAX + 1]; static char db_sqlite3_path[PATH_MAX + 1];
@ -73,6 +72,7 @@ void db_sqlite3_lock(void);
void db_sqlite3_unlock(void); void db_sqlite3_unlock(void);
extern char *db_sqlite3_initial1; extern char *db_sqlite3_initial1;
extern char *db_sqlite3_initial2; extern char *db_sqlite3_initial2;
int db_sqlite3_enum_begin_helper(char **pe);
/** /**
* lock the db_mutex * lock the db_mutex
@ -212,25 +212,25 @@ int db_sqlite3_exec(char **pe, int loglevel, char *fmt, ...) {
*/ */
int db_sqlite3_enum_begin(char **pe, char *fmt, ...) { int db_sqlite3_enum_begin(char **pe, char *fmt, ...) {
va_list ap; va_list ap;
db_sqlite3_lock();
va_start(ap, fmt);
db_sqlite3_enum_query = sqlite3_vmprintf(fmt,ap);
va_end(ap);
return db_sqlite3_enum_begin_helper(pe);
}
int db_sqlite3_enum_begin_helper(char **pe) {
int err; int err;
const char *ptail; const char *ptail;
if(!db_sqlite3_in_enum) {
va_start(ap, fmt);
db_sqlite3_lock();
db_sqlite3_enum_query = sqlite3_vmprintf(fmt,ap);
va_end(ap);
}
DPRINTF(E_DBG,L_DB,"Executing: %s\n",db_sqlite3_enum_query); DPRINTF(E_DBG,L_DB,"Executing: %s\n",db_sqlite3_enum_query);
db_sqlite3_in_enum=1;
err=sqlite3_prepare(db_sqlite3_songs,db_sqlite3_enum_query,0, err=sqlite3_prepare(db_sqlite3_songs,db_sqlite3_enum_query,0,
&db_sqlite3_stmt,&ptail); &db_sqlite3_stmt,&ptail);
if(err != SQLITE_OK) { if(err != SQLITE_OK) {
db_get_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_songs)); db_get_error(pe,DB_E_SQL_ERROR,sqlite3_errmsg(db_sqlite3_songs));
db_sqlite3_in_enum=0;
db_sqlite3_unlock(); db_sqlite3_unlock();
sqlite3_free(db_sqlite3_enum_query); sqlite3_free(db_sqlite3_enum_query);
return DB_E_SQL_ERROR; return DB_E_SQL_ERROR;
@ -242,6 +242,7 @@ int db_sqlite3_enum_begin(char **pe, char *fmt, ...) {
db_sqlite3_row=NULL; db_sqlite3_row=NULL;
return DB_E_SUCCESS; return DB_E_SUCCESS;
} }
/** /**
@ -307,7 +308,6 @@ int db_sqlite3_enum_fetch(char **pe, SQL_ROW *pr) {
int db_sqlite3_enum_end(char **pe) { int db_sqlite3_enum_end(char **pe) {
int err; int err;
db_sqlite3_in_enum=0;
if(db_sqlite3_row) if(db_sqlite3_row)
free(db_sqlite3_row); free(db_sqlite3_row);
db_sqlite3_row = NULL; db_sqlite3_row = NULL;
@ -328,7 +328,7 @@ int db_sqlite3_enum_end(char **pe) {
* restart the enumeration * restart the enumeration
*/ */
int db_sqlite3_enum_restart(char **pe) { int db_sqlite3_enum_restart(char **pe) {
return db_sqlite3_enum_begin(pe,NULL); return db_sqlite3_enum_begin_helper(pe);
} }
@ -419,7 +419,7 @@ int db_sqlite3_event(int event_type) {
* *
* @returns autoupdate value * @returns autoupdate value
*/ */
int db_sqlite3_insert_id(void) { int db_sqlite3_insert_id(void) {
return (int)sqlite3_last_insert_rowid(db_sqlite3_songs); return (int)sqlite3_last_insert_rowid(db_sqlite3_songs);
} }