From 01180d60f1f91c4473d6c92b64abad798479a6b4 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Tue, 10 Jan 2006 23:57:43 +0000 Subject: [PATCH] return id from db_add --- src/db-generic.c | 6 +++--- src/db-generic.h | 2 +- src/db-sql-sqlite2.c | 11 +++++++++++ src/db-sql-sqlite2.h | 2 ++ src/db-sql-sqlite3.c | 12 ++++++++++++ src/db-sql-sqlite3.h | 1 + src/db-sql.c | 36 +++++++++++++++++++++++++++--------- src/db-sql.h | 2 +- src/mp3-scanner.c | 2 +- src/scan-xml.c | 2 +- 10 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/db-generic.c b/src/db-generic.c index 6326e691..6812899e 100644 --- a/src/db-generic.c +++ b/src/db-generic.c @@ -46,7 +46,7 @@ typedef struct tag_db_functions { int(*dbs_open)(char **, char *); int(*dbs_init)(int); int(*dbs_deinit)(void); - int(*dbs_add)(char **, MP3FILE*); + int(*dbs_add)(char **, MP3FILE*, int*); int(*dbs_add_playlist)(char **, char *, int, char *,char *, int, int *); int(*dbs_add_playlist_item)(char **, int, int); int(*dbs_delete_playlist)(char **, int); @@ -508,13 +508,13 @@ int db_scanning(void) { /** * add (or update) a file */ -int db_add(char **pe, MP3FILE *pmp3) { +int db_add(char **pe, MP3FILE *pmp3, int *id) { int retval; db_writelock(); db_utf8_validate(pmp3); db_trim_strings(pmp3); - retval=db_current->dbs_add(pe,pmp3); + retval=db_current->dbs_add(pe,pmp3,id); db_revision_no++; db_unlock(); diff --git a/src/db-generic.h b/src/db-generic.h index 331dbe1e..539449e3 100644 --- a/src/db-generic.h +++ b/src/db-generic.h @@ -141,7 +141,7 @@ extern int db_deinit(void); extern int db_revision(void); -extern int db_add(char **pe, MP3FILE *pmp3); +extern int db_add(char **pe, MP3FILE *pmp3, int *id); extern int db_enum_start(char **pe, DBQUERYINFO *pinfo); extern int db_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size); diff --git a/src/db-sql-sqlite2.c b/src/db-sql-sqlite2.c index f35ddce7..6957df01 100644 --- a/src/db-sql-sqlite2.c +++ b/src/db-sql-sqlite2.c @@ -385,6 +385,17 @@ int db_sqlite2_event(int event_type) { return DB_E_SUCCESS; } +/** + * get the id of the last auto_update inserted item + * + * @returns autoupdate value + */ + +int db_sqlite2_insert_id(void) { + return sqlite_last_insert_rowid(db_sqlite2_songs); +} + + char *db_sqlite2_initial = "create table songs (\n" " id INTEGER PRIMARY KEY NOT NULL,\n" diff --git a/src/db-sql-sqlite2.h b/src/db-sql-sqlite2.h index 8a2e0a7f..c8608a21 100644 --- a/src/db-sql-sqlite2.h +++ b/src/db-sql-sqlite2.h @@ -38,5 +38,7 @@ extern int db_sqlite2_enum_restart(char **pe); extern int db_sqlite2_event(int event_type); +extern int db_sqlite2_insert_id(void); + #endif /* _DB_SQL_SQLITE2_ */ diff --git a/src/db-sql-sqlite3.c b/src/db-sql-sqlite3.c index 8ad77ff8..54a56797 100644 --- a/src/db-sql-sqlite3.c +++ b/src/db-sql-sqlite3.c @@ -406,6 +406,18 @@ int db_sqlite3_event(int event_type) { return DB_E_SUCCESS; } +/** + * get the id of the last auto_update inserted item + * + * @returns autoupdate value + */ + +int db_sqlite3_insert_id(void) { + return (int)sqlite3_last_insert_rowid(db_sqlite3_songs); +} + + + char *db_sqlite3_initial = "create table songs (\n" " id INTEGER PRIMARY KEY NOT NULL,\n" diff --git a/src/db-sql-sqlite3.h b/src/db-sql-sqlite3.h index 173e4b16..2bfa5fed 100644 --- a/src/db-sql-sqlite3.h +++ b/src/db-sql-sqlite3.h @@ -37,6 +37,7 @@ extern int db_sqlite3_enum_end(char **pe); extern int db_sqlite3_enum_restart(char **pe); extern int db_sqlite3_event(int event_type); +extern int db_sqlite3_insert_id(void); #endif /* _DB_SQL_SQLITE3_ */ diff --git a/src/db-sql.c b/src/db-sql.c index d72b93d7..75cd4201 100644 --- a/src/db-sql.c +++ b/src/db-sql.c @@ -60,7 +60,7 @@ static int db_sql_need_dispose=0; int db_sql_get_size(DBQUERYINFO *pinfo, char **valarray); int db_sql_build_dmap(DBQUERYINFO *pinfo, char **valarray, unsigned char *presult, int len); void db_sql_build_mp3file(char **valarray, MP3FILE *pmp3); -int db_sql_update(char **pe, MP3FILE *pmp3); +int db_sql_update(char **pe, MP3FILE *pmp3, int *id); int db_sql_update_playlists(char **pe); char *db_sql_parse_smart(char *phrase); @@ -83,7 +83,7 @@ int (*db_sql_enum_fetch_fn)(char **pe, SQL_ROW *pr) = NULL; int (*db_sql_enum_end_fn)(char **pe) = NULL; int (*db_sql_enum_restart_fn)(char **pe); int (*db_sql_event_fn)(int event_type); - +int (*db_sql_insert_id_fn)(void); #ifdef HAVE_LIBSQLITE int db_sql_open_sqlite2(char **pe, char *parameters) { @@ -98,6 +98,7 @@ int db_sql_open_sqlite2(char **pe, char *parameters) { db_sql_enum_end_fn = db_sqlite2_enum_end; db_sql_enum_restart_fn = db_sqlite2_enum_restart; db_sql_event_fn = db_sqlite2_event; + db_sql_insert_id_fn = db_sqlite2_insert_id; return db_sql_open(pe,parameters); } @@ -116,6 +117,7 @@ int db_sql_open_sqlite3(char **pe, char *parameters) { db_sql_enum_end_fn = db_sqlite3_enum_end; db_sql_enum_restart_fn = db_sqlite3_enum_restart; db_sql_event_fn = db_sqlite3_event; + db_sql_insert_id_fn = db_sqlite3_insert_id; return db_sql_open(pe,parameters); } @@ -591,9 +593,10 @@ int db_sql_add_playlist_item(char **pe, int playlistid, int songid) { * * @param pmp3 mp3 file to add */ -int db_sql_add(char **pe, MP3FILE *pmp3) { +int db_sql_add(char **pe, MP3FILE *pmp3, int *id) { int err; int count; + int insertid; DPRINTF(E_SPAM,L_DB,"Entering db_sql_add\n"); @@ -612,7 +615,7 @@ int db_sql_add(char **pe, MP3FILE *pmp3) { "path='%q'",pmp3->path); if((err == DB_E_SUCCESS) && (count == 1)) { /* we should update */ - return db_sql_update(pe,pmp3); + return db_sql_update(pe,pmp3,id); } } @@ -699,14 +702,18 @@ int db_sql_add(char **pe, MP3FILE *pmp3) { if(err != DB_E_SUCCESS) DPRINTF(E_FATAL,L_DB,"Error inserting file %s in database\n",pmp3->fname); + insertid = db_sql_insert_id_fn(); if((db_sql_in_scan)&&(!db_sql_reload)) { - /* FIXME: this is sqlite-specific */ - db_sql_exec_fn(NULL,E_FATAL,"insert into updated values (last_insert_rowid())"); + db_sql_exec_fn(NULL,E_FATAL,"insert into updated values (%d)", + insertid); } if((!db_sql_in_scan) && (!db_sql_in_playlist_scan)) db_sql_update_playlists(NULL); + if(id) + *id = insertid; + DPRINTF(E_SPAM,L_DB,"Exiting db_sql_add\n"); return DB_E_SUCCESS; } @@ -716,7 +723,7 @@ int db_sql_add(char **pe, MP3FILE *pmp3) { * * @param pmp3 mp3 file to update */ -int db_sql_update(char **pe, MP3FILE *pmp3) { +int db_sql_update(char **pe, MP3FILE *pmp3, int *id) { int err; if(!pmp3->time_modified) @@ -788,9 +795,20 @@ int db_sql_update(char **pe, MP3FILE *pmp3) { if(err != DB_E_SUCCESS) DPRINTF(E_FATAL,L_DB,"Error updating file: %s\n",pmp3->fname); + if(id) { /* we need the insert/update id */ + err=db_sql_fetch_int(pe,id,"select id from songs where path='%q'",pmp3->path); + if(err != DB_E_SUCCESS) + return err; + } + if((db_sql_in_scan) && (!db_sql_reload)) { - db_sql_exec_fn(NULL,E_FATAL,"INSERT INTO updated (id) select id from songs where path='%q'", - pmp3->path); + if(id) { + db_sql_exec_fn(NULL,E_FATAL,"insert into updated (id) values (%d)",*id); + } else { + db_sql_exec_fn(NULL,E_FATAL,"insert into updated (id) " + "select id from songs where path='%q'", + pmp3->path); + } } if((!db_sql_in_scan) && (!db_sql_in_playlist_scan)) diff --git a/src/db-sql.h b/src/db-sql.h index 12307125..93f50dee 100644 --- a/src/db-sql.h +++ b/src/db-sql.h @@ -34,7 +34,7 @@ extern int db_sql_open_sqlite3(char **pe, char *parameters); extern int db_sql_open(char **pe, char *parameters); extern int db_sql_init(int reload); extern int db_sql_deinit(void); -extern int db_sql_add(char **pe, MP3FILE *pmp3); +extern int db_sql_add(char **pe, MP3FILE *pmp3, int *id); extern int db_sql_enum_start(char **pe, DBQUERYINFO *pinfo); extern int db_sql_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size); extern int db_sql_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned char **pdmap); diff --git a/src/mp3-scanner.c b/src/mp3-scanner.c index 22e95c78..2905c93f 100644 --- a/src/mp3-scanner.c +++ b/src/mp3-scanner.c @@ -548,7 +548,7 @@ void scan_music_file(char *path, struct dirent *pde, mp3file.compilation = 1; /* FIXME: error handling */ - db_add(NULL,&mp3file); + db_add(NULL,&mp3file,NULL); } else { DPRINTF(E_WARN,L_SCAN,"Skipping %s - scan failed\n",mp3file.path); } diff --git a/src/scan-xml.c b/src/scan-xml.c index aeecf0fd..68a02452 100644 --- a/src/scan-xml.c +++ b/src/scan-xml.c @@ -661,7 +661,7 @@ int scan_xml_tracks_section(int action, char *info) { /* must add to the red-black tree */ scan_xml_add_lookup(current_track_id,pmp3->id); - db_add(NULL,pmp3); + db_add(NULL,pmp3,NULL); db_dispose_item(pmp3); memset((void*)&mp3,0,sizeof(MP3FILE));