Skip to content
Extraits de code Groupes Projets

Fix move command

Fusionnées Deurstann a demandé de fusionner fix_move_command vers martin2018-master-patch-10517
1 file
+ 25
89
Comparer les modifications
  • Côte à côte
  • En ligne
+ 25
89
@@ -574,128 +574,64 @@ 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 =
static const char *SQL_TEMPLATE_PART_2 =
/* 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 =
/* 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:
Chargement en cours