Skip to content

Commit

Permalink
chore(db): Make the query more simpler to read
Browse files Browse the repository at this point in the history
Signed-off-by: Git'Fellow <[email protected]>
  • Loading branch information
solracsf authored Sep 2, 2024
1 parent 3973a8f commit dfcf313
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions lib/private/DB/Adapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,10 @@ public function fixupStatement($statement) {
/**
* 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): void {
$this->conn->beginTransaction();
$this->conn->executeUpdate('LOCK TABLE `' .$tableName . '` IN EXCLUSIVE MODE');
}
Expand All @@ -61,7 +60,7 @@ public function lockTable($tableName) {
* @throws Exception
* @since 9.1.0
*/
public function unlockTable() {
public function unlockTable(): void {
$this->conn->commit();
}

Expand All @@ -79,13 +78,15 @@ public function unlockTable() {
* @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?
public function insertIfNotExist(string $table, array $input, ?array $compare = null): int {
$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);
Expand All @@ -104,10 +105,9 @@ public function insertIfNotExist($table, $input, ?array $compare = null) {
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;
}
}
Expand Down

0 comments on commit dfcf313

Please sign in to comment.