|
|
@@ -78,6 +78,8 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
/** @var DbDataCollector|null */ |
|
|
|
protected $dbDataCollector = null; |
|
|
|
|
|
|
|
private ?array $transactionBacktrace = null; |
|
|
|
|
|
|
|
/** |
|
|
|
* Initializes a new instance of the Connection class. |
|
|
|
* |
|
|
@@ -258,7 +260,12 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
$sql = $this->adapter->fixupStatement($sql); |
|
|
|
$this->queriesExecuted++; |
|
|
|
$this->logQueryToFile($sql); |
|
|
|
return parent::executeQuery($sql, $params, $types, $qcp); |
|
|
|
try { |
|
|
|
return parent::executeQuery($sql, $params, $types, $qcp); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->logDatabaseException($e); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -269,7 +276,12 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
$sql = $this->adapter->fixupStatement($sql); |
|
|
|
$this->queriesExecuted++; |
|
|
|
$this->logQueryToFile($sql); |
|
|
|
return parent::executeUpdate($sql, $params, $types); |
|
|
|
try { |
|
|
|
return parent::executeUpdate($sql, $params, $types); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->logDatabaseException($e); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -291,7 +303,12 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
$sql = $this->adapter->fixupStatement($sql); |
|
|
|
$this->queriesExecuted++; |
|
|
|
$this->logQueryToFile($sql); |
|
|
|
return (int)parent::executeStatement($sql, $params, $types); |
|
|
|
try { |
|
|
|
return (int)parent::executeStatement($sql, $params, $types); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->logDatabaseException($e); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
protected function logQueryToFile(string $sql): void { |
|
|
@@ -353,11 +370,21 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
* @deprecated 15.0.0 - use unique index and "try { $db->insert() } catch (UniqueConstraintViolationException $e) {}" instead, because it is more reliable and does not have the risk for deadlocks - see https://github.com/nextcloud/server/pull/12371 |
|
|
|
*/ |
|
|
|
public function insertIfNotExist($table, $input, array $compare = null) { |
|
|
|
return $this->adapter->insertIfNotExist($table, $input, $compare); |
|
|
|
try { |
|
|
|
return $this->adapter->insertIfNotExist($table, $input, $compare); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->logDatabaseException($e); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public function insertIgnoreConflict(string $table, array $values) : int { |
|
|
|
return $this->adapter->insertIgnoreConflict($table, $values); |
|
|
|
try { |
|
|
|
return $this->adapter->insertIgnoreConflict($table, $values); |
|
|
|
} catch (\Exception $e) { |
|
|
|
$this->logDatabaseException($e); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private function getType($value) { |
|
|
@@ -603,4 +630,35 @@ class Connection extends \Doctrine\DBAL\Connection { |
|
|
|
return new Migrator($this, $config, $dispatcher); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public function beginTransaction() { |
|
|
|
if (!$this->inTransaction()) { |
|
|
|
$this->transactionBacktrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); |
|
|
|
} |
|
|
|
return parent::beginTransaction(); |
|
|
|
} |
|
|
|
|
|
|
|
public function commit() { |
|
|
|
$result = parent::commit(); |
|
|
|
if ($this->getTransactionNestingLevel() === 0) { |
|
|
|
$this->transactionBacktrace = null; |
|
|
|
} |
|
|
|
return $result; |
|
|
|
} |
|
|
|
|
|
|
|
public function rollBack() { |
|
|
|
$result = parent::rollBack(); |
|
|
|
if ($this->getTransactionNestingLevel() === 0) { |
|
|
|
$this->transactionBacktrace = null; |
|
|
|
} |
|
|
|
return $result; |
|
|
|
} |
|
|
|
|
|
|
|
public function logDatabaseException(\Exception $exception): void { |
|
|
|
if ($exception instanceof Exception\UniqueConstraintViolationException) { |
|
|
|
$this->logger->info($exception->getMessage(), ['exception' => $exception, 'transaction' => $this->transactionBacktrace]); |
|
|
|
} else { |
|
|
|
$this->logger->error($exception->getMessage(), ['exception' => $exception, 'transaction' => $this->transactionBacktrace]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |