mirror of
https://github.com/nextcloud/server.git
synced 2026-04-15 22:11:17 -04:00
Merge pull request #47675 from nextcloud/adapterQueryOpti
This commit is contained in:
commit
7efd244956
1 changed files with 12 additions and 12 deletions
|
|
@ -46,11 +46,10 @@ class Adapter {
|
|||
/**
|
||||
* Create an exclusive read+write lock on a table
|
||||
*
|
||||
* @param string $tableName
|
||||
* @throws Exception
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function lockTable($tableName) {
|
||||
public function lockTable(string $tableName) {
|
||||
$this->conn->beginTransaction();
|
||||
$this->conn->executeUpdate('LOCK TABLE `' .$tableName . '` IN EXCLUSIVE MODE');
|
||||
}
|
||||
|
|
@ -80,12 +79,14 @@ class Adapter {
|
|||
* @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) {
|
||||
if (empty($compare)) {
|
||||
$compare = array_keys($input);
|
||||
}
|
||||
$query = 'INSERT INTO `' .$table . '` (`'
|
||||
. implode('`,`', array_keys($input)) . '`) SELECT '
|
||||
. str_repeat('?,', count($input) - 1).'? ' // Is there a prettier alternative?
|
||||
$compare = $compare ?: array_keys($input);
|
||||
|
||||
// Prepare column names and generate placeholders
|
||||
$columns = '`' . implode('`,`', array_keys($input)) . '`';
|
||||
$placeholders = implode(', ', array_fill(0, count($input), '?'));
|
||||
|
||||
$query = 'INSERT INTO `' . $table . '` (' . $columns . ') '
|
||||
. 'SELECT ' . $placeholders . ' '
|
||||
. 'FROM `' . $table . '` WHERE ';
|
||||
|
||||
$inserts = array_values($input);
|
||||
|
|
@ -104,10 +105,9 @@ class Adapter {
|
|||
try {
|
||||
return $this->conn->executeUpdate($query, $inserts);
|
||||
} catch (UniqueConstraintViolationException $e) {
|
||||
// if this is thrown then a concurrent insert happened between the insert and the sub-select in the insert, that should have avoided it
|
||||
// it's fine to ignore this then
|
||||
//
|
||||
// more discussions about this can be found at https://github.com/nextcloud/server/pull/12315
|
||||
// This exception indicates a concurrent insert happened between
|
||||
// the insert and the sub-select in the insert, which is safe to ignore.
|
||||
// More details: https://github.com/nextcloud/server/pull/12315
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue