* Cache the last directory hit when filling playlists, to avoid unnecessary database queries with some libraries.

This commit is contained in:
Justin Maggard 2011-09-01 01:18:28 +00:00
parent 63869c9e17
commit 566e3263a8

View File

@ -89,7 +89,7 @@ fill_playlists()
{ {
int rows, i, found, len; int rows, i, found, len;
char **result; char **result;
char *plpath, *plname, *fname; char *plpath, *plname, *fname, *last_dir;
char class[] = "playlistContainer"; char class[] = "playlistContainer";
struct song_metadata plist; struct song_metadata plist;
struct stat file; struct stat file;
@ -111,6 +111,7 @@ fill_playlists()
plID = strtoll(result[i], NULL, 10); plID = strtoll(result[i], NULL, 10);
plname = result[++i]; plname = result[++i];
plpath = result[++i]; plpath = result[++i];
last_dir = NULL;
strncpy(type, strrchr(plpath, '.')+1, 4); strncpy(type, strrchr(plpath, '.')+1, 4);
@ -141,6 +142,18 @@ fill_playlists()
freetags(&plist); freetags(&plist);
continue; continue;
} }
if( last_dir )
{
fname = basename(plist.path);
detailID = sql_get_int_field(db, "SELECT ID from DETAILS where PATH = '%s/%s'", last_dir, fname);
if( detailID <= 0 )
{
sqlite3_free(last_dir);
last_dir = NULL;
}
else
goto found;
}
fname = plist.path; fname = plist.path;
DPRINTF(E_DEBUG, L_SCANNER, "%d: checking database for %s\n", plist.track, plist.path); DPRINTF(E_DEBUG, L_SCANNER, "%d: checking database for %s\n", plist.track, plist.path);
@ -164,6 +177,7 @@ retry:
detailID = sql_get_int_field(db, "SELECT ID from DETAILS where PATH like '%%%q'", fname); detailID = sql_get_int_field(db, "SELECT ID from DETAILS where PATH like '%%%q'", fname);
if( detailID > 0 ) if( detailID > 0 )
{ {
found:
DPRINTF(E_DEBUG, L_SCANNER, "+ %s found in db\n", fname); DPRINTF(E_DEBUG, L_SCANNER, "+ %s found in db\n", fname);
sql_exec(db, "INSERT into OBJECTS" sql_exec(db, "INSERT into OBJECTS"
" (OBJECT_ID, PARENT_ID, CLASS, DETAIL_ID, NAME, REF_ID) " " (OBJECT_ID, PARENT_ID, CLASS, DETAIL_ID, NAME, REF_ID) "
@ -173,6 +187,13 @@ retry:
MUSIC_PLIST_ID, plID, plist.track, MUSIC_PLIST_ID, plID, plist.track,
MUSIC_PLIST_ID, plID, MUSIC_PLIST_ID, plID,
detailID); detailID);
if( !last_dir )
{
last_dir = sql_get_text_field(db, "SELECT PATH from DETAILS where ID = %lld", detailID);
fname = strrchr(last_dir, '/');
if( fname )
*fname = '\0';
}
found++; found++;
} }
else else
@ -191,6 +212,11 @@ retry:
} }
freetags(&plist); freetags(&plist);
} }
if( last_dir )
{
sqlite3_free(last_dir);
last_dir = NULL;
}
sql_exec(db, "UPDATE PLAYLISTS set FOUND = %d where ID = %lld", found, plID); sql_exec(db, "UPDATE PLAYLISTS set FOUND = %d where ID = %lld", found, plID);
} }
sqlite3_free_table(result); sqlite3_free_table(result);