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

DB: Reset the priority on played kara

MPD specifies that a music that has been played should have its priority
reset to the default, here the minimal priority. Only do that on next
kara for the moment.
parent 7ec6c7f0
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!173Update priority on next/prev operations
......@@ -44,6 +44,8 @@ extern EXIT_FUNCTION ___not_implemented(const char *func, char *file, int line);
} \
}
#define unless(cond) if (!(cond))
#define FAIL_UNLESS(cond, ...) FAIL_IF(!(cond), __VA_ARGS__)
#define GOTO_UNLESS(cond, msg, label) GOTO_IF(!(cond), msg, label)
#define RETURN_UNLESS(cond, msg, ret) RETURN_IF(!(cond), msg, ret)
......
......@@ -62,6 +62,8 @@
#define SQLITE_STEP_ROW(db, stmt, error) SQLITE_STEP(db, stmt, SQLITE_ROW, error)
#define SQLITE_STEP_DONE(db, stmt, error) SQLITE_STEP(db, stmt, SQLITE_DONE, error)
#define SQLITE_BEGIN_TRANSATION(db, error) SQLITE_EXEC(db, "BEGIN TRANSATION;", error)
#define SQLITE_END_TRANSATION(db, error) SQLITE_EXEC(db, "END TRANSATION;", error)
#define SQLITE_DO_ROLLBACK(db) \
LOG_WARN("DB-DEBUG", "DO ROLLBACK \\o/"); \
sqlite3_exec((sqlite3 *)db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL);
......
......@@ -369,6 +369,8 @@ error:
bool
database_queue_del_pos(lkt_db *db, int pos)
{
/* /!\ WARNING: UGLY GOTOS AT THE END OF THE FUNCTION /!\ */
bool sta = false;
sqlite3_stmt *stmt = NULL;
struct lkt_queue_state queue = { .current = -1 };
......@@ -435,6 +437,23 @@ error_no_rollback:
return sta;
}
/* When a kara has been played, MPD specify that its priority shall be reset,
* thus we set it to 1 before passing to the next kara. It's not done when
* passing to the previous kara because the reorder operation would break
* everything in the queue. */
PRIVATE_FUNCTION bool
___database_queue_reset_current_priority(lkt_db *db)
{
static const char *SQL_STMT = "UPDATE queue"
" SET priority = 1"
" WHERE position = (SELECT current FROM queue_state LIMIT 1);";
SQLITE_EXEC(db, SQL_STMT, error);
return true;
error:
LOG_ERROR("DB", "Failed to reset the priority of played kara!");
return false;
}
bool
database_queue_next(lkt_db *db, char filepath[PATH_MAX])
{
......@@ -454,6 +473,9 @@ database_queue_next(lkt_db *db, char filepath[PATH_MAX])
int code = SQLITE_OK, id;
sqlite3_stmt *stmt = NULL;
SQLITE_BEGIN_TRANSATION(db, error_no_stmt);
unless (___database_queue_reset_current_priority(db))
goto error_no_stmt;
SQLITE_PREPARE(db, stmt, SQL_STMT, error);
code = sqlite3_step(stmt);
......@@ -482,9 +504,12 @@ database_queue_next(lkt_db *db, char filepath[PATH_MAX])
}
SQLITE_EXEC(db, SQL_UPDATE, error);
SQLITE_END_TRANSATION(db, error);
status = true;
error:
sqlite3_finalize(stmt);
error_no_stmt:
SQLITE_DO_ROLLBACK(db);
return status;
}
......
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