From da5861873fd57d0146e69b875da1f813cf95a184 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 22 Jul 2026 14:24:24 -0400 Subject: [PATCH 1/3] fix(background-jobs): bind Snowflake job IDs as strings Signed-off-by: Josh --- lib/private/BackgroundJob/JobList.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php index 2ec8f663b3f7e..dbd24767a90db 100644 --- a/lib/private/BackgroundJob/JobList.php +++ b/lib/private/BackgroundJob/JobList.php @@ -112,7 +112,7 @@ public function remove(IJob|string $job, mixed $argument = null): void { public function removeById(string $id): void { $query = $this->connection->getQueryBuilder(); $query->delete('jobs') - ->where($query->expr()->eq('id', $query->createNamedParameter($id, IQueryBuilder::PARAM_INT))); + ->where($query->expr()->eq('id', $query->createNamedParameter($id))); $query->executeStatement(); } @@ -262,7 +262,7 @@ public function getNext(bool $onlyTimeSensitive = false, ?array $jobClasses = nu $reset->update('jobs') ->set('reserved_at', $reset->expr()->literal(0, IQueryBuilder::PARAM_INT)) ->set('last_checked', $reset->createNamedParameter($this->timeFactory->getTime() + 12 * 3600, IQueryBuilder::PARAM_INT)) - ->where($reset->expr()->eq('id', $reset->createNamedParameter($row['id'], IQueryBuilder::PARAM_INT))); + ->where($reset->expr()->eq('id', $reset->createNamedParameter($row['id']))); $reset->executeStatement(); // Background job from disabled app, try again. @@ -354,7 +354,7 @@ public function unlockJob(IJob $job): void { $query = $this->connection->getQueryBuilder(); $query->update('jobs') ->set('reserved_at', $query->expr()->literal(0, IQueryBuilder::PARAM_INT)) - ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId(), IQueryBuilder::PARAM_INT))); + ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId()))); $query->executeStatement(); } @@ -379,7 +379,7 @@ public function setExecutionTime(IJob $job, $timeTaken): void { $query->update('jobs') ->set('execution_duration', $query->createNamedParameter($timeTaken, IQueryBuilder::PARAM_INT)) ->set('reserved_at', $query->createNamedParameter(0, IQueryBuilder::PARAM_INT)) - ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId(), IQueryBuilder::PARAM_INT))); + ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId()))); $query->executeStatement(); } @@ -389,7 +389,7 @@ public function resetBackgroundJob(IJob $job): void { $query->update('jobs') ->set('last_run', $query->createNamedParameter(0, IQueryBuilder::PARAM_INT)) ->set('reserved_at', $query->createNamedParameter(0, IQueryBuilder::PARAM_INT)) - ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId()), IQueryBuilder::PARAM_INT)); + ->where($query->expr()->eq('id', $query->createNamedParameter($job->getId()))); $query->executeStatement(); } From c33f4a75242e2b8df37ab8e2b13401b157a61bef Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 22 Jul 2026 14:26:34 -0400 Subject: [PATCH 2/3] fix(dav): bind Snowflake job IDs as strings in UserStatusAutomation Signed-off-by: Josh --- apps/dav/lib/BackgroundJob/UserStatusAutomation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dav/lib/BackgroundJob/UserStatusAutomation.php b/apps/dav/lib/BackgroundJob/UserStatusAutomation.php index 027b33498020e..61a5cab0ec79c 100644 --- a/apps/dav/lib/BackgroundJob/UserStatusAutomation.php +++ b/apps/dav/lib/BackgroundJob/UserStatusAutomation.php @@ -89,7 +89,7 @@ protected function setLastRunToNextToggleTime(string $userId, int $timestamp): v $query->update('jobs') ->set('last_run', $query->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT)) - ->where($query->expr()->eq('id', $query->createNamedParameter($this->getId(), IQueryBuilder::PARAM_INT))); + ->where($query->expr()->eq('id', $query->createNamedParameter($this->getId()))); $query->executeStatement(); $this->logger->debug('Updated user status automation last_run to ' . $timestamp . ' for user ' . $userId); From a03cefea7a190fbc8628204b526bd6e2759bb614 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 22 Jul 2026 14:30:21 -0400 Subject: [PATCH 3/3] test(background-jobs): cover string-bound Snowflake job IDs Assisted-By: Copilot:GPT-5.6 Signed-off-by: Josh --- tests/lib/BackgroundJob/JobListTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/lib/BackgroundJob/JobListTest.php b/tests/lib/BackgroundJob/JobListTest.php index df3cd451be4eb..ff10b1edecde0 100644 --- a/tests/lib/BackgroundJob/JobListTest.php +++ b/tests/lib/BackgroundJob/JobListTest.php @@ -272,6 +272,26 @@ public function testSetLastRun(): void { $this->assertLessThanOrEqual($timeEnd, $addedJob->getLastRun()); } + public function testRemoveByIdWithSnowflakeId(): void { + $this->instance->add(new TestJob(), 'remove-by-id'); + $job = $this->instance->getJobs(null, 1, 0)[0]; + + $this->instance->removeById($job->getId()); + + $this->assertNull($this->instance->getById($job->getId())); + } + + public function testResetBackgroundJobWithSnowflakeId(): void { + $this->instance->add(new TestJob(), 'reset'); + $job = $this->instance->getJobs(null, 1, 0)[0]; + + $this->instance->resetBackgroundJob($job); + + $row = $this->instance->getDetailsById($job->getId()); + $this->assertSame('0', (string)$row['last_run']); + $this->assertSame('0', (string)$row['reserved_at']); + } + public function testHasReservedJobs(): void { $this->clearJobsList();