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
This commit is contained in:
		| @@ -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); | |||||||
|  |  | ||||||
| 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) { | |||||||
|  |  | ||||||
| 		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) { | |||||||
| 	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) { | |||||||
| 	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) { | |||||||
| 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) { | |||||||
| 	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) { | |||||||
|  |  | ||||||
| 	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) { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			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) { | |||||||
| 				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() { | |||||||
| 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) { | |||||||
| } | } | ||||||
|  |  | ||||||
| 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, | |||||||
| 		dir = dup; | 		dir = dup; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if(!(directory = getSubDirectory(mp3rootDirectory,dir))) { | 	if(!(directory = getDirectory(dir))) { | ||||||
| 		free(dup); | 		free(dup); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Warren Dukes
					Warren Dukes