diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py index 4dc5d0e6..f77e2107 100644 --- a/src/ahriman/core/database/operations/logs_operations.py +++ b/src/ahriman/core/database/operations/logs_operations.py @@ -153,10 +153,13 @@ class LogsOperations(Operations): """ delete from logs where (package_base, repository, process_id) in ( - select package_base, repository, process_id from logs - where repository = :repository - group by package_base, repository, process_id - order by min(created) desc limit -1 offset :offset + select package_base, repository, process_id from ( + select package_base, repository, process_id, row_number() over (partition by package_base order by max(created) desc) as rn + from logs + where repository = :repository + group by package_base, repository, process_id + ) + where rn > :offset ) """, { diff --git a/tests/ahriman/core/database/operations/test_logs_operations.py b/tests/ahriman/core/database/operations/test_logs_operations.py index 5257955d..65320d10 100644 --- a/tests/ahriman/core/database/operations/test_logs_operations.py +++ b/tests/ahriman/core/database/operations/test_logs_operations.py @@ -93,6 +93,27 @@ def test_logs_insert_get_multi(database: SQLite, package_ahriman: Package) -> No ] +def test_logs_rotate_remove_older(database: SQLite, package_ahriman: Package, + package_python_schedule: Package) -> None: + """ + must correctly remove old records + """ + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p1"), 42.0, "message 1")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p1"), 43.0, "message 2")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 44.0, "message 3")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 45.0, "message 4")) + database.logs_insert(LogRecord(LogRecordId(package_python_schedule.base, "3", "p1"), 40.0, "message 5")) + + database.logs_rotate(1) + assert database.logs_get(package_ahriman.base) == [ + LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 44.0, "message 3"), + LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 45.0, "message 4"), + ] + assert database.logs_get(package_python_schedule.base) == [ + LogRecord(LogRecordId(package_python_schedule.base, "3", "p1"), 40.0, "message 5"), + ] + + def test_logs_rotate_remove_all(database: SQLite, package_ahriman: Package) -> None: """ must remove all records when rotating with keep_last_records is 0