diff --git a/src/database/queue.c b/src/database/queue.c index 1aee4b78701608bd0737128b8fff0c8470f3cdc2..1d4cd5f92ad52dfc18c43795469bdd2e688c83c7 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -574,128 +574,66 @@ error_no_rollback: bool database_queue_move(volatile sqlite3 *db, int from, int to) { - /* TODO: See if there is a solution with less lines of code */ - static const char *SQL_TEMPLATE_toINFfrom = + static const char *SQL_TEMPLATE_PART_1 = /* Clean queue_tmp */ "DELETE FROM queue_tmp;" "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';" /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" + "INSERT INTO queue_tmp(kara_id,priority)" "WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION, kara_id, priority" - " FROM queue)" - "SELECT POSITION, kara_id, priority" + " position, kara_id, priority" + " FROM queue" + " ORDER BY position ASC, priority DESC)" + "SELECT kara_id, priority" " FROM TEMP_TABLE WHERE POSITION < %d AND POSITION != %d ORDER BY POSITION;" /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" - " VALUES(%d,(" + "INSERT INTO queue_tmp(kara_id,priority)" + " VALUES((" " WITH TEMP_TABLE AS (" - " SELECT ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," + " SELECT ROW_NUMBER() OVER(ORDER BY position ASC, priority DESC) AS POSITION," " kara_id, priority FROM queue)" " SELECT kara_id FROM TEMP_TABLE WHERE POSITION = %d" " ),(" " WITH TEMP_TABLE AS (" - " SELECT ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," + " SELECT ROW_NUMBER() OVER(ORDER BY position ASC, priority DESC) AS POSITION," " kara_id, priority FROM queue)" - " SELECT priority FROM TEMP_TABLE WHERE POSITION = %d" + " SELECT priority FROM TEMP_TABLE WHERE POSITION = " + " CASE WHEN (SELECT COUNT(*) FROM TEMP_TABLE)>=%d THEN %d ELSE %d-1 END" " ));"; - - static const char *SQL_TEMPLATE_toSUPfrom_Part1 = - /* Clean queue_tmp */ - "DELETE FROM queue_tmp;" - "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';" - /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" - "WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION, kara_id, priority" - " FROM queue)" - "SELECT POSITION, kara_id, priority" - " FROM TEMP_TABLE WHERE POSITION < %d ORDER BY POSITION;" - /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" - "WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION, kara_id, priority" - " FROM queue)" - "SELECT POSITION - 1, kara_id, priority" - " FROM TEMP_TABLE WHERE POSITION > %d AND POSITION < %d ORDER BY POSITION;"; - static const char *SQL_TEMPLATE_toSUPfrom_Part2 = - /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" - " VALUES(%d-1,(" - " WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," - " kara_id, priority FROM queue)" - " SELECT kara_id FROM TEMP_TABLE WHERE POSITION = %d" - " ),(" - " WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," - " kara_id, priority FROM queue)" - " SELECT priority FROM TEMP_TABLE WHERE POSITION =" - " CASE WHEN (SELECT COUNT(*) FROM TEMP_TABLE)>=%d THEN %d ELSE %d-1 END" - "));"; - - static const char *SQL_TEMPLATE_PART_2_toINFfrom = + static const char *SQL_TEMPLATE_PART_2 = /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" - "WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," - " kara_id, priority FROM queue)" - "SELECT (POSITION+1) , kara_id, priority" - " FROM TEMP_TABLE WHERE POSITION >= %d AND POSITION < %d ORDER BY POSITION;" - "INSERT INTO queue_tmp(position, kara_id,priority)" - " WITH TEMP_TABLE AS (SELECT" - " ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," - " kara_id, priority" - " FROM queue)" - " SELECT POSITION , kara_id, priority" - " FROM TEMP_TABLE WHERE POSITION > %d AND POSITION >=%d ORDER BY POSITION;" - /* Clean queue and insert back */ - "DELETE FROM queue;" - "DELETE FROM sqlite_sequence WHERE name = 'queue';" - "INSERT INTO queue(position, kara_id, priority)" - " SELECT position, kara_id, priority FROM queue_tmp ORDER BY priority, position;" - /* Clean queue_tmp */ - "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';" - "DELETE FROM queue_tmp;"; - static const char *SQL_TEMPLATE_PART_2_toSUPfrom = - /* Construct queue */ - "INSERT INTO queue_tmp(position, kara_id,priority)" + "INSERT INTO queue_tmp(kara_id,priority)" "WITH TEMP_TABLE AS (" - " SELECT ROW_NUMBER() OVER(ORDER BY priority DESC, position ASC) AS POSITION," + " SELECT ROW_NUMBER() OVER(ORDER BY position ASC, priority DESC) AS POSITION," " kara_id, priority FROM queue)" - "SELECT POSITION , kara_id, priority" + "SELECT kara_id, priority" " FROM TEMP_TABLE WHERE POSITION >= %d AND POSITION != %d ORDER BY POSITION;" /* Clean queue and insert back */ + "UPDATE queue_state" + " SET current = CASE" + " WHEN current NOT NULL " + " THEN (SELECT position FROM queue_tmp " + " WHERE kara_id=(SELECT kara_id FROM queue WHERE position = current)" + " ELSE NULL END;" "DELETE FROM queue;" "DELETE FROM sqlite_sequence WHERE name = 'queue';" "INSERT INTO queue(position, kara_id, priority)" " SELECT position, kara_id, priority FROM queue_tmp ORDER BY priority, position;" /* Clean queue_tmp */ "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';" + "DELETE FROM queue_tmp;"; char SQL[LKT_MAX_SQLITE_STATEMENT]; SQLITE_EXEC(db, "BEGIN TRANSACTION;", error_no_rollback); - if (to < from) { - safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toINFfrom, to, from, to, from, to); - SQLITE_EXEC(db, SQL, error); - safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2_toINFfrom, to, from, from, to); - SQLITE_EXEC(db, SQL, error); - } - - else { - safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part1, from, from, to); + safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_1,to,from, from, to, to, to); SQLITE_EXEC(db, SQL, error); - safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part2, to, from, to, to, to); + safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2, to, from); SQLITE_EXEC(db, SQL, error); - safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2_toSUPfrom, to, from, from, to); - SQLITE_EXEC(db, SQL, error); - } - SQLITE_EXEC(db, "COMMIT;", error); return true; error: