diff --git a/inc/lektor/database.h b/inc/lektor/database.h index ba391483aa122e89a8a233bc3ccd330c6e50ee11..4a3d99216e0657adc39def250356ebedee9d9008 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -74,12 +74,11 @@ void database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_ void database_get_all_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len); /* Update the database. */ -bool database_update (volatile sqlite3 *db, const char *kara_dir, int check_timestamp); -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, int id); -void database_update_set_new (volatile sqlite3 *db, int id, bool is_new); -void database_update_del (volatile sqlite3 *db, int id); -void database_update_touch (volatile sqlite3 *db, int id); +bool database_update (volatile sqlite3 *db, const char *kara_dir, int check_timestamp); +bool database_update_add (volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail); +void database_update_set_new(volatile sqlite3 *db, int id, bool is_new); +void database_update_del (volatile sqlite3 *db, int id); +void database_update_touch (volatile sqlite3 *db, int id); /* Control the content of the queue. */ bool database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority); diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h index b95998072152234373dc3b4fee258459fe1bfdc3..6202754be9446818ee56bd5664ffb5302fa64687 100644 --- a/inc/lektor/queue.h +++ b/inc/lektor/queue.h @@ -48,13 +48,15 @@ typedef enum { LKT_EVENT_DB_UPDATING = (1 << 10), // size_t, `LKT_DB_UPDATING_*` LKT_EVENT_DB_UPDATE_TOTAL = (1 << 11), // size_t, increments udapte_total LKT_EVENT_DB_UPDATE_TICK = (1 << 12), // NULL, increment the `update_current` + LKT_EVENT_TOUCH_KARA = (1 << 13), // size_t, kara id } LKT_EVENT_TYPE; #define LKT_EVENT_PLAY \ (LKT_EVENT_PLAY_POS | LKT_EVENT_PLAY_FILE | LKT_EVENT_PLAY_NEXT | LKT_EVENT_PLAY_PREV | LKT_EVENT_PLAY_TOGGLE | \ LKT_EVENT_SKIP_CURRENT) -#define LKT_EVENT_PROP (LKT_EVENT_PROP_VOL | LKT_EVENT_PROP_DUR | LKT_EVENT_PROP_TIME) -#define LKT_EVENT_UPDATE (LKT_EVENT_DB_UPDATING | LKT_EVENT_DB_UPDATE_TICK | LKT_EVENT_DB_UPDATE_TOTAL) +#define LKT_EVENT_PROP (LKT_EVENT_PROP_VOL | LKT_EVENT_PROP_DUR | LKT_EVENT_PROP_TIME) +#define LKT_EVENT_UPDATE \ + (LKT_EVENT_DB_UPDATING | LKT_EVENT_DB_UPDATE_TICK | LKT_EVENT_DB_UPDATE_TOTAL | LKT_EVENT_TOUCH_KARA) typedef struct { unsigned int type; diff --git a/src/database/update.c b/src/database/update.c index bde26c4266df687cd9b478927ff808543c12a4bb..d6d8618017d8f70eb498cb98594b74ecb5550b11 100644 --- a/src/database/update.c +++ b/src/database/update.c @@ -9,20 +9,25 @@ PRIVATE_FUNCTION bool ___add_kara_to_update_job(volatile sqlite3 *db, size_t id) { - const char *SQL = NULL; - sqlite3_stmt *stmt; + char SQL[LKT_MAX_SQLITE_STATEMENT]; + if (id) { - SQL = "INSERT INTO updates (job, kara_id) " - "SELECT MAX(update_job), ? FROM misc;"; - SQLITE_PREPARE(db, stmt, SQL, error); - SQLITE_BIND_INT(db, stmt, 1, (int)id, error); - } else { - SQL = "INSERT INTO updates (job, kara_id) " - "SELECT MAX(update_job), last_insert_rowid() FROM misc;"; - SQLITE_PREPARE(db, stmt, SQL, error); + static const char *SQL_TEMP = "INSERT INTO updates (job, kara_id) " + "SELECT MAX(update_job), %ld FROM misc;" + "UPDATE kara SET available = 1 WHERE id = %ld;"; + safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMP, id, id); } - sqlite3_step(stmt); /* Ignore result of that one */ + + else { + static const char *SQL_TEMP = "INSERT INTO updates (job, kara_id) " + "SELECT MAX(update_job), last_insert_rowid() FROM misc;" + "UPDATE kara SET available = 1 WHERE id = last_insert_rowid();"; + safe_strncpy(SQL, SQL_TEMP, LKT_MAX_SQLITE_STATEMENT); + } + + SQLITE_EXEC(db, SQL, error); return true; + error: return false; } @@ -149,23 +154,6 @@ error: return status; } -bool -database_update_set_available(volatile sqlite3 *db, int id) -{ - static const char *SQL_STMT = "UPDATE kara SET available = 1 WHERE id = ?;"; - sqlite3_stmt *stmt; - SQLITE_PREPARE(db, stmt, SQL_STMT, error); - SQLITE_BIND_INT(db, stmt, 1, id, error); - if (sqlite3_step(stmt) != SQLITE_DONE) - goto error; - sqlite3_finalize(stmt); - return true; -error: - sqlite3_finalize(stmt); - LOG_ERROR("DB", "Failed to set kara %d available", id); - return false; -} - void database_update_set_new(volatile sqlite3 *db, int id, bool is_new) { diff --git a/src/module/module_repo.c b/src/module/module_repo.c index f41d6acb1b18d27df1b30d848177089c8c8eccb3..b432daf0ecb089f1ef772dfe5258c6a139f1187c 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -350,12 +350,7 @@ ___handle_got_json_dl(struct kara *kara, int current_id) } database_update_set_new(kara->db, kara->id, kara->is_new); - - if (!database_update_set_available(kara->db, kara->id)) { - LOG_WARN("REPO", "Could not set kara %ld available", kara->id); - return; - } - + lkt_queue_send(kara->repo->queue, LKT_EVENT_TOUCH_KARA, (void *)(size_t)kara->id); database_stamp(kara->db); ++(kara->update_count); LOG_INFO("REPO", "Added kara %ld from repo %s, filepath is %s", kara->id, kara->repo->name, kara->filename); @@ -436,8 +431,7 @@ ___handle_got_json_internal_callback(const char *key, const char *val, int comp, /* Don't burn the disk */ ___sleep(); - database_update_touch(kara->db, kara->id); - database_update_set_available(kara->db, kara->id); + lkt_queue_send(kara->repo->queue, LKT_EVENT_TOUCH_KARA, (void *)(size_t)kara->id); lkt_queue_send(kara->repo->queue, LKT_EVENT_DB_UPDATE_TICK, NULL); LOG_DEBUG("REPO", "Ignore kara %ld", kara->id); return 0; diff --git a/src/net/listen.c b/src/net/listen.c index 6969f5944a19354e286624c8165d2f292facd57a..1f6ec34d9f37eb308a1a5fc2d24d2ec47a14f739 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -864,7 +864,8 @@ redo: free(string); }) - __CASE(DB_UPDATE_TOTAL, { srv->update_total += (size_t)evt.attr; }) + __CASE(TOUCH_KARA, { database_update_touch(srv->db, (size_t)evt.attr); }) + __CASE(DB_UPDATE_TOTAL, { srv->update_total += (size_t)evt.attr; }) __CASE(DB_UPDATING, { srv->is_updating = (((uint8_t)(size_t)evt.attr) > 0); }) __CASE(DB_UPDATE_TICK, { if (srv->update_current != ((size_t)-1))