From 61f5e96ea7f7e0b38ed33ae9efc00ae02459fd84 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Thu, 3 May 2007 00:18:25 +0000 Subject: [PATCH] Force a full rescan when the database version is too new --- src/db-generic.c | 4 ++-- src/db-generic.h | 2 +- src/db-sql-sqlite2.c | 7 ++++++- src/db-sql-sqlite3.c | 5 ++++- src/db-sql.c | 16 ++++++++-------- src/db-sql.h | 2 +- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/db-generic.c b/src/db-generic.c index 3e0c0c04..09850007 100644 --- a/src/db-generic.c +++ b/src/db-generic.c @@ -53,7 +53,7 @@ typedef struct tag_db_functions { char *name; int(*dbs_open)(char **, char *); - int(*dbs_init)(int*); + int(*dbs_init)(int); int(*dbs_deinit)(void); int(*dbs_add)(char **, MP3FILE*, int*); int(*dbs_add_playlist)(char **, char *, int, char *,char *, int, int *); @@ -284,7 +284,7 @@ int db_open(char **pe, char *type, char *parameters) { * * \param reload whether or not to do a full reload of the database */ -int db_init(int *reload) { +int db_init(int reload) { return db_current->dbs_init(reload); } diff --git a/src/db-generic.h b/src/db-generic.h index de7fb26e..363c155f 100644 --- a/src/db-generic.h +++ b/src/db-generic.h @@ -68,7 +68,7 @@ typedef struct tag_dbqueryinfo { } DBQUERYINFO; extern int db_open(char **pe, char *type, char *parameters); -extern int db_init(int *reload); +extern int db_init(int reload); extern int db_deinit(void); extern int db_revision(void); diff --git a/src/db-sql-sqlite2.c b/src/db-sql-sqlite2.c index 5a0aa0a8..ad6419a8 100644 --- a/src/db-sql-sqlite2.c +++ b/src/db-sql-sqlite2.c @@ -156,12 +156,17 @@ int db_sqlite2_open(char **pe, char *dsn) { if(pe) { free(*pe); } /* we'll catch this on the init */ DPRINTF(E_LOG,L_DB,"Can't get db version. New database?\n"); - } else if(ver != DB_SQLITE2_VERSION) { + } else if(ver < DB_SQLITE2_VERSION) { /* we'll deal with this in the db handler */ DPRINTF(E_LOG,L_DB,"Old database version: %d, expecting %d\n", ver, DB_SQLITE2_VERSION); db_get_error(pe,DB_E_WRONGVERSION); return DB_E_WRONGVERSION; + } else if(ver > DB_SQLITE2_VERSION) { /* Back-grade from nightlies ? */ + DPRINTF(E_LOG,L_DB,"Bad db version: %d, expecting %d\n", + ver, DB_SQLITE2_VERSION); + db_sqlite2_exec(pe,E_FATAL,"insert into config (term, value) " + "values ('rescan',1)"); } return DB_E_SUCCESS; diff --git a/src/db-sql-sqlite3.c b/src/db-sql-sqlite3.c index f94a2e1b..c3cc295f 100644 --- a/src/db-sql-sqlite3.c +++ b/src/db-sql-sqlite3.c @@ -152,11 +152,14 @@ int db_sqlite3_open(char **pe, char *dsn) { if(pe) { free(*pe); } /* we'll catch this on the init */ DPRINTF(E_LOG,L_DB,"Can't get db version. New database?\n"); - } else if(ver != DB_SQLITE3_VERSION) { + } else if(ver < DB_SQLITE3_VERSION) { DPRINTF(E_LOG,L_DB,"Old database version: %d, expecting %d\n", ver,DB_SQLITE3_VERSION); db_get_error(pe,DB_E_WRONGVERSION); return DB_E_WRONGVERSION; + } else if(ver > DB_SQLITE3_VERSION) { + db_sqlite3_exec(pe,E_FATAL,"insert into config (term, value) " + "values ('rescan',1)"); } return DB_E_SUCCESS; diff --git a/src/db-sql.c b/src/db-sql.c index c211b986..5064ac36 100644 --- a/src/db-sql.c +++ b/src/db-sql.c @@ -383,10 +383,11 @@ int db_sql_open(char **pe, char *parameters) { * on return, reload is set to 1 if the db MUST be rescanned * @returns DB_E_SUCCESS on success, error code otherwise */ -int db_sql_init(int *reload) { +int db_sql_init(int reload) { int items; int rescan = 0; int err; + int do_reload = reload; err=db_sql_get_count(NULL,&items, countSongs); if(err != DB_E_SUCCESS) @@ -394,23 +395,22 @@ int db_sql_init(int *reload) { /* check if a request has been written into the db (by a db upgrade?) */ if(db_sql_fetch_int(NULL,&rescan,"select value from config where " - "term='rescan'") == DB_E_SUCCESS) - { + "term='rescan'") == DB_E_SUCCESS) { if(rescan) - *reload=1; + do_reload=1; } - - if(*reload || (!items)) { + /* we could pass back a status to describe whether a reaload was + * required (for reasons other than expicit request) + */ + if(do_reload || (!items)) { DPRINTF(E_LOG,L_DB,"Full reload...\n"); db_sql_event_fn(DB_SQL_EVENT_FULLRELOAD); db_sql_reload=1; - *reload=1; } else { db_sql_event_fn(DB_SQL_EVENT_STARTUP); db_sql_reload=0; - *reload=0; } return DB_E_SUCCESS; diff --git a/src/db-sql.h b/src/db-sql.h index 01a45eda..9cc1cee4 100644 --- a/src/db-sql.h +++ b/src/db-sql.h @@ -32,7 +32,7 @@ extern int db_sql_open_sqlite3(char **pe, char *parameters); #endif extern int db_sql_open(char **pe, char *parameters); -extern int db_sql_init(int *reload); +extern int db_sql_init(int reload); extern int db_sql_deinit(void); extern int db_sql_escape(char *buffer, int *size, char *fmt, ...); extern int db_sql_add(char **pe, MP3FILE *pmp3, int *id);