mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-25 22:55:56 -05:00
Rework process_media_file() and related DB support routines
Avoid pulling all the file info from the DB in process_media_file() as anything besides the file id and timestamp is not used at all.
This commit is contained in:
parent
0a8c171187
commit
0ad20e5220
73
src/db.c
73
src/db.c
@ -917,14 +917,14 @@ db_file_inc_playcount(int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
db_file_ping(int id)
|
db_file_ping(char *path)
|
||||||
{
|
{
|
||||||
#define Q_TMPL "UPDATE songs SET db_timestamp = %" PRIi64 ", disabled = 0 WHERE id = %d;"
|
#define Q_TMPL "UPDATE songs SET db_timestamp = %" PRIi64 ", disabled = 0 WHERE path = '%q';"
|
||||||
char *query;
|
char *query;
|
||||||
char *errmsg;
|
char *errmsg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
query = sqlite3_mprintf(Q_TMPL, (int64_t)time(NULL), id);
|
query = sqlite3_mprintf(Q_TMPL, (int64_t)time(NULL), path);
|
||||||
if (!query)
|
if (!query)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
@ -937,7 +937,7 @@ db_file_ping(int id)
|
|||||||
errmsg = NULL;
|
errmsg = NULL;
|
||||||
ret = sqlite3_exec(hdl, query, NULL, NULL, &errmsg);
|
ret = sqlite3_exec(hdl, query, NULL, NULL, &errmsg);
|
||||||
if (ret != SQLITE_OK)
|
if (ret != SQLITE_OK)
|
||||||
DPRINTF(E_LOG, L_DB, "Error pinging file %d: %s\n", id, errmsg);
|
DPRINTF(E_LOG, L_DB, "Error pinging file '%s': %s\n", path, errmsg);
|
||||||
|
|
||||||
sqlite3_free(errmsg);
|
sqlite3_free(errmsg);
|
||||||
sqlite3_free(query);
|
sqlite3_free(query);
|
||||||
@ -946,9 +946,9 @@ db_file_ping(int id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
db_file_id_bypath(char *path, int *id)
|
db_file_id_bypath(char *path)
|
||||||
{
|
{
|
||||||
#define Q_TMPL "SELECT id FROM songs WHERE disabled = 0 AND path = '%q';"
|
#define Q_TMPL "SELECT id FROM songs WHERE path = '%q';"
|
||||||
char *query;
|
char *query;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
int ret;
|
int ret;
|
||||||
@ -958,7 +958,7 @@ db_file_id_bypath(char *path, int *id)
|
|||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
|
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(E_DBG, L_DB, "Running query '%s'\n", query);
|
DPRINTF(E_DBG, L_DB, "Running query '%s'\n", query);
|
||||||
@ -969,7 +969,7 @@ db_file_id_bypath(char *path, int *id)
|
|||||||
DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl));
|
DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl));
|
||||||
|
|
||||||
sqlite3_free(query);
|
sqlite3_free(query);
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sqlite3_step(stmt);
|
ret = sqlite3_step(stmt);
|
||||||
@ -982,15 +982,66 @@ db_file_id_bypath(char *path, int *id)
|
|||||||
|
|
||||||
sqlite3_finalize(stmt);
|
sqlite3_finalize(stmt);
|
||||||
sqlite3_free(query);
|
sqlite3_free(query);
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*id = sqlite3_column_int(stmt, 0);
|
ret = sqlite3_column_int(stmt, 0);
|
||||||
|
|
||||||
sqlite3_finalize(stmt);
|
sqlite3_finalize(stmt);
|
||||||
sqlite3_free(query);
|
sqlite3_free(query);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
|
|
||||||
|
#undef Q_TMPL
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t
|
||||||
|
db_file_stamp_bypath(char *path)
|
||||||
|
{
|
||||||
|
#define Q_TMPL "SELECT db_timestamp FROM songs WHERE path = '%q';"
|
||||||
|
char *query;
|
||||||
|
sqlite3_stmt *stmt;
|
||||||
|
time_t stamp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
query = sqlite3_mprintf(Q_TMPL, path);
|
||||||
|
if (!query)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTF(E_DBG, L_DB, "Running query '%s'\n", query);
|
||||||
|
|
||||||
|
ret = sqlite3_prepare_v2(hdl, query, strlen(query) + 1, &stmt, NULL);
|
||||||
|
if (ret != SQLITE_OK)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl));
|
||||||
|
|
||||||
|
sqlite3_free(query);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_step(stmt);
|
||||||
|
if (ret != SQLITE_ROW)
|
||||||
|
{
|
||||||
|
if (ret == SQLITE_DONE)
|
||||||
|
DPRINTF(E_INFO, L_DB, "No results\n");
|
||||||
|
else
|
||||||
|
DPRINTF(E_LOG, L_DB, "Could not step: %s\n", sqlite3_errmsg(hdl));
|
||||||
|
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
sqlite3_free(query);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
stamp = (time_t)sqlite3_column_int64(stmt, 0);
|
||||||
|
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
sqlite3_free(query);
|
||||||
|
|
||||||
|
return stamp;
|
||||||
|
|
||||||
#undef Q_TMPL
|
#undef Q_TMPL
|
||||||
}
|
}
|
||||||
|
7
src/db.h
7
src/db.h
@ -226,10 +226,13 @@ void
|
|||||||
db_file_inc_playcount(int id);
|
db_file_inc_playcount(int id);
|
||||||
|
|
||||||
void
|
void
|
||||||
db_file_ping(int id);
|
db_file_ping(char *path);
|
||||||
|
|
||||||
int
|
int
|
||||||
db_file_id_bypath(char *path, int *id);
|
db_file_id_bypath(char *path);
|
||||||
|
|
||||||
|
time_t
|
||||||
|
db_file_stamp_bypath(char *path);
|
||||||
|
|
||||||
struct media_file_info *
|
struct media_file_info *
|
||||||
db_file_fetch_byid(int id);
|
db_file_fetch_byid(int id);
|
||||||
|
@ -177,73 +177,52 @@ fixup_tags(struct media_file_info *mfi)
|
|||||||
static void
|
static void
|
||||||
process_media_file(char *file, time_t mtime, off_t size, int compilation)
|
process_media_file(char *file, time_t mtime, off_t size, int compilation)
|
||||||
{
|
{
|
||||||
struct media_file_info *mfi;
|
struct media_file_info mfi;
|
||||||
char *filename;
|
char *filename;
|
||||||
char *ext;
|
char *ext;
|
||||||
int need_update;
|
time_t stamp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mfi = db_file_fetch_bypath(file);
|
stamp = db_file_stamp_bypath(file);
|
||||||
|
|
||||||
need_update = (!mfi || (mfi->db_timestamp < mtime));
|
if (stamp >= mtime)
|
||||||
|
|
||||||
if (!need_update)
|
|
||||||
{
|
{
|
||||||
db_file_ping(mfi->id);
|
db_file_ping(file);
|
||||||
|
|
||||||
free_mfi(mfi, 0);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mfi)
|
memset(&mfi, 0, sizeof(struct media_file_info));
|
||||||
{
|
|
||||||
ret = mfi->id;
|
|
||||||
free_mfi(mfi, 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = 0;
|
|
||||||
mfi = (struct media_file_info *)malloc(sizeof(struct media_file_info));
|
|
||||||
if (!mfi)
|
|
||||||
{
|
|
||||||
DPRINTF(E_WARN, L_SCAN, "Out of memory for media_file_info\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(mfi, 0, sizeof(struct media_file_info));
|
if (stamp)
|
||||||
mfi->id = ret;
|
mfi.id = db_file_id_bypath(file);
|
||||||
|
|
||||||
filename = strrchr(file, '/');
|
filename = strrchr(file, '/');
|
||||||
if (!filename)
|
if (!filename)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_SCAN, "Could not determine filename for %s\n", file);
|
DPRINTF(E_LOG, L_SCAN, "Could not determine filename for %s\n", file);
|
||||||
|
|
||||||
free(mfi);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfi->fname = strdup(filename + 1);
|
mfi.fname = strdup(filename + 1);
|
||||||
if (!mfi->fname)
|
if (!mfi.fname)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_SCAN, "Out of memory for fname\n");
|
DPRINTF(E_WARN, L_SCAN, "Out of memory for fname\n");
|
||||||
|
|
||||||
free(mfi);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfi->path = strdup(file);
|
mfi.path = strdup(file);
|
||||||
if (!mfi->path)
|
if (!mfi.path)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_SCAN, "Out of memory for path\n");
|
DPRINTF(E_WARN, L_SCAN, "Out of memory for path\n");
|
||||||
|
|
||||||
free(mfi->fname);
|
free(mfi.fname);
|
||||||
free(mfi);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfi->time_modified = mtime;
|
mfi.time_modified = mtime;
|
||||||
mfi->file_size = size;
|
mfi.file_size = size;
|
||||||
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
@ -254,38 +233,38 @@ process_media_file(char *file, time_t mtime, off_t size, int compilation)
|
|||||||
if ((strcmp(ext, ".pls") == 0)
|
if ((strcmp(ext, ".pls") == 0)
|
||||||
|| (strcmp(ext, ".url") == 0))
|
|| (strcmp(ext, ".url") == 0))
|
||||||
{
|
{
|
||||||
ret = scan_url_file(file, mfi);
|
ret = scan_url_file(file, &mfi);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
mfi->data_kind = 1; /* url/stream */
|
mfi.data_kind = 1; /* url/stream */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* General case */
|
/* General case */
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
ret = scan_metadata_ffmpeg(file, mfi);
|
ret = scan_metadata_ffmpeg(file, &mfi);
|
||||||
mfi->data_kind = 0; /* real file */
|
mfi.data_kind = 0; /* real file */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_SCAN, "Could not extract metadata for %s\n", file);
|
DPRINTF(E_LOG, L_SCAN, "Could not extract metadata for %s\n", file);
|
||||||
|
|
||||||
free_mfi(mfi, 0);
|
free_mfi(&mfi, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfi->compilation = compilation;
|
mfi.compilation = compilation;
|
||||||
mfi->item_kind = 2; /* music */
|
mfi.item_kind = 2; /* music */
|
||||||
|
|
||||||
fixup_tags(mfi);
|
fixup_tags(&mfi);
|
||||||
|
|
||||||
if (mfi->id == 0)
|
if (mfi.id == 0)
|
||||||
db_file_add(mfi);
|
db_file_add(&mfi);
|
||||||
else
|
else
|
||||||
db_file_update(mfi);
|
db_file_update(&mfi);
|
||||||
|
|
||||||
free_mfi(mfi, 0);
|
free_mfi(&mfi, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user