diff --git a/config/config.sample.php b/config/config.sample.php index 280334477a6..f45e7dcc5e0 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -159,6 +159,13 @@ $CONFIG = [ ['user' => 'nextcloud', 'password' => 'password2', 'host' => 'replica2', 'dbname' => ''], ], +/** + * Add request id to the database query in a comment. + * + * This can be enabled to assist in mapping database logs to Nextcloud logs. + */ +'db.log_request_id' => false, + /** * Indicates whether the Nextcloud instance was installed successfully; ``true`` * indicates a successful installation, and ``false`` indicates an unsuccessful @@ -1965,7 +1972,7 @@ $CONFIG = [ /** * Blacklist characters from being used in filenames. This is useful if you * have a filesystem or OS which does not support certain characters like windows. - * + * * The '/' and '\' characters are always forbidden. * * Example for windows systems: ``array('?', '<', '>', ':', '*', '|', '"', chr(0), "\n", "\r")`` @@ -2311,7 +2318,7 @@ $CONFIG = [ /** * Timeout for the login form, after this time the login form is reset. * This prevents password leaks on public devices if the user forgots to clear the form. - * + * * Default is 5 minutes (300 seconds), a value of 0 means no timeout. */ 'login_form_timeout' => 300, diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php index 2e0582303f4..1340a388571 100644 --- a/lib/private/DB/Connection.php +++ b/lib/private/DB/Connection.php @@ -91,6 +91,9 @@ class Connection extends PrimaryReadReplicaConnection { /** @var array */ protected $tableDirtyWrites = []; + protected bool $logRequestId; + protected string $requestId; + /** * Initializes a new instance of the Connection class. * @@ -119,6 +122,9 @@ class Connection extends PrimaryReadReplicaConnection { $this->clock = Server::get(ClockInterface::class); $this->logger = Server::get(LoggerInterface::class); + $this->logRequestId = $this->systemConfig->getValue('db.log_request_id', false); + $this->requestId = Server::get(IRequestId::class)->getId(); + /** @var \OCP\Profiler\IProfiler */ $profiler = Server::get(IProfiler::class); if ($profiler->isEnabled()) { @@ -249,8 +255,7 @@ class Connection extends PrimaryReadReplicaConnection { $platform = $this->getDatabasePlatform(); $sql = $platform->modifyLimitQuery($sql, $limit, $offset); } - $statement = $this->replaceTablePrefix($sql); - $statement = $this->adapter->fixupStatement($statement); + $statement = $this->finishQuery($sql); return parent::prepare($statement); } @@ -307,8 +312,7 @@ class Connection extends PrimaryReadReplicaConnection { $this->ensureConnectedToPrimary(); } - $sql = $this->replaceTablePrefix($sql); - $sql = $this->adapter->fixupStatement($sql); + $sql = $this->finishQuery($sql); $this->queriesExecuted++; $this->logQueryToFile($sql); return parent::executeQuery($sql, $params, $types, $qcp); @@ -328,8 +332,7 @@ class Connection extends PrimaryReadReplicaConnection { * @throws Exception */ public function executeUpdate(string $sql, array $params = [], array $types = []): int { - $sql = $this->replaceTablePrefix($sql); - $sql = $this->adapter->fixupStatement($sql); + $sql = $this->finishQuery($sql); $this->queriesExecuted++; $this->logQueryToFile($sql); return parent::executeUpdate($sql, $params, $types); @@ -354,8 +357,7 @@ class Connection extends PrimaryReadReplicaConnection { foreach ($tables as $table) { $this->tableDirtyWrites[$table] = $this->clock->now()->getTimestamp(); } - $sql = $this->replaceTablePrefix($sql); - $sql = $this->adapter->fixupStatement($sql); + $sql = $this->finishQuery($sql); $this->queriesExecuted++; $this->logQueryToFile($sql); return (int)parent::executeStatement($sql, $params, $types); @@ -587,6 +589,16 @@ class Connection extends PrimaryReadReplicaConnection { return $schema->tablesExist([$table]); } + protected function finishQuery(string $statement): string { + $statement = $this->replaceTablePrefix($statement); + $statement = $this->adapter->fixupStatement($statement); + if ($this->logRequestId) { + return $statement . " /* reqid: " . $this->requestId . " */"; + } else { + return $statement; + } + } + // internal use /** * @param string $statement