diff --git a/src/database/queue.c b/src/database/queue.c index 9de497226807e10f87db199bcc6fb9a18b4bcd6b..8ff68e8410714f2e5dc0c04859ca77b7832760b5 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -251,20 +251,21 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority) bool database_queue_del_id(volatile sqlite3 *db, int id) { + /* FIXME: Can't pop if its the last kara */ #define POS_OF_ID "(SELECT position FROM queue WHERE kara_id = %d)" static const char *SQL_TEMPLATE = "BEGIN TRANSACTION;" "WITH before(pos) AS (SELECT position FROM queue JOIN queue_state WHERE position < current ORDER BY position DESC LIMIT 1) " "UPDATE queue_state SET current = CASE WHEN current IS NULL THEN NULL ELSE (SELECT pos FROM before) END WHERE current > " POS_OF_ID ";" - "UPDATE queue SET position = position - 1 WHERE position > " POS_OF_ID ";" - "DELETE FROM queue WHERE kara_id = %d LIMIT 1;" - "COMMIT TRANSACTION;"; + "UPDATE OR REPLACE queue SET position = position - 1 WHERE position > " POS_OF_ID ";" + "COMMIT;"; #undef POS_OF_ID char SQL[LKT_MAX_SQLITE_STATEMENT]; safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, id, id, id, id); SQLITE_EXEC(db, SQL, error); return true; error: + SQLITE_DO_ROLLBACK(db); return false; } @@ -387,10 +388,11 @@ database_queue_clear(volatile sqlite3 *db) "DELETE FROM queue;" "DELETE FROM sqlite_sequence WHERE name = 'queue';" "UPDATE queue_state SET current = NULL;" - "COMMIT TRANSACTION;"; + "COMMIT;"; SQLITE_EXEC(db, SQL_STMT, error); return true; error: + SQLITE_DO_ROLLBACK(db); return false; } @@ -417,7 +419,7 @@ database_queue_move(volatile sqlite3 *db, int from, int to) "BEGIN TRANSACTION;" "UPDATE queue SET position = position + 1 WHERE position >= ?;" "UPDATE queue SET position = ? WHERE position = ?;" - "COMMIT TRANSACTION;"; + "COMMIT;"; sqlite3_stmt *stmt = 0; bool ret = false; int code; @@ -579,6 +581,7 @@ database_queue_shuffle(volatile sqlite3 *db) SQLITE_EXEC(db, SQL, error); return true; error: + SQLITE_DO_ROLLBACK(db); return false; }