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

A query to delete an id, not working

parent 2025d3c6
Branches
Étiquettes
1 requête de fusion!79Database update
...@@ -251,17 +251,20 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority) ...@@ -251,17 +251,20 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority)
bool bool
database_queue_del_id(volatile sqlite3 *db, int id) 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 = static const char *SQL_TEMPLATE =
"BEGIN TRANSACTION;" "BEGIN TRANSACTION;"
"WITH before(pos) AS (SELECT position FROM queue JOIN queue_state WHERE position < current ORDER BY position DESC LIMIT 1) " "CREATE TEMPORARY TABLE queue_tmp (position INTEGER, kara_id INTEGER, priority INTEGER);"
"UPDATE queue_state SET current = CASE WHEN current IS NULL THEN NULL ELSE (SELECT pos FROM before) END WHERE current > " POS_OF_ID ";" /* Move the current 'pointer' */
"UPDATE OR REPLACE queue SET position = position - 1 WHERE position > " POS_OF_ID ";" "UPDATE queue_state SET current = (SELECT current - IFNULL(COUNT(position), 0) FROM queue JOIN queue_state ON position <= current AND kara_id = %d);"
"DELETE FROM queue WHERE kara_id = %d;" /* Delete any kara with the specified id */
"INSERT INTO queue_tmp(priority, position, kara_id) SELECT priority, position, kara_id FROM queue ORDER BY position ASC;"
"DELETE FROM queue;"
"INSERT INTO queue(priority, position, kara_id) SELECT priority, ROW_NUMBER() OVER(ORDER BY position ASC), kara_id FROM queue_tmp;"
"UPDATE sqlite_sequence SET seq = (SELECT COUNT(*) FROM queue) WHERE name = 'queue';" /* Update the sqlite_sequence */
"DROP TABLE queue_tmp;" /* Erase queue_tmp */
"COMMIT;"; "COMMIT;";
#undef POS_OF_ID
char SQL[LKT_MAX_SQLITE_STATEMENT]; char SQL[LKT_MAX_SQLITE_STATEMENT];
safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, id, id, id, id); safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, id, id);
SQLITE_EXEC(db, SQL, error); SQLITE_EXEC(db, SQL, error);
return true; return true;
error: error:
......
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