Commit 32b62ade authored by Warren Dukes's avatar Warren Dukes

incremental update can now recognize if you pass it a deleted path

git-svn-id: https://svn.musicpd.org/mpd/trunk@742 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 700093ad
...@@ -64,7 +64,6 @@ typedef List DirectoryList; ...@@ -64,7 +64,6 @@ typedef List DirectoryList;
typedef struct _Directory { typedef struct _Directory {
char * utf8name; char * utf8name;
DirectoryList * subDirectories; DirectoryList * subDirectories;
struct _Directory * parentDirectory;
SongList * songs; SongList * songs;
time_t mtime; /* modification time */ time_t mtime; /* modification time */
} Directory; } Directory;
...@@ -95,13 +94,19 @@ void deleteEmptyDirectoriesInDirectory(Directory * directory); ...@@ -95,13 +94,19 @@ void deleteEmptyDirectoriesInDirectory(Directory * directory);
void removeSongFromDirectory(Directory * directory, char * shortname); void removeSongFromDirectory(Directory * directory, char * shortname);
int addSubDirectoryToDirectory(Directory * directory, char * shortname, char * name); int addSubDirectoryToDirectory(Directory * directory, char * shortname,
char * name);
Directory * getDirectoryDetails(char * name, char ** shortname,
Directory ** parentDirectory);
Directory * getDirectory(char * name); Directory * getDirectory(char * name);
Song * getSongDetails(char * file, char ** shortnameRet, Song * getSongDetails(char * file, char ** shortnameRet,
Directory ** directoryRet); Directory ** directoryRet);
void updatePath(char * utf8path);
void clearUpdatePid() { void clearUpdatePid() {
directory_updatePid = 0; directory_updatePid = 0;
} }
...@@ -164,26 +169,9 @@ int updateInit(FILE * fp, List * pathList) { ...@@ -164,26 +169,9 @@ int updateInit(FILE * fp, List * pathList) {
if(pathList) { if(pathList) {
ListNode * node = pathList->firstNode; ListNode * node = pathList->firstNode;
Directory * directory;
Song * song;
char * shortname;
while(node) { while(node) {
if(NULL==(directory = getDirectory(node->key))) updatePath(node->key);
{
song = getSongDetails(node->key,
&shortname,&directory);
if(song && updateSongInfo(song)<0) {
removeSongFromDirectory(
directory,
shortname);
}
}
else {
if(updateDirectory(directory)<0) {
exit(EXIT_FAILURE);
}
}
node = node->nextNode; node = node->nextNode;
} }
} }
...@@ -216,14 +204,13 @@ int updateInit(FILE * fp, List * pathList) { ...@@ -216,14 +204,13 @@ int updateInit(FILE * fp, List * pathList) {
return 0; return 0;
} }
Directory * newDirectory(Directory * parentDirectory, char * dirname, time_t mtime) { Directory * newDirectory(char * dirname, time_t mtime) {
Directory * directory; Directory * directory;
directory = malloc(sizeof(Directory)); directory = malloc(sizeof(Directory));
if(dirname!=NULL) directory->utf8name = strdup(dirname); if(dirname!=NULL) directory->utf8name = strdup(dirname);
else directory->utf8name = NULL; else directory->utf8name = NULL;
directory->parentDirectory = parentDirectory;
directory->subDirectories = newDirectoryList(); directory->subDirectories = newDirectoryList();
directory->songs = newSongList(); directory->songs = newSongList();
if(mtime<0) isDir(dirname,&(directory->mtime)); if(mtime<0) isDir(dirname,&(directory->mtime));
...@@ -373,6 +360,30 @@ int removeDeletedFromDirectory(Directory * directory) { ...@@ -373,6 +360,30 @@ int removeDeletedFromDirectory(Directory * directory) {
return 0; return 0;
} }
void updatePath(char * utf8path) {
Directory * directory;
Directory * parentDirectory;
char * shortname;
/* if path is already in the DB */
if(NULL==(directory = getDirectoryDetails(utf8path,&shortname,
&parentDirectory)))
{
Song * song = getSongDetails(utf8path,&shortname,&directory);
if(song && updateSongInfo(song)<0) {
removeSongFromDirectory(directory,shortname);
}
}
else {
/* if updateDirectory fials, means we should delete it */
if(updateDirectory(directory)<0 && directory!=mp3rootDirectory)
{
deleteFromList(parentDirectory->subDirectories,
shortname);
}
}
}
int updateDirectory(Directory * directory) { int updateDirectory(Directory * directory) {
DIR * dir; DIR * dir;
char cwd[2]; char cwd[2];
...@@ -460,7 +471,7 @@ int exploreDirectory(Directory * directory) { ...@@ -460,7 +471,7 @@ int exploreDirectory(Directory * directory) {
int addSubDirectoryToDirectory(Directory * directory, char * shortname, int addSubDirectoryToDirectory(Directory * directory, char * shortname,
char * name) char * name)
{ {
Directory * subDirectory = newDirectory(directory,name,-1); Directory * subDirectory = newDirectory(name,-1);
insertInList(directory->subDirectories,shortname,subDirectory); insertInList(directory->subDirectories,shortname,subDirectory);
exploreDirectory(subDirectory); exploreDirectory(subDirectory);
...@@ -509,7 +520,9 @@ Directory * findSubDirectory(Directory * directory,char * name) { ...@@ -509,7 +520,9 @@ Directory * findSubDirectory(Directory * directory,char * name) {
return NULL; return NULL;
} }
Directory * getSubDirectory(Directory * directory,char * name) { Directory * getSubDirectory(Directory * directory, char * name,
char ** shortname, Directory ** parentDirectory)
{
Directory * subDirectory; Directory * subDirectory;
int len; int len;
...@@ -519,15 +532,32 @@ Directory * getSubDirectory(Directory * directory,char * name) { ...@@ -519,15 +532,32 @@ Directory * getSubDirectory(Directory * directory,char * name) {
if((subDirectory = findSubDirectory(directory,name))==NULL) return NULL; if((subDirectory = findSubDirectory(directory,name))==NULL) return NULL;
*shortname = name;
*parentDirectory = directory;
len = 0; len = 0;
while(name[len]!='/' && name[len]!='\0') len++; while(name[len]!='/' && name[len]!='\0') len++;
while(name[len]=='/') len++; while(name[len]=='/') len++;
return getSubDirectory(subDirectory,&(name[len])); return getSubDirectory(subDirectory,&(name[len]),shortname,
parentDirectory);
}
Directory * getDirectoryDetails(char * name, char ** shortname,
Directory ** parentDirectory)
{
*shortname = NULL;
*parentDirectory = NULL;
return getSubDirectory(mp3rootDirectory,name,shortname,parentDirectory);
} }
Directory * getDirectory(char * name) { Directory * getDirectory(char * name) {
return getSubDirectory(mp3rootDirectory,name); char * shortname;
Directory * parentDirectory;
return getSubDirectory(mp3rootDirectory,name,&shortname,
&parentDirectory);
} }
int printDirectoryList(FILE * fp, DirectoryList * directoryList) { int printDirectoryList(FILE * fp, DirectoryList * directoryList) {
...@@ -623,8 +653,7 @@ void readDirectoryInfo(FILE * fp,Directory * directory) { ...@@ -623,8 +653,7 @@ void readDirectoryInfo(FILE * fp,Directory * directory) {
} }
if(NULL==nextDirNode) { if(NULL==nextDirNode) {
subDirectory = newDirectory(directory,name, subDirectory = newDirectory(name,mtime);
mtime);
insertInList(directory->subDirectories,key, insertInList(directory->subDirectories,key,
(void *)subDirectory); (void *)subDirectory);
} }
...@@ -634,8 +663,7 @@ void readDirectoryInfo(FILE * fp,Directory * directory) { ...@@ -634,8 +663,7 @@ void readDirectoryInfo(FILE * fp,Directory * directory) {
nextDirNode = nextDirNode->nextNode; nextDirNode = nextDirNode->nextNode;
} }
else { else {
subDirectory = newDirectory(directory,name, subDirectory = newDirectory(name,mtime);
mtime);
insertInListBeforeNode( insertInListBeforeNode(
directory->subDirectories, directory->subDirectories,
nextDirNode, nextDirNode,
...@@ -704,7 +732,7 @@ int writeDirectoryDB() { ...@@ -704,7 +732,7 @@ int writeDirectoryDB() {
int readDirectoryDB() { int readDirectoryDB() {
FILE * fp; FILE * fp;
if(!mp3rootDirectory) mp3rootDirectory = newDirectory(NULL,NULL,0); if(!mp3rootDirectory) mp3rootDirectory = newDirectory(NULL,0);
while(!(fp=fopen(directorydb,"r")) && errno==EINTR); while(!(fp=fopen(directorydb,"r")) && errno==EINTR);
if(!fp) return -1; if(!fp) return -1;
...@@ -1019,7 +1047,7 @@ unsigned long sumSongTimesIn(FILE * fp, char * name) { ...@@ -1019,7 +1047,7 @@ unsigned long sumSongTimesIn(FILE * fp, char * name) {
} }
void initMp3Directory() { void initMp3Directory() {
mp3rootDirectory = newDirectory(NULL,NULL,0); mp3rootDirectory = newDirectory(NULL,0);
exploreDirectory(mp3rootDirectory); exploreDirectory(mp3rootDirectory);
} }
...@@ -1047,7 +1075,7 @@ Song * getSongDetails(char * file, char ** shortnameRet, ...@@ -1047,7 +1075,7 @@ Song * getSongDetails(char * file, char ** shortnameRet,
dir = dup; dir = dup;
} }
if(!(directory = getSubDirectory(mp3rootDirectory,dir))) { if(!(directory = getDirectory(dir))) {
free(dup); free(dup);
return NULL; return NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment