From 1dc1257f2c3eb5d718cd53aa463e3544f7898094 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Thu, 15 Jun 2006 07:10:05 +0000 Subject: [PATCH] add rescan/full rescan methods to xml-rpc for ticket #121 --- src/daapd.h | 1 + src/db-generic.c | 12 ++++++++++++ src/db-generic.h | 2 +- src/db-sql.c | 10 +++++++++- src/db-sql.h | 1 + src/main.c | 5 +++++ src/xml-rpc.c | 19 +++++++++++++++++++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/daapd.h b/src/daapd.h index f5766227..af67597c 100644 --- a/src/daapd.h +++ b/src/daapd.h @@ -52,6 +52,7 @@ typedef struct tag_config { int stop; /**< Time to exit? */ int reload; /**< Time to reload and/or rescan the database? */ int foreground; /**< Whether or not we are running in foreground */ + int full_reload; /**< Whether the reload should be a full one */ #if 0 char *configfile; /**< path to config file */ diff --git a/src/db-generic.c b/src/db-generic.c index 02cb3bbf..33f81e1c 100644 --- a/src/db-generic.c +++ b/src/db-generic.c @@ -64,6 +64,7 @@ typedef struct tag_db_functions { int(*dbs_enum_fetch_row)(char **, PACKED_MP3FILE *, DBQUERYINFO *); int(*dbs_enum_reset)(char **, DBQUERYINFO *); int(*dbs_enum_end)(char **); + int(*dbs_force_rescan)(char **); int(*dbs_start_scan)(void); int(*dbs_end_song_scan)(void); int(*dbs_end_scan)(void); @@ -96,6 +97,7 @@ DB_FUNCTIONS db_functions[] = { db_sql_enum_fetch_row, db_sql_enum_reset, db_sql_enum_end, + db_sql_force_rescan, db_sql_start_scan, db_sql_end_song_scan, db_sql_end_scan, @@ -126,6 +128,7 @@ DB_FUNCTIONS db_functions[] = { db_sql_enum_fetch_row, db_sql_enum_reset, db_sql_enum_end, + db_sql_force_rescan, db_sql_start_scan, db_sql_end_song_scan, db_sql_end_scan, @@ -795,6 +798,15 @@ M3UFILE *db_fetch_playlist(char **pe, char *path, int index) { return retval; } +int db_force_rescan(char **pe) { + int retval; + db_writelock(); + retval = db_current->dbs_force_rescan(pe); + db_unlock(); + + return retval; +} + int db_start_scan(void) { int retval; diff --git a/src/db-generic.h b/src/db-generic.h index 2bb939fd..8150a6bd 100644 --- a/src/db-generic.h +++ b/src/db-generic.h @@ -202,7 +202,7 @@ extern int db_get_song_count(char **pe, int *count); extern int db_get_playlist_count(char **pe, int *count); extern void db_dispose_item(MP3FILE *pmp3); extern void db_dispose_playlist(M3UFILE *pm3u); - +extern int db_force_rescan(char **pe); #define DB_E_SUCCESS 0x00 #define DB_E_SQL_ERROR 0x01 /**< some kind of sql error - typically bad syntax */ diff --git a/src/db-sql.c b/src/db-sql.c index 4d3ad725..c4557d3a 100644 --- a/src/db-sql.c +++ b/src/db-sql.c @@ -350,12 +350,20 @@ int db_sql_deinit(void) { return db_sql_close_fn(); } + +/** + * force a rescan + */ +int db_sql_force_rescan(char **pe) { + return db_sql_exec_fn(pe,E_LOG,"update songs set force_update=1"); +} + /** * start a background scan * * @returns DB_E_SUCCESS on success, error code otherwise */ -int db_sql_start_scan(void) { +int db_sql_start_scan() { DPRINTF(E_DBG,L_DB,"Starting db scan\n"); db_sql_event_fn(DB_SQL_EVENT_SONGSCANSTART); diff --git a/src/db-sql.h b/src/db-sql.h index 604a0c18..8e8e3a73 100644 --- a/src/db-sql.h +++ b/src/db-sql.h @@ -42,6 +42,7 @@ extern int db_sql_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned extern int db_sql_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo); extern int db_sql_enum_reset(char **pe, DBQUERYINFO *pinfo); extern int db_sql_enum_end(char **pe); +extern int db_sql_force_rescan(char **pe); extern int db_sql_start_scan(void); extern int db_sql_end_song_scan(void); extern int db_sql_end_scan(void); diff --git a/src/main.c b/src/main.c index 8dc24ac1..3979fb4e 100644 --- a/src/main.c +++ b/src/main.c @@ -512,6 +512,11 @@ int main(int argc, char *argv[]) { DPRINTF(E_LOG,L_MAIN|L_DB|L_SCAN,"Rescanning database\n"); if(conf_get_array("general","mp3_dir",&mp3_dir_array)) { + if(config.full_reload) { + config.full_reload=0; + db_force_rescan(NULL); + } + if(scan_init(mp3_dir_array)) { DPRINTF(E_LOG,L_MAIN|L_DB|L_SCAN,"Error rescanning... bad path?\n"); } diff --git a/src/xml-rpc.c b/src/xml-rpc.c index 2e0de59a..56d73ebc 100644 --- a/src/xml-rpc.c +++ b/src/xml-rpc.c @@ -51,6 +51,7 @@ struct tag_xmlstruct { void xml_get_stats(WS_CONNINFO *pwsc); void xml_set_config(WS_CONNINFO *pwsc); void xml_browse_path(WS_CONNINFO *pwsc); +void xml_rescan(WS_CONNINFO *pwsc); void xml_return_error(WS_CONNINFO *pwsc, int err, char *errstr); char *xml_entity_encode(char *original); @@ -180,6 +181,19 @@ void xml_update_config(WS_CONNINFO *pwsc) { xml_return_error(pwsc,200,"Success"); } +/** + * rescan the database + */ +void xml_rescan(WS_CONNINFO *pwsc) { + if(ws_getvar(pwsc,"full")) { + config.full_reload=1; + } + + config.reload=1; + + xml_return_error(pwsc,200,"Success"); +} + /** * post settings back to the config file * @@ -357,6 +371,11 @@ void xml_handle(WS_CONNINFO *pwsc) { return; } + if(strcasecmp(method,"rescan") == 0) { + xml_rescan(pwsc); + return; + } + xml_return_error(pwsc,500,"Invalid method"); return; }