diff --git a/src/common.c b/src/common.c index cc7dd77b7bc4b3fae7c0afd2112db61c8c9de9c0..bb330464876adaa5e3129c024891f2734482178b 100644 --- a/src/common.c +++ b/src/common.c @@ -138,7 +138,7 @@ get_stdin_line(const char *prompt, char *buf, size_t len) inline long get_mtime(const char *path) { - struct stat statbuf; + struct stat statbuf = {0}; return (stat(path, &statbuf) == -1) ? 0 : statbuf.st_mtime; } diff --git a/src/database/queue.c b/src/database/queue.c index a6f9e36b0ea9d7674c666192b180d15de648f752..e7815cd29e16dc1921275399283e9531bff09bcb 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -550,12 +550,14 @@ bool database_get_kara_path(volatile sqlite3 *db, int id, char filepath[PATH_MAX]) { sqlite3_stmt *stmt = NULL; - static const char *SQL = "SELECT file_path FROM kara WHERE id = ?;"; - RETURN_UNLESS(id && db && filepath, "Invalid argument", false); + static const char *SQL = "SELECT file_path FROM kara WHERE id = ? AND available = 1;"; + RETURN_UNLESS(id && db, "Invalid argument", false); SQLITE_PREPARE(db, stmt, SQL, error); SQLITE_BIND_INT(db, stmt, 1, id, error); SQLITE_STEP_ROW(db, stmt, error); - strncpy(filepath, (const char *) sqlite3_column_text(stmt, 0), PATH_MAX); + if (!filepath) + return true; + strncpy(filepath, sqlite3_column_chars(stmt, 0), PATH_MAX); filepath[PATH_MAX - 1] = '\0'; return true; error: diff --git a/src/database/update.c b/src/database/update.c index 32448a6689229ef3fd4606eeb0e129c34841b4e1..f910b2436cd6acde69b9e24ca9687499eb0fdffe 100644 --- a/src/database/update.c +++ b/src/database/update.c @@ -26,7 +26,7 @@ __add_kara_to_update_job(volatile sqlite3 *db, size_t id) sqlite3_stmt *stmt; SQLITE_PREPARE(db, stmt, SQL, error); SQLITE_BIND_INT(db, stmt, 1, (int) id, error); - SQLITE_STEP_DONE(db, stmt, error); + sqlite3_step(stmt); /* Ignore result of that one */ return true; error: return false; diff --git a/src/module/repo.c b/src/module/repo.c index f9b139114cbe82a2eee073fc2112a7aa2f5d4bcc..1647fa347143ac225d3eeec8c4d49b23bfa107df 100644 --- a/src/module/repo.c +++ b/src/module/repo.c @@ -10,6 +10,7 @@ #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> +#include <time.h> #include <common/common.h> #include <mthread/mthread.h> @@ -332,14 +333,19 @@ void __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_object *json) { - size_t i, len = json_object_array_length(json); + size_t i, len = json_object_array_length(json), update_count = 0, + ignored_count = 0; struct json_object *kara_json; int32_t integer, err; struct kara kara; - long filestamp = 0, timestamp = 0, db_timestamp = 0; + long filestamp = 0, timestamp = 0; char mkvpropedit[PATH_MAX], url[URL_MAX_LEN]; int current_id; struct lkt_state *srv = repo->srv; + struct timespec time_sleep = { + .tv_sec = 0, + .tv_nsec = 100000000L, + }; /* Sleep for 0.1s */ RETURN_UNLESS(len > 0 && json_object_get_array(json), "Json invalid or array empty", NOTHING); @@ -349,6 +355,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, LOG_INFO("REPO", "Starting to process json for repo %s", repo->name); for (i = 0; i < len; ++i) { + nanosleep(&time_sleep, NULL); /* Sleep a bit, better for Hard drive */ kara_json = json_object_array_get_idx(json, i); err = 0; @@ -368,6 +375,24 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, safe_snprintf(kara.filename + kara_dir_len, PATH_MAX - kara_dir_len, "%d.mkv", integer); + /* Timestamp and presence verification */ + if (!database_get_kara_path(db, kara.id, NULL)) + goto do_it; + if (safe_json_get_long(kara_json, "unix_timestamp", ×tamp)) + continue; + filestamp = get_mtime(kara.filename); + if (!(filestamp > timestamp)) + goto do_it; + else { + ++ignored_count; + database_update_touch(db, kara.id); + database_update_set_available(db, kara.id); + LOG_INFO("REPO", "Ignore kara '%ld' with path '%s'", + kara.id, kara.filename); + continue; + } +do_it: + /* Reads the json */ err |= safe_json_get_string(kara_json, "song_name", kara.mdt.song_name, LEKTOR_TAG_MAX); err |= safe_json_get_string(kara_json, "source_name", kara.mdt.source_name, LEKTOR_TAG_MAX); @@ -380,20 +405,6 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, continue; } - /* Timestamp verification */ - if (safe_json_get_long(kara_json, "unix_timestamp", ×tamp)) - continue; - filestamp = get_mtime(kara.filename); - database_get_update(db, &db_timestamp, NULL, NULL); - if (db_timestamp >= filestamp && filestamp > timestamp && - ! kara_metadata_equals(&kara.mdt, kara.filename)) { - database_update_touch(db, kara.id); - database_update_set_available(db, kara.id); - LOG_INFO("REPO", "Ignore kara '%ld' with path '%s'", - kara.id, kara.filename); - continue; - } - current_id = 0; database_queue_current_kara(db, NULL, ¤t_id); if (current_id == (int) kara.id) { @@ -431,9 +442,12 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, } database_stamp(db); + ++update_count; LOG_INFO("REPO", "Added kara %ld from repo %s, filepath is %s", kara.id, repo->name, kara.filename); } + LOG_INFO("REPO", "Updated %ld karas and ignored %ld karas, total is %ld", + update_count, ignored_count, len); } static inline void