From 729523ec80f35a683c982054628cd47d2161d3d4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:07:35 +0200 Subject: directory: moved code to database.c Taming the directory.c monster, part II: move the database management stuff to database. directory.c should only contain code which works on directory objects. --- src/database.c | 321 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100644 src/database.c (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c new file mode 100644 index 000000000..b4c73db69 --- /dev/null +++ b/src/database.c @@ -0,0 +1,321 @@ +/* the Music Player Daemon (MPD) + * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) + * Copyright (C) 2008 Max Kellermann + * This project's homepage is: http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "database.h" +#include "directory.h" +#include "song.h" +#include "conf.h" +#include "log.h" +#include "ls.h" +#include "path.h" +#include "stats.h" +#include "utils.h" +#include "dbUtils.h" +#include "update.h" +#include "os_compat.h" +#include "myfprintf.h" + +static struct directory *music_root; + +static time_t directory_dbModTime; + +void directory_init(void) +{ + music_root = newDirectory(NULL, NULL); + updateDirectory(music_root); + stats.numberOfSongs = countSongsIn(NULL); + stats.dbPlayTime = sumSongTimesIn(NULL); +} + +void directory_finish(void) +{ + freeDirectory(music_root); +} + +struct directory * directory_get_root(void) +{ + assert(music_root != NULL); + + return music_root; +} + +struct directory * getDirectory(const char *name) +{ + if (name == NULL) + return music_root; + + return getSubDirectory(music_root, name); +} + +struct mpd_song *getSongFromDB(const char *file) +{ + struct mpd_song *song = NULL; + struct directory *directory; + char *dir = NULL; + char *duplicated = xstrdup(file); + char *shortname = strrchr(duplicated, '/'); + + DEBUG("get song: %s\n", file); + + if (!shortname) { + shortname = duplicated; + } else { + *shortname = '\0'; + ++shortname; + dir = duplicated; + } + + if (!(directory = getDirectory(dir))) + goto out; + if (!(song = songvec_find(&directory->songs, shortname))) + goto out; + assert(song->parent == directory); + +out: + free(duplicated); + return song; +} + +int traverseAllIn(const char *name, + int (*forEachSong) (struct mpd_song *, void *), + int (*forEachDir) (struct directory *, void *), void *data) +{ + struct directory *directory; + + if ((directory = getDirectory(name)) == NULL) { + struct mpd_song *song; + if ((song = getSongFromDB(name)) && forEachSong) { + return forEachSong(song, data); + } + return -1; + } + + return traverseAllInSubDirectory(directory, forEachSong, forEachDir, + data); +} + +int printDirectoryInfo(int fd, const char *name) +{ + struct directory *directory; + + if ((directory = getDirectory(name)) == NULL) + return -1; + return directory_print(fd, directory); +} + +static char *getDbFile(void) +{ + ConfigParam *param = parseConfigFilePath(CONF_DB_FILE, 1); + + assert(param); + assert(param->value); + + return param->value; +} + +int checkDirectoryDB(void) +{ + struct stat st; + char *dbFile = getDbFile(); + + /* Check if the file exists */ + if (access(dbFile, F_OK)) { + /* If the file doesn't exist, we can't check if we can write + * it, so we are going to try to get the directory path, and + * see if we can write a file in that */ + char dirPath[MPD_PATH_MAX]; + parent_path(dirPath, dbFile); + if (*dirPath == '\0') + strcpy(dirPath, "/"); + + /* Check that the parent part of the path is a directory */ + if (stat(dirPath, &st) < 0) { + ERROR("Couldn't stat parent directory of db file " + "\"%s\": %s\n", dbFile, strerror(errno)); + return -1; + } + + if (!S_ISDIR(st.st_mode)) { + ERROR("Couldn't create db file \"%s\" because the " + "parent path is not a directory\n", dbFile); + return -1; + } + + /* Check if we can write to the directory */ + if (access(dirPath, R_OK | W_OK)) { + ERROR("Can't create db file in \"%s\": %s\n", dirPath, + strerror(errno)); + return -1; + } + + return 0; + } + + /* Path exists, now check if it's a regular file */ + if (stat(dbFile, &st) < 0) { + ERROR("Couldn't stat db file \"%s\": %s\n", dbFile, + strerror(errno)); + return -1; + } + + if (!S_ISREG(st.st_mode)) { + ERROR("db file \"%s\" is not a regular file\n", dbFile); + return -1; + } + + /* And check that we can write to it */ + if (access(dbFile, R_OK | W_OK)) { + ERROR("Can't open db file \"%s\" for reading/writing: %s\n", + dbFile, strerror(errno)); + return -1; + } + + return 0; +} + +int writeDirectoryDB(void) +{ + int fd; + char *dbFile = getDbFile(); + struct stat st; + + DEBUG("removing empty directories from DB\n"); + deleteEmptyDirectoriesInDirectory(music_root); + + DEBUG("sorting DB\n"); + + sortDirectory(music_root); + + DEBUG("writing DB\n"); + + fd = open(dbFile, O_WRONLY|O_TRUNC|O_CREAT, 0666); + if (fd < 0) { + ERROR("unable to write to db file \"%s\": %s\n", + dbFile, strerror(errno)); + return -1; + } + + /* + * TODO: block signals when writing the db so we don't get a corrupted + * db (or unexpected failures). fdprintf() needs better error handling + */ + fdprintf(fd, + DIRECTORY_INFO_BEGIN "\n" + DIRECTORY_MPD_VERSION VERSION "\n" + DIRECTORY_FS_CHARSET "%s\n" + DIRECTORY_INFO_END "\n", getFsCharset()); + + if (writeDirectoryInfo(fd, music_root) < 0) { + ERROR("Failed to write to database file: %s\n", + strerror(errno)); + xclose(fd); + return -1; + } + xclose(fd); + + if (stat(dbFile, &st) == 0) + directory_dbModTime = st.st_mtime; + + return 0; +} + +int readDirectoryDB(void) +{ + FILE *fp = NULL; + char *dbFile = getDbFile(); + struct stat st; + + if (!music_root) + music_root = newDirectory(NULL, NULL); + while (!(fp = fopen(dbFile, "r")) && errno == EINTR) ; + if (fp == NULL) { + ERROR("unable to open db file \"%s\": %s\n", + dbFile, strerror(errno)); + return -1; + } + + /* get initial info */ + { + char buffer[100]; + int bufferSize = 100; + int foundFsCharset = 0; + int foundVersion = 0; + + if (!myFgets(buffer, bufferSize, fp)) + FATAL("Error reading db, fgets\n"); + if (0 == strcmp(DIRECTORY_INFO_BEGIN, buffer)) { + while (myFgets(buffer, bufferSize, fp) && + 0 != strcmp(DIRECTORY_INFO_END, buffer)) { + if (!prefixcmp(buffer, DIRECTORY_MPD_VERSION)) + { + if (foundVersion) + FATAL("already found version in db\n"); + foundVersion = 1; + } else if (!prefixcmp(buffer, + DIRECTORY_FS_CHARSET)) { + char *fsCharset; + char *tempCharset; + + if (foundFsCharset) + FATAL("already found fs charset in db\n"); + + foundFsCharset = 1; + + fsCharset = &(buffer[strlen(DIRECTORY_FS_CHARSET)]); + if ((tempCharset = getConfigParamValue(CONF_FS_CHARSET)) + && strcmp(fsCharset, tempCharset)) { + WARNING("Using \"%s\" for the " + "filesystem charset " + "instead of \"%s\"\n", + fsCharset, tempCharset); + WARNING("maybe you need to " + "recreate the db?\n"); + setFsCharset(fsCharset); + } + } else { + FATAL("directory: unknown line in db info: %s\n", + buffer); + } + } + } else { + ERROR("db info not found in db file\n"); + ERROR("you should recreate the db using --create-db\n"); + while (fclose(fp) && errno == EINTR) ; + return -1; + } + } + + DEBUG("reading DB\n"); + + readDirectoryInfo(fp, music_root); + while (fclose(fp) && errno == EINTR) ; + + stats.numberOfSongs = countSongsIn(NULL); + stats.dbPlayTime = sumSongTimesIn(NULL); + + if (stat(dbFile, &st) == 0) + directory_dbModTime = st.st_mtime; + + return 0; +} + +time_t getDbModTime(void) +{ + return directory_dbModTime; +} -- cgit v1.2.3 From 0576b8abf8b2fd25105f6e0190a93ddec298e9fb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:07:39 +0200 Subject: database: removed printDirectoryInfo() The same can be achieved with directory_print(db_get_directory()). --- src/database.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index b4c73db69..c0c03f3e4 100644 --- a/src/database.c +++ b/src/database.c @@ -110,15 +110,6 @@ int traverseAllIn(const char *name, data); } -int printDirectoryInfo(int fd, const char *name) -{ - struct directory *directory; - - if ((directory = getDirectory(name)) == NULL) - return -1; - return directory_print(fd, directory); -} - static char *getDbFile(void) { ConfigParam *param = parseConfigFilePath(CONF_DB_FILE, 1); -- cgit v1.2.3 From 4629f646077109f7c6185aab92560da52c237412 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:07:55 +0200 Subject: database: renamed functions, "db_" prefix and no CamelCase Yet another CamelCase removal patch. --- src/database.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index c0c03f3e4..bb6cfcd52 100644 --- a/src/database.c +++ b/src/database.c @@ -35,7 +35,7 @@ static struct directory *music_root; static time_t directory_dbModTime; -void directory_init(void) +void db_init(void) { music_root = newDirectory(NULL, NULL); updateDirectory(music_root); @@ -43,19 +43,19 @@ void directory_init(void) stats.dbPlayTime = sumSongTimesIn(NULL); } -void directory_finish(void) +void db_finish(void) { freeDirectory(music_root); } -struct directory * directory_get_root(void) +struct directory * db_get_root(void) { assert(music_root != NULL); return music_root; } -struct directory * getDirectory(const char *name) +struct directory * db_get_directory(const char *name) { if (name == NULL) return music_root; @@ -63,7 +63,7 @@ struct directory * getDirectory(const char *name) return getSubDirectory(music_root, name); } -struct mpd_song *getSongFromDB(const char *file) +struct mpd_song *db_get_song(const char *file) { struct mpd_song *song = NULL; struct directory *directory; @@ -81,7 +81,7 @@ struct mpd_song *getSongFromDB(const char *file) dir = duplicated; } - if (!(directory = getDirectory(dir))) + if (!(directory = db_get_directory(dir))) goto out; if (!(song = songvec_find(&directory->songs, shortname))) goto out; @@ -92,15 +92,15 @@ out: return song; } -int traverseAllIn(const char *name, +int db_walk(const char *name, int (*forEachSong) (struct mpd_song *, void *), int (*forEachDir) (struct directory *, void *), void *data) { struct directory *directory; - if ((directory = getDirectory(name)) == NULL) { + if ((directory = db_get_directory(name)) == NULL) { struct mpd_song *song; - if ((song = getSongFromDB(name)) && forEachSong) { + if ((song = db_get_song(name)) && forEachSong) { return forEachSong(song, data); } return -1; @@ -110,7 +110,7 @@ int traverseAllIn(const char *name, data); } -static char *getDbFile(void) +static char *db_get_file(void) { ConfigParam *param = parseConfigFilePath(CONF_DB_FILE, 1); @@ -120,10 +120,10 @@ static char *getDbFile(void) return param->value; } -int checkDirectoryDB(void) +int db_check(void) { struct stat st; - char *dbFile = getDbFile(); + char *dbFile = db_get_file(); /* Check if the file exists */ if (access(dbFile, F_OK)) { @@ -180,10 +180,10 @@ int checkDirectoryDB(void) return 0; } -int writeDirectoryDB(void) +int db_save(void) { int fd; - char *dbFile = getDbFile(); + char *dbFile = db_get_file(); struct stat st; DEBUG("removing empty directories from DB\n"); @@ -226,10 +226,10 @@ int writeDirectoryDB(void) return 0; } -int readDirectoryDB(void) +int db_load(void) { FILE *fp = NULL; - char *dbFile = getDbFile(); + char *dbFile = db_get_file(); struct stat st; if (!music_root) @@ -306,7 +306,7 @@ int readDirectoryDB(void) return 0; } -time_t getDbModTime(void) +time_t db_get_mtime(void) { return directory_dbModTime; } -- cgit v1.2.3 From a76121ea81f452c0d5e21d6a2fb6f200a80faf7b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:07:58 +0200 Subject: directory: eliminate CamelCase CamelCase is ugly, rename the functions. [ew: "directory_get_directory" was too confusing, using "directory_get_subdir" instead (old function was named "getSubDirectory")] --- src/database.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index bb6cfcd52..98e50ad87 100644 --- a/src/database.c +++ b/src/database.c @@ -37,7 +37,7 @@ static time_t directory_dbModTime; void db_init(void) { - music_root = newDirectory(NULL, NULL); + music_root = directory_new(NULL, NULL); updateDirectory(music_root); stats.numberOfSongs = countSongsIn(NULL); stats.dbPlayTime = sumSongTimesIn(NULL); @@ -45,7 +45,7 @@ void db_init(void) void db_finish(void) { - freeDirectory(music_root); + directory_free(music_root); } struct directory * db_get_root(void) @@ -60,7 +60,7 @@ struct directory * db_get_directory(const char *name) if (name == NULL) return music_root; - return getSubDirectory(music_root, name); + return directory_get_subdir(music_root, name); } struct mpd_song *db_get_song(const char *file) @@ -106,7 +106,7 @@ int db_walk(const char *name, return -1; } - return traverseAllInSubDirectory(directory, forEachSong, forEachDir, + return directory_walk(directory, forEachSong, forEachDir, data); } @@ -187,11 +187,11 @@ int db_save(void) struct stat st; DEBUG("removing empty directories from DB\n"); - deleteEmptyDirectoriesInDirectory(music_root); + directory_prune_empty(music_root); DEBUG("sorting DB\n"); - sortDirectory(music_root); + directory_sort(music_root); DEBUG("writing DB\n"); @@ -212,7 +212,7 @@ int db_save(void) DIRECTORY_FS_CHARSET "%s\n" DIRECTORY_INFO_END "\n", getFsCharset()); - if (writeDirectoryInfo(fd, music_root) < 0) { + if (directory_save(fd, music_root) < 0) { ERROR("Failed to write to database file: %s\n", strerror(errno)); xclose(fd); @@ -233,7 +233,7 @@ int db_load(void) struct stat st; if (!music_root) - music_root = newDirectory(NULL, NULL); + music_root = directory_new(NULL, NULL); while (!(fp = fopen(dbFile, "r")) && errno == EINTR) ; if (fp == NULL) { ERROR("unable to open db file \"%s\": %s\n", @@ -294,7 +294,7 @@ int db_load(void) DEBUG("reading DB\n"); - readDirectoryInfo(fp, music_root); + directory_load(fp, music_root); while (fclose(fp) && errno == EINTR) ; stats.numberOfSongs = countSongsIn(NULL); -- cgit v1.2.3 From 313e8e3ecc15e65700e64252207227612d6d9195 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:08:16 +0200 Subject: directory: path must not be NULL For the root directory, let's set path to an empty string. This saves a few checks. --- src/database.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index 98e50ad87..bd278a635 100644 --- a/src/database.c +++ b/src/database.c @@ -37,7 +37,7 @@ static time_t directory_dbModTime; void db_init(void) { - music_root = directory_new(NULL, NULL); + music_root = directory_new("", NULL); updateDirectory(music_root); stats.numberOfSongs = countSongsIn(NULL); stats.dbPlayTime = sumSongTimesIn(NULL); @@ -233,7 +233,7 @@ int db_load(void) struct stat st; if (!music_root) - music_root = directory_new(NULL, NULL); + music_root = directory_new("", NULL); while (!(fp = fopen(dbFile, "r")) && errno == EINTR) ; if (fp == NULL) { ERROR("unable to open db file \"%s\": %s\n", -- cgit v1.2.3 From 064e2b83d8fb694813d451d667709dc1b33c2431 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 15:21:18 +0200 Subject: database: simplify db_load() Removed a superfluous closure. --- src/database.c | 89 +++++++++++++++++++++++++++------------------------------- 1 file changed, 42 insertions(+), 47 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index bd278a635..0fc340c3b 100644 --- a/src/database.c +++ b/src/database.c @@ -231,6 +231,10 @@ int db_load(void) FILE *fp = NULL; char *dbFile = db_get_file(); struct stat st; + char buffer[100]; + int bufferSize = 100; + int foundFsCharset = 0; + int foundVersion = 0; if (!music_root) music_root = directory_new("", NULL); @@ -242,54 +246,45 @@ int db_load(void) } /* get initial info */ - { - char buffer[100]; - int bufferSize = 100; - int foundFsCharset = 0; - int foundVersion = 0; - - if (!myFgets(buffer, bufferSize, fp)) - FATAL("Error reading db, fgets\n"); - if (0 == strcmp(DIRECTORY_INFO_BEGIN, buffer)) { - while (myFgets(buffer, bufferSize, fp) && - 0 != strcmp(DIRECTORY_INFO_END, buffer)) { - if (!prefixcmp(buffer, DIRECTORY_MPD_VERSION)) - { - if (foundVersion) - FATAL("already found version in db\n"); - foundVersion = 1; - } else if (!prefixcmp(buffer, - DIRECTORY_FS_CHARSET)) { - char *fsCharset; - char *tempCharset; - - if (foundFsCharset) - FATAL("already found fs charset in db\n"); - - foundFsCharset = 1; - - fsCharset = &(buffer[strlen(DIRECTORY_FS_CHARSET)]); - if ((tempCharset = getConfigParamValue(CONF_FS_CHARSET)) - && strcmp(fsCharset, tempCharset)) { - WARNING("Using \"%s\" for the " - "filesystem charset " - "instead of \"%s\"\n", - fsCharset, tempCharset); - WARNING("maybe you need to " - "recreate the db?\n"); - setFsCharset(fsCharset); - } - } else { - FATAL("directory: unknown line in db info: %s\n", - buffer); - } + if (!myFgets(buffer, bufferSize, fp)) + FATAL("Error reading db, fgets\n"); + + if (0 != strcmp(DIRECTORY_INFO_BEGIN, buffer)) { + ERROR("db info not found in db file\n"); + ERROR("you should recreate the db using --create-db\n"); + while (fclose(fp) && errno == EINTR) ; + return -1; + } + + while (myFgets(buffer, bufferSize, fp) && + 0 != strcmp(DIRECTORY_INFO_END, buffer)) { + if (!prefixcmp(buffer, DIRECTORY_MPD_VERSION)) { + if (foundVersion) + FATAL("already found version in db\n"); + foundVersion = 1; + } else if (!prefixcmp(buffer, DIRECTORY_FS_CHARSET)) { + char *fsCharset; + char *tempCharset; + + if (foundFsCharset) + FATAL("already found fs charset in db\n"); + + foundFsCharset = 1; + + fsCharset = &(buffer[strlen(DIRECTORY_FS_CHARSET)]); + if ((tempCharset = getConfigParamValue(CONF_FS_CHARSET)) + && strcmp(fsCharset, tempCharset)) { + WARNING("Using \"%s\" for the " + "filesystem charset " + "instead of \"%s\"\n", + fsCharset, tempCharset); + WARNING("maybe you need to " + "recreate the db?\n"); + setFsCharset(fsCharset); } - } else { - ERROR("db info not found in db file\n"); - ERROR("you should recreate the db using --create-db\n"); - while (fclose(fp) && errno == EINTR) ; - return -1; - } + } else + FATAL("directory: unknown line in db info: %s\n", + buffer); } DEBUG("reading DB\n"); -- cgit v1.2.3 From d296861ea05101450b3f3147f6cfcd134486a384 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 15:21:23 +0200 Subject: database: removed local variable bufferSize Use sizeof(buffer) instead. --- src/database.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index 0fc340c3b..6ed7a445d 100644 --- a/src/database.c +++ b/src/database.c @@ -232,7 +232,6 @@ int db_load(void) char *dbFile = db_get_file(); struct stat st; char buffer[100]; - int bufferSize = 100; int foundFsCharset = 0; int foundVersion = 0; @@ -246,7 +245,7 @@ int db_load(void) } /* get initial info */ - if (!myFgets(buffer, bufferSize, fp)) + if (!myFgets(buffer, sizeof(buffer), fp)) FATAL("Error reading db, fgets\n"); if (0 != strcmp(DIRECTORY_INFO_BEGIN, buffer)) { @@ -256,7 +255,7 @@ int db_load(void) return -1; } - while (myFgets(buffer, bufferSize, fp) && + while (myFgets(buffer, sizeof(buffer), fp) && 0 != strcmp(DIRECTORY_INFO_END, buffer)) { if (!prefixcmp(buffer, DIRECTORY_MPD_VERSION)) { if (foundVersion) -- cgit v1.2.3 From a24d3738e35d509aa180fffa127abac8057101cf Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 15:23:37 +0200 Subject: diretory: moved code to directory_save.c, directory_print.c Remove clutter from directory.c. Everything which saves or loads to/from the hard disk goes to directory_save.c, and code which sends directory information to the client is moved into directory_print.c. --- src/database.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index 6ed7a445d..11de15bcc 100644 --- a/src/database.c +++ b/src/database.c @@ -19,6 +19,7 @@ #include "database.h" #include "directory.h" +#include "directory_save.h" #include "song.h" #include "conf.h" #include "log.h" -- cgit v1.2.3 From 6fd08bc8fad5d6c4be37ce751d53ef80b756b292 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 19:11:54 +0200 Subject: update: don't export updateDirectory() If the user requests database update during startup, call directory_update_init(). This should be changed to fully asynchronous update later. For this to work, main_notify has to be initialized before db_init(). --- src/database.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index 11de15bcc..3a1667bb6 100644 --- a/src/database.c +++ b/src/database.c @@ -39,7 +39,15 @@ static time_t directory_dbModTime; void db_init(void) { music_root = directory_new("", NULL); - updateDirectory(music_root); + + if (directory_update_init(NULL) < 0) + FATAL("directory update failed\n"); + + do { + my_usleep(100000); + reap_update_task(); + } while (isUpdatingDB()); + stats.numberOfSongs = countSongsIn(NULL); stats.dbPlayTime = sumSongTimesIn(NULL); } -- cgit v1.2.3 From 1d59716731f3ed8569d60ae84c291bd93eb7d582 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 19:17:44 +0200 Subject: update: job ID must be positive The documentation for directory_update_init() was incorrect: a job ID must be positive, not non-negative. If the update queue is full and no job was created, it makes more sense to return 0 instead of -1, because it is more consistent with the return value of isUpdatingDB(). --- src/database.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index 3a1667bb6..ea78940f8 100644 --- a/src/database.c +++ b/src/database.c @@ -40,7 +40,7 @@ void db_init(void) { music_root = directory_new("", NULL); - if (directory_update_init(NULL) < 0) + if (!directory_update_init(NULL)) FATAL("directory update failed\n"); do { -- cgit v1.2.3 From 6e2b0ca9edaed200f250ef487701ad161aa4a168 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 11 Oct 2008 19:49:14 -0700 Subject: directory: don't use identical struct and variable names Duplicated tokens in close proximity takes too long for my head to parse; and "dir" is an easy and common abbreviation for "directory". --- src/database.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/database.c') diff --git a/src/database.c b/src/database.c index ea78940f8..dde57ce6a 100644 --- a/src/database.c +++ b/src/database.c @@ -75,8 +75,8 @@ struct directory * db_get_directory(const char *name) struct mpd_song *db_get_song(const char *file) { struct mpd_song *song = NULL; - struct directory *directory; - char *dir = NULL; + struct directory *dir; + char *dirpath = NULL; char *duplicated = xstrdup(file); char *shortname = strrchr(duplicated, '/'); @@ -87,14 +87,14 @@ struct mpd_song *db_get_song(const char *file) } else { *shortname = '\0'; ++shortname; - dir = duplicated; + dirpath = duplicated; } - if (!(directory = db_get_directory(dir))) + if (!(dir = db_get_directory(dirpath))) goto out; - if (!(song = songvec_find(&directory->songs, shortname))) + if (!(song = songvec_find(&dir->songs, shortname))) goto out; - assert(song->parent == directory); + assert(song->parent == dir); out: free(duplicated); @@ -105,9 +105,9 @@ int db_walk(const char *name, int (*forEachSong) (struct mpd_song *, void *), int (*forEachDir) (struct directory *, void *), void *data) { - struct directory *directory; + struct directory *dir; - if ((directory = db_get_directory(name)) == NULL) { + if ((dir = db_get_directory(name)) == NULL) { struct mpd_song *song; if ((song = db_get_song(name)) && forEachSong) { return forEachSong(song, data); @@ -115,8 +115,7 @@ int db_walk(const char *name, return -1; } - return directory_walk(directory, forEachSong, forEachDir, - data); + return directory_walk(dir, forEachSong, forEachDir, data); } static char *db_get_file(void) -- cgit v1.2.3