Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 51a93421 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

Rescan command

parent 7eaea770
Branches
Étiquettes
1 requête de fusion!65Resolve "Sync from kurisu"
......@@ -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; \
}
......
......@@ -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);
......
......@@ -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
......
#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,8 +139,13 @@ 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);
database_stamp(db);
}
else if (dir->d_type == DT_DIR &&
strcmp(dir->d_name, ".") != 0 &&
strcmp(dir->d_name, "..") != 0)
......
......@@ -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);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter