diff --git a/src/database/queue.c b/src/database/queue.c index a74fd07388c01548410ed7c469df48608f2a8931..6ef69d50de2cbb7d9064b88b00ee9d3e5ce38070 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -439,141 +439,135 @@ error: bool database_queue_move(volatile sqlite3 *db, int from, int to) { - /* stmt arguments in order: - * 1. to - * 2. to - * 3. from - */ + /* TODO: See if there is a solution with less lines of code */ + static const char *SQL_TEMPLATE_toINFfrom = - "BEGIN TRANSACTION;" + /* 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 AND POSITION != %d" - " ORDER BY POSITION;" + "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;" + /* Construct queue */ "INSERT INTO queue_tmp(position, kara_id,priority)" - " VALUES(%d,(" - " 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 = %d" - " ));"; + " VALUES(%d,(" + " 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 = %d" + " ));"; + static const char *SQL_TEMPLATE_toSUPfrom_Part1 = - "BEGIN TRANSACTION;" + /* 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;" + "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 = + "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 = + " 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 = + /* 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;" + "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;" + " 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;" - "DELETE FROM queue_tmp;" - "COMMIT;"; - static const char *SQL_TEMPLATE_PART_2_toSUPfrom = + " 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)" "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;" + " 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;" - "DELETE FROM queue_tmp;" - "COMMIT;"; - bool ret = false; - char SQL_Part1[LKT_MAX_SQLITE_STATEMENT]; - char SQL_Part2[LKT_MAX_SQLITE_STATEMENT]; - char SQL_Part3[LKT_MAX_SQLITE_STATEMENT]; - if(to < from) { - safe_snprintf(SQL_Part1, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toINFfrom, to, from, to, from, to); - safe_snprintf(SQL_Part2, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2_toINFfrom, to, from, from, to); - SQLITE_EXEC(db, SQL_Part1, error); - SQLITE_EXEC(db, SQL_Part2, error); + " 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_Part1, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part1, from, from, to); - safe_snprintf(SQL_Part2, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part2, to, from, to,to,to); - safe_snprintf(SQL_Part3, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_2_toSUPfrom, to, from, from, to); - SQLITE_EXEC(db, SQL_Part1, error); - SQLITE_EXEC(db, SQL_Part2, error); - SQLITE_EXEC(db, SQL_Part3, error); + safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part1, from, from, to); + SQLITE_EXEC(db, SQL, error); + + safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_toSUPfrom_Part2, to, from, to, to, to); + 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); } - ret = true; + + SQLITE_EXEC(db, "COMMIT;", error); return true; error: SQLITE_DO_ROLLBACK(db); - return ret; +error_no_rollback: + return false; } bool