mirror of
https://github.com/nextcloud/server.git
synced 2026-09-30 14:17:52 +02:00
The previous implementation of the idle timer runs on a strict 30 second interval and sends a dummy `SELECT` statement to keep the connection open. This generates issues with the `lastInsertId` on long-running tasks (like our CI pipeline), as the MariaDB documentation clearly states: > If the last query wasn't an INSERT or UPDATE statement or if the modified table does not have a column with the AUTO_INCREMENT attribute and LAST_INSERT_ID was not used, this function will return zero. Source: https://mariadb.com/docs/connectors/mariadb-connector-c/api-functions/mysql_insert_id To mitigate that, this commit now uses a real idle-timer per connection instead. Assisted-by: ClaudeCode:claude-fable-5 Signed-off-by: David Dreschner <david.dreschner@nextcloud.com>
58 lines
1.6 KiB
PHP
58 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
namespace OC\DB\Middleware;
|
|
|
|
use Doctrine\DBAL\Driver\Connection;
|
|
use Doctrine\DBAL\Driver\Middleware\AbstractConnectionMiddleware;
|
|
use Doctrine\DBAL\Driver\PDO\Connection as PDOConnection;
|
|
use Doctrine\DBAL\Driver\Result;
|
|
use Doctrine\DBAL\Driver\Statement;
|
|
|
|
final class ConnectionActivityConnection extends AbstractConnectionMiddleware {
|
|
public function __construct(
|
|
private Connection $inner,
|
|
private ConnectionActivityNotifier $notifier,
|
|
) {
|
|
parent::__construct($inner);
|
|
}
|
|
|
|
/**
|
|
* Kept working for consumers that reach the native PDO handle through the
|
|
* deprecated accessor, like SQLiteSessionInit: forwarding is intentionally
|
|
* preferred over migrating the callers, as those code paths get refactored
|
|
* with the DBAL 4 upgrade anyway.
|
|
*/
|
|
public function getWrappedConnection(): \PDO {
|
|
if (!$this->inner instanceof PDOConnection) {
|
|
throw new \LogicException('The wrapped connection is not a PDO based connection');
|
|
}
|
|
return $this->inner->getWrappedConnection();
|
|
}
|
|
|
|
#[\Override]
|
|
public function prepare(string $sql): Statement {
|
|
return new ConnectionActivityStatement(parent::prepare($sql), $this->notifier);
|
|
}
|
|
|
|
#[\Override]
|
|
public function query(string $sql): Result {
|
|
$result = parent::query($sql);
|
|
$this->notifier->notify();
|
|
return $result;
|
|
}
|
|
|
|
#[\Override]
|
|
public function exec(string $sql): int {
|
|
$result = parent::exec($sql);
|
|
$this->notifier->notify();
|
|
return $result;
|
|
}
|
|
}
|