Skip to content
Extraits de code Groupes Projets
Valider 7336ea5c rédigé par Deurstann's avatar Deurstann
Parcourir les fichiers

Fixed move command

parent e099fe11
Aucune branche associée trouvée
Aucune étiquette associée trouvée
2 requêtes de fusion!143Fix move command,!141Improve MPD compatibility
......@@ -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,"
" kara_id, priority FROM queue)"
" SELECT priority FROM TEMP_TABLE WHERE POSITION = %d"
" ));";
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,"
" SELECT ROW_NUMBER() OVER(ORDER BY position ASC, priority DESC) 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);
safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE_PART_1,to,from, from, to, to, 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_2, to, from);
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);
}
SQLITE_EXEC(db, "COMMIT;", error);
return true;
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