diff options
author | Eric Wong <normalperson@yhbt.net> | 2008-10-06 18:20:53 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-10-06 18:20:53 +0200 |
commit | 19a4803bc926efa8c61f0e1b47cc8eb76d10bc96 (patch) | |
tree | 5fb3b1e4f7fd458d8b17f1a10e2d965195989e92 | |
parent | 6aec61637ba2c148e626f7e8aa5019313d1fcf8f (diff) | |
download | mpd-19a4803bc926efa8c61f0e1b47cc8eb76d10bc96.tar.gz mpd-19a4803bc926efa8c61f0e1b47cc8eb76d10bc96.tar.xz mpd-19a4803bc926efa8c61f0e1b47cc8eb76d10bc96.zip |
directory: streamline deletes
Instead of relying on the shortname, just pass the song pointer
to prevent redundant lookups during deletes.
Diffstat (limited to '')
-rw-r--r-- | src/directory.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/src/directory.c b/src/directory.c index 9595b1ff2..82ee0854d 100644 --- a/src/directory.c +++ b/src/directory.c @@ -72,8 +72,7 @@ static enum update_return updateDirectory(Directory * directory); static void deleteEmptyDirectoriesInDirectory(Directory * directory); -static void removeSongFromDirectory(Directory * directory, - const char *shortname); +static void delete_song(Directory *dir, Song *del); static enum update_return addSubDirectoryToDirectory(Directory * directory, const char *name, struct stat *st); @@ -201,16 +200,12 @@ static void freeDirectory(Directory * directory) /*getDirectoryPath(NULL); */ } -static void removeSongFromDirectory(Directory * directory, const char *shortname) +static void delete_song(Directory *dir, Song *del) { - Song *song = songvec_find(&directory->songs, shortname); - - if (song) { - char path_max_tmp[MPD_PATH_MAX]; /* wasteful */ - LOG("removing: %s\n", get_song_url(path_max_tmp, song)); - songvec_delete(&directory->songs, song); - freeSong(song); - } + char path_max_tmp[MPD_PATH_MAX]; /* wasteful */ + LOG("removing: %s\n", get_song_url(path_max_tmp, del)); + songvec_delete(&dir->songs, del); + freeSong(del); /* FIXME racy */ } static void deleteEmptyDirectoriesInDirectory(Directory * directory) @@ -245,7 +240,7 @@ updateInDirectory(Directory * directory, const char *name) } else if (st.st_mtime != song->mtime) { LOG("updating %s\n", name); if (updateSongInfo(song) < 0) - removeSongFromDirectory(directory, shortname); + delete_song(directory, song); return UPDATE_RETURN_UPDATED; } } else if (S_ISDIR(st.st_mode)) { @@ -297,7 +292,7 @@ removeDeletedFromDirectory(char *path_max_tmp, Directory * directory) strcpy(path_max_tmp, song->url); if (!isFile(path_max_tmp, NULL)) { - removeSongFromDirectory(directory, song->url); + delete_song(directory, song); ret = UPDATE_RETURN_UPDATED; } } @@ -311,6 +306,7 @@ static Directory *addDirectoryPathToDB(const char *utf8path) char *parent; Directory *parentDirectory; Directory *directory; + Song *conflicting; parent = parent_path(path_max_tmp, utf8path); @@ -337,7 +333,10 @@ static Directory *addDirectoryPathToDB(const char *utf8path) /* if we're adding directory paths, make sure to delete filenames with potentially the same name */ - removeSongFromDirectory(parentDirectory, mpd_basename(directory->path)); + conflicting = songvec_find(&parentDirectory->songs, + mpd_basename(directory->path)); + if (conflicting) + delete_song(parentDirectory, conflicting); return directory; } @@ -415,14 +414,13 @@ static enum update_return updatePath(const char *utf8path) else if (updateSongInfo(song) == 0) return UPDATE_RETURN_UPDATED; else { - removeSongFromDirectory(parentDirectory, - song->url); + delete_song(parentDirectory, song); return UPDATE_RETURN_UPDATED; } } /* if updateDirectory fails, means we should delete it */ else { - removeSongFromDirectory(parentDirectory, song->url); + delete_song(parentDirectory, song); ret = UPDATE_RETURN_UPDATED; /* don't return, path maybe a directory now */ } |