Add defensive index creation on startup, fix indexes for ordered query (and update schema), better startup after interrupted shutdown

This commit is contained in:
Ron Pedde 2006-07-29 00:45:23 +00:00
parent e54a8a1d9e
commit 90a6a39ce1
4 changed files with 32 additions and 13 deletions

View File

@ -65,7 +65,7 @@ static char *db_sqlite2_enum_query;
static char db_sqlite2_path[PATH_MAX + 1]; static char db_sqlite2_path[PATH_MAX + 1];
#define DB_SQLITE2_VERSION 10 #define DB_SQLITE2_VERSION 11
/* Forwards */ /* Forwards */
@ -322,6 +322,14 @@ int db_sqlite2_event(int event_type) {
case DB_SQL_EVENT_STARTUP: /* this is a startup with existing songs */ case DB_SQL_EVENT_STARTUP: /* this is a startup with existing songs */
db_sqlite2_exec(NULL,E_FATAL,"vacuum"); db_sqlite2_exec(NULL,E_FATAL,"vacuum");
/* make sure our indexes exist */
db_sqlite2_exec(NULL,E_DBG,"create index idx_path on "
"songs(path,idx)");
db_sqlite2_exec(NULL,E_DBG,"create index idx_songid on "
"playlistitems(songid)");
db_sqlite2_exec(NULL,E_DBG,"create index idx_playlistid on "
"playlistitems(playlistid,songid)");
db_sqlite2_reload=0; db_sqlite2_reload=0;
break; break;
@ -374,7 +382,7 @@ int db_sqlite2_event(int event_type) {
db_sqlite2_exec(NULL,E_FATAL,"end transaction"); db_sqlite2_exec(NULL,E_FATAL,"end transaction");
db_sqlite2_exec(NULL,E_FATAL,"pragma synchronous=normal"); db_sqlite2_exec(NULL,E_FATAL,"pragma synchronous=normal");
db_sqlite2_exec(NULL,E_FATAL,"create index idx_songid on playlistitems(songid)"); db_sqlite2_exec(NULL,E_FATAL,"create index idx_songid on playlistitems(songid)");
db_sqlite2_exec(NULL,E_FATAL,"create index idx_playlistid on playlistitems(playlistid)"); db_sqlite2_exec(NULL,E_FATAL,"create index idx_playlistid on playlistitems(playlistid,songid)");
} else { } else {
db_sqlite2_exec(NULL,E_FATAL,"delete from songs where id not in (select id from updated)"); db_sqlite2_exec(NULL,E_FATAL,"delete from songs where id not in (select id from updated)");
@ -465,7 +473,7 @@ char *db_sqlite2_initial1 =
" subterm VARCHAR(255) DEFAULT NULL,\n" " subterm VARCHAR(255) DEFAULT NULL,\n"
" value VARCHAR(1024) NOT NULL\n" " value VARCHAR(1024) NOT NULL\n"
");\n" ");\n"
"insert into config values ('version','','10');\n"; "insert into config values ('version','','11');\n";
char *db_sqlite2_initial2 = char *db_sqlite2_initial2 =
"create table playlists (\n" "create table playlists (\n"

View File

@ -67,7 +67,7 @@ static char **db_sqlite3_row = NULL;
static char db_sqlite3_path[PATH_MAX + 1]; static char db_sqlite3_path[PATH_MAX + 1];
#define DB_SQLITE3_VERSION 10 #define DB_SQLITE3_VERSION 11
/* Forwards */ /* Forwards */
@ -357,6 +357,12 @@ int db_sqlite3_event(int event_type) {
case DB_SQL_EVENT_STARTUP: /* this is a startup with existing songs */ case DB_SQL_EVENT_STARTUP: /* this is a startup with existing songs */
db_sqlite3_exec(NULL,E_FATAL,"vacuum"); db_sqlite3_exec(NULL,E_FATAL,"vacuum");
db_sqlite3_exec(NULL,E_DBG,"create index idx_path on "
"songs(path,idx)");
db_sqlite3_exec(NULL,E_DBG,"create index idx_songid on "
"playlistitems(songid)");
db_sqlite3_exec(NULL,E_DBG,"create index idx_playlistid on "
"playlistitems(playlistid,songid)");
db_sqlite3_reload=0; db_sqlite3_reload=0;
break; break;
@ -408,7 +414,7 @@ int db_sqlite3_event(int event_type) {
db_sqlite3_exec(NULL,E_FATAL,"end transaction"); db_sqlite3_exec(NULL,E_FATAL,"end transaction");
db_sqlite3_exec(NULL,E_FATAL,"pragma synchronous=normal"); db_sqlite3_exec(NULL,E_FATAL,"pragma synchronous=normal");
db_sqlite3_exec(NULL,E_FATAL,"create index idx_songid on playlistitems(songid)"); db_sqlite3_exec(NULL,E_FATAL,"create index idx_songid on playlistitems(songid)");
db_sqlite3_exec(NULL,E_FATAL,"create index idx_playlistid on playlistitems(playlistid)"); db_sqlite3_exec(NULL,E_FATAL,"create index idx_playlistid on playlistitems(playlistid,songid)");
} else { } else {
db_sqlite3_exec(NULL,E_FATAL,"delete from songs where id not in (select id from updated)"); db_sqlite3_exec(NULL,E_FATAL,"delete from songs where id not in (select id from updated)");
@ -506,7 +512,7 @@ char *db_sqlite3_initial1 =
" subterm VARCHAR(255) DEFAULT NULL,\n" " subterm VARCHAR(255) DEFAULT NULL,\n"
" value VARCHAR(1024) NOT NULL\n" " value VARCHAR(1024) NOT NULL\n"
");\n" ");\n"
"insert into config values ('version','','10');\n"; "insert into config values ('version','','11');\n";
char *db_sqlite3_initial2 = char *db_sqlite3_initial2 =
"create table playlists (\n" "create table playlists (\n"

View File

@ -242,8 +242,8 @@ char *db_sqlite_updates[] = {
"update config set value=7 where term='version';\n", "update config set value=7 where term='version';\n",
/* version 7 -> version 8 */ /* version 7 -> version 8 */
"create index idx_songid on playlistitems(songid);\n" "create index idx_songid on playlistitems(songid)\n"
"create index idx_playlistid on playlistitems(playlistid);\n" "create index idx_playlistid on playlistitems(playlistid)\n"
"update config set value=8 where term='version';\n", "update config set value=8 where term='version';\n",
/* version 8 -> version 9 */ /* version 8 -> version 9 */
@ -354,5 +354,9 @@ char *db_sqlite_updates[] = {
"create index idx_path on songs(path,idx);\n" "create index idx_path on songs(path,idx);\n"
"drop table tempsongs;\n" "drop table tempsongs;\n"
"update config set value=10 where term='version';\n", "update config set value=10 where term='version';\n",
/* version 10 -> version 11 */
"drop index idx_playlistid;\n"
"create index idx_playlistid on playlistitems(playlistid,songid);\n"
"update config set value=11 where term='version';\n",
NULL /* No more versions! */ NULL /* No more versions! */
}; };

View File

@ -222,8 +222,9 @@ void scan_process_playlistlist(void) {
if(strcasecmp(file,"iTunes Music Library.xml") == 0) { if(strcasecmp(file,"iTunes Music Library.xml") == 0) {
if(conf_get_int("scanning","process_xml",1)) { if(conf_get_int("scanning","process_xml",1)) {
DPRINTF(E_LOG,L_SCAN,"Scanning %s\n",pnext->path); DPRINTF(E_INF,L_SCAN,"Scanning %s\n",pnext->path);
scan_xml_playlist(pnext->path); scan_xml_playlist(pnext->path);
DPRINTF(E_INF,L_SCAN,"Done Scanning %s\n",pnext->path);
} }
} else if(strcasecmp(ext,".m3u") == 0) { } else if(strcasecmp(ext,".m3u") == 0) {
scan_static_playlist(pnext->path); scan_static_playlist(pnext->path);
@ -263,16 +264,16 @@ int scan_init(char **patharray) {
scan_playlistlist.next=NULL; scan_playlistlist.next=NULL;
while((patharray[index] != NULL) && (!config.stop)) { while((patharray[index] != NULL) && (!util_must_exit())) {
DPRINTF(E_DBG,L_SCAN,"Scanning for MP3s in %s\n",patharray[index]); DPRINTF(E_DBG,L_SCAN,"Scanning for MP3s in %s\n",patharray[index]);
err=scan_path(patharray[index]); err=scan_path(patharray[index]);
index++; index++;
} }
if(db_end_song_scan()) if(util_must_exit() || db_end_song_scan())
return -1; return -1;
if(!config.stop) { if(!util_must_exit()) {
DPRINTF(E_DBG,L_SCAN,"Processing playlists\n"); DPRINTF(E_DBG,L_SCAN,"Processing playlists\n");
scan_process_playlistlist(); scan_process_playlistlist();
} }
@ -335,7 +336,7 @@ int scan_path(char *path) {
is_compdir=scan_is_compdir(path); is_compdir=scan_is_compdir(path);
while(1) { while(1) {
if(config.stop) { if(util_must_exit()) {
DPRINTF(E_WARN,L_SCAN,"Stop req. Aborting scan of %s.\n",path); DPRINTF(E_WARN,L_SCAN,"Stop req. Aborting scan of %s.\n",path);
closedir(current_dir); closedir(current_dir);
free(extensions); free(extensions);