diff --git a/inc/lektor/internal/dbmacro.h b/inc/lektor/internal/dbmacro.h index a95710b0ee41ecef40ede8217e2afa5b86f98a8f..e93d539b1ae5264b27d0d40ab311831adfe0b4e2 100644 --- a/inc/lektor/internal/dbmacro.h +++ b/inc/lektor/internal/dbmacro.h @@ -73,9 +73,11 @@ #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); +#define SQLITE_DO_ROLLBACK(db) \ + { \ + LOG_WARN("DB-DEBUG", "DO ROLLBACK \\o/"); \ + sqlite3_exec((sqlite3 *)db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL); \ + } #define sqlite3_column_chars (const char *)sqlite3_column_text diff --git a/src/database/queue.c b/src/database/queue.c index 1601eb2ecfb99ee6334ca85ad17e5e9df0959f63..f92eb02b348cd4027df0f1093816184e3f4aede1 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -608,17 +608,18 @@ database_queue_prev(lkt_db *db, char filepath[PATH_MAX]) " END" " ORDER BY position DESC LIMIT 1;"; char SQL_UPDATE[LKT_MAX_SQLITE_STATEMENT]; - bool status = false; - int code = SQLITE_OK, id; + int code = SQLITE_OK; sqlite3_stmt *stmt = NULL; + SQLITE_BEGIN_TRANSATION(db, error_failed_to_begin_transaction); + SQLITE_PREPARE(db, stmt, SQL_STMT, error); code = sqlite3_step(stmt); if (code == SQLITE_ROW) { - id = MAX(1, sqlite3_column_int(stmt, 1)); - safe_snprintf(SQL_UPDATE, LKT_MAX_SQLITE_STATEMENT, "UPDATE queue_state SET current = %d;", - id); + int id = MAX(1, sqlite3_column_int(stmt, 1)); + static const char *SQL_TMPL_UPDATE = "UPDATE queue_state SET current = %d;"; + safe_snprintf(SQL_UPDATE, LKT_MAX_SQLITE_STATEMENT, SQL_TMPL_UPDATE, id); if (filepath != NULL) strncpy(filepath, sqlite3_column_chars(stmt, 0), PATH_MAX - 1); @@ -639,10 +640,19 @@ database_queue_prev(lkt_db *db, char filepath[PATH_MAX]) } SQLITE_EXEC(db, SQL_UPDATE, error); - status = true; + unless (___database_back_propagate_priority(db)) + goto error; + sqlite3_finalize(stmt); + SQLITE_END_TRANSATION(db, error); + return true; + error: + SQLITE_DO_ROLLBACK(db); sqlite3_finalize(stmt); - return status; + return false; + +error_failed_to_begin_transaction: + return false; } bool