From f61fbb60b355f94e12257a7cccdb533145ff95ff Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Thu, 2 Jun 2005 04:17:54 +0000 Subject: [PATCH] Add idx to songs table to allow for index per path --- src/db-generic.c | 6 ++--- src/db-generic.h | 2 +- src/dbs-sqlite.c | 62 ++++++++++++++++++++++++++++++++++++++++++++--- src/dbs-sqlite.h | 2 +- src/mp3-scanner.c | 4 +-- src/mp3-scanner.h | 1 + src/scan-xml.c | 2 +- 7 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/db-generic.c b/src/db-generic.c index 671ab474..3415f92c 100644 --- a/src/db-generic.c +++ b/src/db-generic.c @@ -60,7 +60,7 @@ typedef struct tag_db_functions { int(*dbs_end_scan)(void); int(*dbs_get_count)(CountType_t); MP3FILE*(*dbs_fetch_item)(int); - MP3FILE*(*dbs_fetch_path)(char *); + MP3FILE*(*dbs_fetch_path)(char *,int); M3UFILE*(*dbs_fetch_playlist)(char *, int); void(*dbs_dispose_item)(MP3FILE*); void(*dbs_dispose_playlist)(M3UFILE*); @@ -628,11 +628,11 @@ MP3FILE *db_fetch_item(int id) { return retval; } -MP3FILE *db_fetch_path(char *path) { +MP3FILE *db_fetch_path(char *path,int index) { MP3FILE *retval; db_readlock(); - retval=db_current->dbs_fetch_path(path); + retval=db_current->dbs_fetch_path(path, index); db_unlock(); return retval; diff --git a/src/db-generic.h b/src/db-generic.h index db88114c..2dfa07d4 100644 --- a/src/db-generic.h +++ b/src/db-generic.h @@ -162,7 +162,7 @@ extern int db_delete_playlist(int playlistid); extern int db_delete_playlist_item(int playlistid, int songid); extern MP3FILE *db_fetch_item(int id); -extern MP3FILE *db_fetch_path(char *path); +extern MP3FILE *db_fetch_path(char *path, int index); extern M3UFILE *db_fetch_playlist(char *path, int index); diff --git a/src/dbs-sqlite.c b/src/dbs-sqlite.c index 7c216c46..428db02b 100644 --- a/src/dbs-sqlite.c +++ b/src/dbs-sqlite.c @@ -364,7 +364,7 @@ int db_sqlite_delete_playlist(int playlistid) { * \param playlistid playlist to delete item from * \param songid song to delete from playlist */ -extern int db_sqlite_delete_playlist_item(int playlistid, int songid) { +int db_sqlite_delete_playlist_item(int playlistid, int songid) { int result; int playlist_type; int count; @@ -509,6 +509,7 @@ int db_sqlite_add(MP3FILE *pmp3) { err=db_sqlite_exec(E_DBG,"INSERT INTO songs VALUES " "(NULL," // id "'%q'," // path + "'%d'," // index "'%q'," // fname "'%q'," // title "'%q'," // artist @@ -546,6 +547,7 @@ int db_sqlite_add(MP3FILE *pmp3) { "0," // force_update "'%q')", // codectype STR(pmp3->path), + pmp3->index, STR(pmp3->fname), STR(pmp3->title), STR(pmp3->artist), @@ -1316,6 +1318,7 @@ void db_sqlite_build_m3ufile(char **valarray, M3UFILE *pm3u) { pm3u->index=db_sqlite_atoi(valarray[7]); return; } + void db_sqlite_build_mp3file(char **valarray, MP3FILE *pmp3) { memset(pmp3,0x00,sizeof(MP3FILE)); pmp3->id=db_sqlite_atoi(valarray[0]); @@ -1356,6 +1359,7 @@ void db_sqlite_build_mp3file(char **valarray, MP3FILE *pmp3) { pmp3->sample_count=db_sqlite_atoi(valarray[35]); pmp3->force_update=db_sqlite_atoi(valarray[36]); pmp3->codectype=db_sqlite_strdup(valarray[37]); + pmp3->index=db_sqlite_atoi(valarray[38]); } /** @@ -1428,13 +1432,14 @@ MP3FILE *db_sqlite_fetch_item(int id) { * * \param path path of the file to retreive */ -MP3FILE *db_sqlite_fetch_path(char *path) { +MP3FILE *db_sqlite_fetch_path(char *path, int index) { int rows,cols; char **resarray; MP3FILE *pmp3=NULL; db_sqlite_get_table(E_DBG,&resarray,&rows,&cols, - "SELECT * FROM songs WHERE path='%q'",path); + "SELECT * FROM songs WHERE path='%q' and idx=%d", + path,index); if(rows != 0) { pmp3=(MP3FILE*)malloc(sizeof(MP3FILE)); @@ -1712,6 +1717,57 @@ char *db_sqlite_upgrade_scripts[] = { "drop table tempplaylists;\n" "update config set value=5 where term='version';\n", + /* version 5 -> version 6 */ + "drop index idx_path;\n" + "create temp table tempsongs as select * from songs;\n" + "drop table songs;\n" + "CREATE TABLE songs (\n" + " id INTEGER PRIMARY KEY NOT NULL,\n" + " path VARCHAR(4096) UNIQUE NOT NULL,\n" + " fname VARCHAR(255) NOT NULL,\n" + " title VARCHAR(1024) DEFAULT NULL,\n" + " artist VARCHAR(1024) DEFAULT NULL,\n" + " album VARCHAR(1024) DEFAULT NULL,\n" + " genre VARCHAR(255) DEFAULT NULL,\n" + " comment VARCHAR(4096) DEFAULT NULL,\n" + " type VARCHAR(255) DEFAULT NULL,\n" + " composer VARCHAR(1024) DEFAULT NULL,\n" + " orchestra VARCHAR(1024) DEFAULT NULL,\n" + " conductor VARCHAR(1024) DEFAULT NULL,\n" + " grouping VARCHAR(1024) DEFAULT NULL,\n" + " url VARCHAR(1024) DEFAULT NULL,\n" + " bitrate INTEGER DEFAULT 0,\n" + " samplerate INTEGER DEFAULT 0,\n" + " song_length INTEGER DEFAULT 0,\n" + " file_size INTEGER DEFAULT 0,\n" + " year INTEGER DEFAULT 0,\n" + " track INTEGER DEFAULT 0,\n" + " total_tracks INTEGER DEFAULT 0,\n" + " disc INTEGER DEFAULT 0,\n" + " total_discs INTEGER DEFAULT 0,\n" + " bpm INTEGER DEFAULT 0,\n" + " compilation INTEGER DEFAULT 0,\n" + " rating INTEGER DEFAULT 0,\n" + " play_count INTEGER DEFAULT 0,\n" + " data_kind INTEGER DEFAULT 0,\n" + " item_kind INTEGER DEFAULT 0,\n" + " description INTEGER DEFAULT 0,\n" + " time_added INTEGER DEFAULT 0,\n" + " time_modified INTEGER DEFAULT 0,\n" + " time_played INTEGER DEFAULT 0,\n" + " db_timestamp INTEGER DEFAULT 0,\n" + " disabled INTEGER DEFAULT 0,\n" + " sample_count INTEGER DEFAULT 0,\n" + " force_update INTEGER DEFAULT 0,\n" + " codectype VARCHAR(5) DEFAULT NULL,\n" + " idx INTEGER NOT NULL\n" + ");\n" + "begin transaction;\n" + "insert into songs select *,0 from tempsongs;\n" + "commit transaction;\n" + "create index idx_path on songs(path);\n" + "drop table tempsongs;\n" + "update config set value=6 where term='version';\n", NULL /* No more versions! */ }; diff --git a/src/dbs-sqlite.h b/src/dbs-sqlite.h index e1802072..16850ee8 100644 --- a/src/dbs-sqlite.h +++ b/src/dbs-sqlite.h @@ -36,7 +36,7 @@ extern int db_sqlite_end_song_scan(void); extern int db_sqlite_end_scan(void); extern int db_sqlite_get_count(CountType_t type); extern MP3FILE *db_sqlite_fetch_item(int id); -extern MP3FILE *db_sqlite_fetch_path(char *path); +extern MP3FILE *db_sqlite_fetch_path(char *path,int index); extern M3UFILE *db_sqlite_fetch_playlist(char *path, int index); extern void db_sqlite_dispose_item(MP3FILE *pmp3); extern void db_sqlite_dispose_playlist(M3UFILE *pm3u); diff --git a/src/mp3-scanner.c b/src/mp3-scanner.c index e96f1e7c..7bb2f86f 100644 --- a/src/mp3-scanner.c +++ b/src/mp3-scanner.c @@ -311,7 +311,7 @@ int scan_path(char *path) { (strcasestr(config.extensions, ext))) { /* only scan if it's been changed, or empty db */ modified_time=sb.st_mtime; - pmp3=db_fetch_path(mp3_path); + pmp3=db_fetch_path(mp3_path,0); if((!pmp3) || (pmp3->db_timestamp < modified_time) || (pmp3->force_update)) { @@ -413,7 +413,7 @@ int scan_static_playlist(char *path) { DPRINTF(E_DBG,L_SCAN|L_PL,"Checking %s\n",real_path); // might be valid, might not... - if((pmp3=db_fetch_path(real_path))) { + if((pmp3=db_fetch_path(real_path,0))) { db_add_playlist_item(playlistid,pmp3->id); db_dispose_item(pmp3); } else { diff --git a/src/mp3-scanner.h b/src/mp3-scanner.h index e632573a..e29faeec 100644 --- a/src/mp3-scanner.h +++ b/src/mp3-scanner.h @@ -26,6 +26,7 @@ typedef struct tag_mp3file { char *path; + int index; char *fname; char *title; /* TIT2 */ char *artist; /* TPE1 */ diff --git a/src/scan-xml.c b/src/scan-xml.c index 30eda6cb..1336354b 100644 --- a/src/scan-xml.c +++ b/src/scan-xml.c @@ -538,7 +538,7 @@ int scan_xml_tracks_section(int action, char *info) { scan_xml_real_base_path, (char*)&song_path[strlen(scan_xml_itunes_decoded_base_path)]); realpath(physical_path,real_path); - pmp3=db_fetch_path(real_path); + pmp3=db_fetch_path(real_path,0); if(pmp3) { /* Update the existing record with the * updated stuff we got from the iTunes xml file