aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/DB/Adapter.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/DB/Adapter.php')
-rw-r--r--lib/private/DB/Adapter.php32
1 files changed, 16 insertions, 16 deletions
diff --git a/lib/private/DB/Adapter.php b/lib/private/DB/Adapter.php
index b5be14e5dc6..8f1b8e6d75f 100644
--- a/lib/private/DB/Adapter.php
+++ b/lib/private/DB/Adapter.php
@@ -32,7 +32,7 @@ class Adapter {
* @throws Exception
*/
public function lastInsertId($table) {
- return (int) $this->conn->realLastInsertId($table);
+ return (int)$this->conn->realLastInsertId($table);
}
/**
@@ -46,13 +46,12 @@ 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');
+ $this->conn->executeUpdate('LOCK TABLE `' . $tableName . '` IN EXCLUSIVE MODE');
}
/**
@@ -73,19 +72,21 @@ class Adapter {
* @param string $table The table name (will replace *PREFIX* with the actual prefix)
* @param array $input data that should be inserted into the table (column name => value)
* @param array|null $compare List of values that should be checked for "if not exists"
- * If this is null or an empty array, all keys of $input will be compared
- * Please note: text fields (clob) must not be used in the compare array
+ * If this is null or an empty array, all keys of $input will be compared
+ * Please note: text fields (clob) must not be used in the compare array
* @return int number of inserted rows
* @throws Exception
* @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;
}
}