[cache/config] Refactor cache so daap/artwork/xcode is cached in separate db's
Also change config so that the user can just configure a data directory instead of complete path to each database.
This commit is contained in:
parent
2efad1466f
commit
c079df5da7
|
@ -52,8 +52,8 @@ general {
|
|||
# IP addresses.
|
||||
# bind_address = "::"
|
||||
|
||||
# Location of cache database
|
||||
# cache_path = "@localstatedir@/cache/@PACKAGE@/cache.db"
|
||||
# Directory where the server keeps cached data
|
||||
# cache_dir = "@localstatedir@/cache/@PACKAGE@"
|
||||
|
||||
# DAAP requests that take longer than this threshold (in msec) get their
|
||||
# replies cached for next time. Set to 0 to disable caching.
|
||||
|
@ -203,7 +203,8 @@ library {
|
|||
# Formats that should always be transcoded
|
||||
# force_decode = { "format", "format" }
|
||||
# Prefer transcode to wav (default), alac or mpeg (mp3 with the bit rate
|
||||
# configured below in the streaming section)
|
||||
# configured below in the streaming section). Note that alac requires
|
||||
# precomputing and caching mp4 headers, which takes both cpu and disk.
|
||||
# prefer_format = "format"
|
||||
|
||||
# Set ffmpeg filters (similar to 'ffmpeg -af xxx') that you want the
|
||||
|
|
729
src/cache.c
729
src/cache.c
File diff suppressed because it is too large
Load Diff
|
@ -19,7 +19,7 @@ void
|
|||
cache_daap_add(const char *query, const char *ua, int is_remote, int msec);
|
||||
|
||||
int
|
||||
cache_daap_threshold(void);
|
||||
cache_daap_threshold_get(void);
|
||||
|
||||
|
||||
/* --------------------------- Transcode cache API ------------------------- */
|
||||
|
|
|
@ -55,7 +55,7 @@ static cfg_opt_t sec_general[] =
|
|||
CFG_STR_LIST("trusted_networks", "{lan}", CFGF_NONE),
|
||||
CFG_BOOL("ipv6", cfg_false, CFGF_NONE),
|
||||
CFG_STR("bind_address", NULL, CFGF_NONE),
|
||||
CFG_STR("cache_path", STATEDIR "/cache/" PACKAGE "/cache.db", CFGF_NONE),
|
||||
CFG_STR("cache_dir", STATEDIR "/cache/" PACKAGE, CFGF_NONE),
|
||||
CFG_INT("cache_daap_threshold", 1000, CFGF_NONE),
|
||||
CFG_BOOL("speaker_autoselect", cfg_false, CFGF_NONE),
|
||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
|
@ -67,6 +67,9 @@ static cfg_opt_t sec_general[] =
|
|||
CFG_INT("db_pragma_cache_size", -1, CFGF_NONE),
|
||||
CFG_STR("db_pragma_journal_mode", NULL, CFGF_NONE),
|
||||
CFG_INT("db_pragma_synchronous", -1, CFGF_NONE),
|
||||
CFG_STR("cache_daap_filename", "daap.db", CFGF_NONE),
|
||||
CFG_STR("cache_artwork_filename", "artwork.db", CFGF_NONE),
|
||||
CFG_STR("cache_xcode_filename", "xcode.db", CFGF_NONE),
|
||||
CFG_STR("allow_origin", "*", CFGF_NONE),
|
||||
CFG_STR("user_agent", PACKAGE_NAME "/" PACKAGE_VERSION, CFGF_NONE),
|
||||
CFG_BOOL("ssl_verifypeer", cfg_true, CFGF_NONE),
|
||||
|
@ -312,6 +315,31 @@ cb_loglevel(cfg_t *config, cfg_opt_t *opt, const char *value, void *result)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// Makes sure cache_dir ends with a slash
|
||||
static int
|
||||
sanitize_cache_dir(cfg_t *general)
|
||||
{
|
||||
char *dir;
|
||||
const char *s;
|
||||
char *appended;
|
||||
size_t len;
|
||||
|
||||
dir = cfg_getstr(general, "cache_dir");
|
||||
len = strlen(dir);
|
||||
|
||||
s = strrchr(dir, '/');
|
||||
if (s && (s + 1 == dir + len))
|
||||
return 0;
|
||||
|
||||
appended = safe_asprintf("%s/", dir);
|
||||
|
||||
cfg_setstr(general, "cache_dir", appended);
|
||||
|
||||
free(appended);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
conffile_expand_libname(cfg_t *lib)
|
||||
{
|
||||
|
@ -425,7 +453,6 @@ conffile_expand_libname(cfg_t *lib)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
conffile_load(char *file)
|
||||
{
|
||||
|
@ -466,6 +493,14 @@ conffile_load(char *file)
|
|||
runas_uid = pw->pw_uid;
|
||||
runas_gid = pw->pw_gid;
|
||||
|
||||
ret = sanitize_cache_dir(cfg_getsec(cfg, "general"));
|
||||
if (ret != 0)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Invalid configuration of cache_dir\n");
|
||||
|
||||
goto out_fail;
|
||||
}
|
||||
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
if (cfg_size(lib, "directories") == 0)
|
||||
|
|
20
src/db.c
20
src/db.c
|
@ -6892,9 +6892,6 @@ db_open(void)
|
|||
int synchronous;
|
||||
int mmap_size;
|
||||
|
||||
if (!db_path)
|
||||
return -1;
|
||||
|
||||
ret = sqlite3_open(db_path, &hdl);
|
||||
if (ret != SQLITE_OK)
|
||||
{
|
||||
|
@ -7343,35 +7340,35 @@ db_init(void)
|
|||
db_path = cfg_getstr(cfg_getsec(cfg, "general"), "db_path");
|
||||
db_rating_updates = cfg_getbool(cfg_getsec(cfg, "library"), "rating_updates");
|
||||
|
||||
DPRINTF(E_LOG, L_DB, "Configured to use database file '%s'\n", db_path);
|
||||
DPRINTF(E_INFO, L_DB, "Configured to use database file '%s'\n", db_path);
|
||||
|
||||
ret = sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
|
||||
if (ret != SQLITE_OK)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_DB, "Could not switch SQLite3 to multithread mode\n");
|
||||
DPRINTF(E_FATAL, L_DB, "Check that SQLite3 has been configured for thread-safe operations\n");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = sqlite3_enable_shared_cache(1);
|
||||
if (ret != SQLITE_OK)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_DB, "Could not enable SQLite3 shared-cache mode\n");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = sqlite3_initialize();
|
||||
if (ret != SQLITE_OK)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_DB, "SQLite3 failed to initialize\n");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = db_open();
|
||||
if (ret < 0)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_DB, "Could not open database\n");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = db_check_version();
|
||||
|
@ -7380,7 +7377,7 @@ db_init(void)
|
|||
DPRINTF(E_FATAL, L_DB, "Database version check errored out, incompatible database\n");
|
||||
|
||||
db_perthread_deinit();
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
else if (ret > 0)
|
||||
{
|
||||
|
@ -7391,7 +7388,7 @@ db_init(void)
|
|||
{
|
||||
DPRINTF(E_FATAL, L_DB, "Could not create tables\n");
|
||||
db_perthread_deinit();
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7409,6 +7406,9 @@ db_init(void)
|
|||
rng_init(&shuffle_rng);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -2276,7 +2276,7 @@ daap_request(struct httpd_request *hreq)
|
|||
|
||||
DPRINTF(E_DBG, L_DAAP, "DAAP request handled in %d milliseconds\n", msec);
|
||||
|
||||
if (ret == DAAP_REPLY_OK && msec > cache_daap_threshold() && hreq->user_agent)
|
||||
if (ret == DAAP_REPLY_OK && msec > cache_daap_threshold_get() && hreq->user_agent)
|
||||
cache_daap_add(hreq->uri, hreq->user_agent, ((struct daap_session *)hreq->extra_data)->is_remote, msec);
|
||||
|
||||
daap_reply_send(hreq, ret); // hreq is deallocted
|
||||
|
|
Loading…
Reference in New Issue