diff --git a/inc/lektor/common.h b/inc/lektor/common.h index 28155d1920d67b0d790dea9b595a6f6f9d6087c2..3495f2519ccaadb965b05807dab896e78c3056c5 100644 --- a/inc/lektor/common.h +++ b/inc/lektor/common.h @@ -12,6 +12,11 @@ #define GET_ID_JSON DEFAULT_URL "/api_karas.php?id=%ld" #define GET_ID_FILE DEFAULT_URL "/download.php?id=%ld" +#define SELF_EXECUTABLE_LINUX "/proc/self/exe" +#define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file" +#define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out" + + #define LKT_MAX_SQLITE_STATEMENT 1024 #define PROTECTED_DATABASE "disk" @@ -91,7 +96,7 @@ enum mpd_idle_flag { #define SQLITE_STEP(db, stmt, code, error) \ if (sqlite3_step(stmt) != code) { \ - LOG_ERROR_SCT("DB", "Failed to step and get a row: %s", \ + LOG_ERROR_SCT("DB", "Failed to step: %s", \ sqlite3_errmsg((sqlite3 *) db)); \ goto error; \ } diff --git a/inc/lektor/database.h b/inc/lektor/database.h index 3c9601400862dae0f1722fde761e677f0a4073a7..f74e2a16332743df3e584b1da30aa229c5bad011 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -45,9 +45,9 @@ bool database_queue_get_current_file (sqlite3 *db, char filepath[PATH_MAX]); bool database_sync_mpv_state(sqlite3 *db, mpv_handle **mpv); /* Update the database. */ -bool database_update(sqlite3 *db, const char *kara_dir); -bool database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail); -bool database_update_set_available(sqlite3 *db, uint64_t id); +bool database_update(volatile sqlite3 *db, const char *kara_dir); +bool database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail); +bool database_update_set_available(volatile sqlite3 *db, uint64_t id); /* Control the content of the queue. */ bool database_queue_add_id (sqlite3 *db, int id, int priority); diff --git a/src/commands.c b/src/commands.c index d5e1d6a577e28ac869d703d6184bb756de0bf689..890c26d318cdbf69c6e1600c1426c2baa6b67030 100644 --- a/src/commands.c +++ b/src/commands.c @@ -6,6 +6,7 @@ #include <lektor/database.h> #include <lektor/net.h> #include <lektor/uri.h> +#include <mthread/mthread.h> #include <errno.h> #include <linux/limits.h> @@ -18,10 +19,6 @@ #include <poll.h> #include <unistd.h> -#define SELF_EXECUTABLE_LINUX "/proc/self/exe" -#define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file" -#define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out" - inline bool command_restart(struct lkt_state *srv, size_t c) { @@ -61,16 +58,22 @@ command_update(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX] return ! repo_update(&srv->repo); } +static inline void * +__rescan(void * arg) +{ + struct lkt_state *srv = arg; + database_update(srv->db, srv->kara_prefix); + return NULL; +} + bool command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) { UNUSED(argv); RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false); - fprintf(stderr, " ! command_rescan: Not implemented\n"); - return false; srv->mpd_idle_events |= MPD_IDLE_UPDATE; srv->mpd_idle_events |= MPD_IDLE_DATABASE; - return database_update((sqlite3 *) srv->db, srv->kara_prefix); + return ! mthread_create(NULL, ATTR_DETACHED_FREE, __rescan, srv); } inline bool diff --git a/src/database/update.c b/src/database/update.c index f4d992e4963742ae0d0f13e9a565df961b9f1250..80429007333c98526a9efa5988b88f498ddbcd33 100644 --- a/src/database/update.c +++ b/src/database/update.c @@ -1,8 +1,10 @@ #define _POSIX_C_SOURCE 200809L #define _DEFAULT_SOURCE +#include <common/common.h> #include <lektor/database.h> #include <lektor/common.h> + #include <stdbool.h> #include <sqlite3.h> #include <stdio.h> @@ -13,7 +15,7 @@ #include <linux/limits.h> static bool -database_add_kara(sqlite3 *db, const char *filename) +database_add_kara(volatile sqlite3 *db, const char *filename) { RETURN_UNLESS(db || filename, "Invalid argument", false); static const char *SQL_STMT = @@ -46,7 +48,7 @@ database_add_kara(sqlite3 *db, const char *filename) (sqlite3_bind_text(stmt, 8, data.author_name, -1, 0) != SQLITE_OK) || (sqlite3_bind_int (stmt, 9, data.song_number) != SQLITE_OK) ) { - LOG_ERROR_SCT("DB", "Failed to bind for kara %s: %s", filename, sqlite3_errmsg(db)); + LOG_ERROR_SCT("DB", "Failed to bind for kara %s: %s", filename, sqlite3_errmsg((sqlite3 *) db)); goto error; } @@ -58,7 +60,7 @@ error: } bool -database_update_set_available(sqlite3 *db, uint64_t id) +database_update_set_available(volatile sqlite3 *db, uint64_t id) { static const char *SQL_STMT = "UPDATE kara SET available = 1 WHERE id = ?;"; sqlite3_stmt *stmt; @@ -76,7 +78,7 @@ error: } bool -database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail) +database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail) { RETURN_UNLESS(db && kara_path && mdt, "Invalid argument", false); static const char *SQL_STMT = @@ -107,7 +109,7 @@ database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *md (sqlite3_bind_int (stmt, 10, id) != SQLITE_OK) || (sqlite3_bind_int (stmt, 11, avail) != SQLITE_OK) ) { - LOG_ERROR_SCT("DB", "Failed to bind argument for kara %s: %s", kara_path, sqlite3_errmsg(db)); + LOG_ERROR_SCT("DB", "Failed to bind argument for kara %s: %s", kara_path, sqlite3_errmsg((sqlite3 *) db)); goto error; } @@ -120,7 +122,7 @@ error_no_sqlite: } bool -database_update(sqlite3 *db, const char *kara_dir) +database_update(volatile sqlite3 *db, const char *kara_dir) { DIR *d; struct dirent *dir; @@ -137,10 +139,15 @@ database_update(sqlite3 *db, const char *kara_dir) strncat(path, "/", PATH_MAX - 1); strncat(path, dir->d_name, PATH_MAX - 1); - if (dir->d_type == DT_REG) + if (dir->d_type == DT_REG) { + if (get_mtime(path) < database_get_timestamp(db)) + continue; database_add_kara(db, path); - else if (dir->d_type == DT_DIR && - strcmp(dir->d_name, ".") != 0 && + database_stamp(db); + } + + else if (dir->d_type == DT_DIR && + strcmp(dir->d_name, ".") != 0 && strcmp(dir->d_name, "..") != 0) database_update(db, path); } diff --git a/src/net/listen.c b/src/net/listen.c index 4a1c0498a3e4490f8e5c323019e35f4ce28fefdb..690c1844c6111d77864a47a7a01d5fd648c59a14 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -164,7 +164,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) err = ! command_rescan(srv, c, cmd.args); /* Commands that are available if not in idle mode */ - if (!strcmp(cmd.name, "currentsong")) + else if (!strcmp(cmd.name, "currentsong")) err = !command_currentsong(srv, c); else if (!strcmp(cmd.name, "status")) err = !command_status(srv, c);