diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-03-06 14:50:51 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-03-06 14:54:54 +0100 |
commit | 987b6838953ebd6ac3b1555080338e795b96e14d (patch) | |
tree | 5adbdad5d66915a7ee6bc433716cedc5646c545a /lib/private/db | |
parent | d11f040720b2142bc158d6cd3db63bb977bf937a (diff) | |
download | nextcloud-server-987b6838953ebd6ac3b1555080338e795b96e14d.tar.gz nextcloud-server-987b6838953ebd6ac3b1555080338e795b96e14d.zip |
Use an atomic implementation on sqlite for insertIfNotExist()
Diffstat (limited to 'lib/private/db')
-rw-r--r-- | lib/private/db/adaptersqlite.php | 42 |
1 files changed, 9 insertions, 33 deletions
diff --git a/lib/private/db/adaptersqlite.php b/lib/private/db/adaptersqlite.php index c5dfa85aaac..df4a804feb1 100644 --- a/lib/private/db/adaptersqlite.php +++ b/lib/private/db/adaptersqlite.php @@ -19,11 +19,13 @@ class AdapterSqlite extends Adapter { } public function insertIfNotExist($table, $input) { - // NOTE: For SQLite we have to use this clumsy approach - // otherwise all fieldnames used must have a unique key. - $query = 'SELECT COUNT(*) FROM `' . $table . '` WHERE '; - $inserts = array(); - foreach ($input as $key => $value) { + $fieldList = '`' . implode('`,`', array_keys($input)) . '`'; + $query = "INSERT INTO `$table` ($fieldList) SELECT " + . str_repeat('?,', count($input)-1).'? ' + . " WHERE NOT EXISTS (SELECT 1 FROM `$table` WHERE "; + + $inserts = array_values($input); + foreach($input as $key => $value) { $query .= '`' . $key . '`'; if (is_null($value)) { $query .= ' IS NULL AND '; @@ -33,34 +35,10 @@ class AdapterSqlite extends Adapter { } } $query = substr($query, 0, strlen($query) - 5); + $query .= ')'; try { - $stmt = $this->conn->prepare($query); - $result = $stmt->execute($inserts); - } catch(\Doctrine\DBAL\DBALException $e) { - $entry = 'DB Error: "'.$e->getMessage() . '"<br />'; - $entry .= 'Offending command was: ' . $query . '<br />'; - \OC_Log::write('core', $entry, \OC_Log::FATAL); - $l = \OC::$server->getL10N('lib'); - throw new \OC\HintException( - $l->t('Database Error'), - $l->t('Please contact your system administrator.'), - 0, - $e - ); - } - - if ($stmt->fetchColumn() === '0') { - $query = 'INSERT INTO `' . $table . '` (`' - . implode('`,`', array_keys($input)) . '`) VALUES(' - . str_repeat('?,', count($input)-1).'? ' . ')'; - } else { - return 0; //no rows updated - } - - try { - $statement = $this->conn->prepare($query); - $result = $statement->execute(array_values($input)); + return $this->conn->executeUpdate($query, $inserts); } catch(\Doctrine\DBAL\DBALException $e) { $entry = 'DB Error: "'.$e->getMessage() . '"<br />'; $entry .= 'Offending command was: ' . $query.'<br />'; @@ -73,7 +51,5 @@ class AdapterSqlite extends Adapter { $e ); } - - return $result; } } |