database: pass database file name to db_init()

Don't include conf.h in database.c.
This commit is contained in:
Max Kellermann 2009-01-18 16:09:01 +01:00
parent 004dfddca3
commit c2cc3b4923
3 changed files with 45 additions and 40 deletions

View File

@ -21,7 +21,6 @@
#include "directory.h"
#include "directory_save.h"
#include "song.h"
#include "conf.h"
#include "path.h"
#include "stats.h"
#include "config.h"
@ -39,13 +38,17 @@
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "database"
static char *database_path;
static struct directory *music_root;
static time_t directory_dbModTime;
void
db_init(void)
db_init(const char *path)
{
database_path = g_strdup(path);
music_root = directory_new("", NULL);
}
@ -53,6 +56,15 @@ void
db_finish(void)
{
directory_free(music_root);
g_free(database_path);
}
void
db_clear(void)
{
directory_free(music_root);
music_root = directory_new("", NULL);
}
struct directory *
@ -120,42 +132,32 @@ db_walk(const char *name,
return directory_walk(directory, forEachSong, forEachDir, data);
}
static char *
db_get_file(void)
{
struct config_param *param = parseConfigFilePath(CONF_DB_FILE, 1);
assert(param);
assert(param->value);
return param->value;
}
bool
db_check(void)
{
struct stat st;
char *dbFile = db_get_file();
assert(database_path != NULL);
/* Check if the file exists */
if (access(dbFile, F_OK)) {
if (access(database_path, 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 = g_path_get_dirname(dbFile);
char *dirPath = g_path_get_dirname(database_path);
/* Check that the parent part of the path is a directory */
if (stat(dirPath, &st) < 0) {
g_free(dirPath);
g_warning("Couldn't stat parent directory of db file "
"\"%s\": %s", dbFile, strerror(errno));
"\"%s\": %s", database_path, strerror(errno));
return false;
}
if (!S_ISDIR(st.st_mode)) {
g_free(dirPath);
g_warning("Couldn't create db file \"%s\" because the "
"parent path is not a directory", dbFile);
"parent path is not a directory", database_path);
return false;
}
@ -173,21 +175,21 @@ db_check(void)
}
/* Path exists, now check if it's a regular file */
if (stat(dbFile, &st) < 0) {
if (stat(database_path, &st) < 0) {
g_warning("Couldn't stat db file \"%s\": %s",
dbFile, strerror(errno));
database_path, strerror(errno));
return false;
}
if (!S_ISREG(st.st_mode)) {
g_warning("db file \"%s\" is not a regular file", dbFile);
g_warning("db file \"%s\" is not a regular file", database_path);
return false;
}
/* And check that we can write to it */
if (access(dbFile, R_OK | W_OK)) {
if (access(database_path, R_OK | W_OK)) {
g_warning("Can't open db file \"%s\" for reading/writing: %s",
dbFile, strerror(errno));
database_path, strerror(errno));
return false;
}
@ -198,9 +200,11 @@ bool
db_save(void)
{
FILE *fp;
char *dbFile = db_get_file();
struct stat st;
assert(database_path != NULL);
assert(music_root != NULL);
g_debug("removing empty directories from DB");
directory_prune_empty(music_root);
@ -210,10 +214,10 @@ db_save(void)
g_debug("writing DB");
fp = fopen(dbFile, "w");
fp = fopen(database_path, "w");
if (!fp) {
g_warning("unable to write to db file \"%s\": %s",
dbFile, strerror(errno));
database_path, strerror(errno));
return false;
}
@ -232,7 +236,7 @@ db_save(void)
while (fclose(fp) && errno == EINTR);
if (stat(dbFile, &st) == 0)
if (stat(database_path, &st) == 0)
directory_dbModTime = st.st_mtime;
return true;
@ -242,19 +246,19 @@ bool
db_load(void)
{
FILE *fp = NULL;
char *dbFile = db_get_file();
struct stat st;
char buffer[100];
bool foundFsCharset = false, foundVersion = false;
assert(database_path != NULL);
assert(music_root != NULL);
if (!music_root)
music_root = directory_new("", NULL);
while (!(fp = fopen(dbFile, "r")) && errno == EINTR) ;
while (!(fp = fopen(database_path, "r")) && errno == EINTR) ;
if (fp == NULL) {
g_warning("unable to open db file \"%s\": %s",
dbFile, strerror(errno));
database_path, strerror(errno));
return false;
}
@ -289,7 +293,7 @@ db_load(void)
foundFsCharset = true;
fsCharset = &(buffer[strlen(DIRECTORY_FS_CHARSET)]);
tempCharset = config_get_string(CONF_FS_CHARSET, NULL);
tempCharset = path_get_fs_charset();
if (tempCharset != NULL
&& strcmp(fsCharset, tempCharset)) {
g_message("Using \"%s\" for the "
@ -312,7 +316,7 @@ db_load(void)
stats_update();
if (stat(dbFile, &st) == 0)
if (stat(database_path, &st) == 0)
directory_dbModTime = st.st_mtime;
return true;

View File

@ -27,9 +27,11 @@ struct directory;
/**
* Initialize the database library.
*
* @param path the absolute path of the database file
*/
void
db_init(void);
db_init(const char *path);
void
db_finish(void);
@ -37,12 +39,8 @@ db_finish(void);
/**
* Clear the database.
*/
static inline void
db_clear(void)
{
db_finish();
db_init();
}
void
db_clear(void);
struct directory *
db_get_root(void);

View File

@ -126,7 +126,10 @@ static void changeToUser(void)
static void openDB(Options * options, char *argv0)
{
db_init();
struct config_param *param;
param = parseConfigFilePath(CONF_DB_FILE, true);
db_init(param->value);
if (options->createDB > 0 || !db_load()) {
unsigned job;