mirror of
https://github.com/nextcloud/server.git
synced 2026-02-20 00:12:30 -05:00
feat(dbal): add proper insert ignore conflict method for MySQL
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
This commit is contained in:
parent
4680bc47c2
commit
1e19566aa4
1 changed files with 28 additions and 0 deletions
|
|
@ -35,4 +35,32 @@ class AdapterMySQL extends Adapter {
|
|||
|
||||
return $this->collation;
|
||||
}
|
||||
|
||||
public function insertIgnoreConflict(string $table, array $values): int {
|
||||
$builder = $this->conn->getQueryBuilder();
|
||||
$builder->insert($table);
|
||||
$updates = [];
|
||||
foreach ($values as $key => $value) {
|
||||
$builder->setValue($key, $builder->createNamedParameter($value));
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use ON DUPLICATE KEY UPDATE here because Nextcloud use the CLIENT_FOUND_ROWS flag
|
||||
* With this flag the MySQL returns the number of selected rows
|
||||
* instead of the number of affected/modified rows
|
||||
* It's impossible to change this behaviour at runtime or for a single query
|
||||
* Then, the result is 1 if a row is inserted and also 1 if a row is updated with same or different values
|
||||
*
|
||||
* With INSERT IGNORE, the result is 1 when a row is inserted, 0 otherwise
|
||||
*
|
||||
* Risk: it can also ignore other errors like type mismatch or truncated data…
|
||||
*/
|
||||
$res = $this->conn->executeStatement(
|
||||
preg_replace('/^INSERT/i', 'INSERT IGNORE', $builder->getSQL()),
|
||||
$builder->getParameters(),
|
||||
$builder->getParameterTypes()
|
||||
);
|
||||
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue