summaryrefslogtreecommitdiffstats
path: root/lib/db.php
diff options
context:
space:
mode:
authorThomas Tanghus <thomas@tanghus.net>2012-11-12 23:34:02 +0100
committerThomas Tanghus <thomas@tanghus.net>2012-11-12 23:34:02 +0100
commitd809efc1e5a90ee6e699620ce7081ad4c34876c2 (patch)
treed59a8996be58fde140134c9497a2303e107cfb71 /lib/db.php
parent42b871dcf1353ceddf9d98a960b133fecddbff6f (diff)
downloadnextcloud-server-d809efc1e5a90ee6e699620ce7081ad4c34876c2.tar.gz
nextcloud-server-d809efc1e5a90ee6e699620ce7081ad4c34876c2.zip
Change insertIfNotExist() for sqlite. Not fast, but more reliable than previous attempt.
Diffstat (limited to 'lib/db.php')
-rw-r--r--lib/db.php48
1 files changed, 36 insertions, 12 deletions
diff --git a/lib/db.php b/lib/db.php
index 2ed624cdd72..de42626563d 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -543,8 +543,9 @@ class OC_DB {
/**
* @brief Insert a row if a matching row doesn't exists.
- * @returns true/false
- *
+ * @param string $table. The table to insert into in the form '*PREFIX*tableName'
+ * @param array $input. An array of fieldname/value pairs
+ * @returns The return value from PDOStatementWrapper->execute()
*/
public static function insertIfNotExist($table, $input) {
self::connect();
@@ -559,30 +560,53 @@ class OC_DB {
$query = '';
// differences in escaping of table names ('`' for mysql) and getting the current timestamp
if( $type == 'sqlite' || $type == 'sqlite3' ) {
- $query = 'INSERT OR REPLACE INTO "' . $table . '" ("'
- . implode('","', array_keys($input)) . '") VALUES("'
- . implode('","', array_values($input)) . '")';
+ // NOTE: For SQLite we have to use this clumsy approach
+ // otherwise all fieldnames used must have a unique key.
+ $query = 'SELECT * FROM "' . $table . '" WHERE ';
+ foreach($input as $key => $value) {
+ $query .= $key . " = '" . $value . '\' AND ';
+ }
+ $query = substr($query, 0, strlen($query) - 5);
+ try {
+ $stmt = self::prepare($query);
+ $result = $stmt->execute();
+ } catch(PDOException $e) {
+ $entry = 'DB Error: "'.$e->getMessage() . '"<br />';
+ $entry .= 'Offending command was: ' . $query . '<br />';
+ OC_Log::write('core', $entry, OC_Log::FATAL);
+ error_log('DB error: '.$entry);
+ die( $entry );
+ }
+
+ if($result->numRows() == 0) {
+ $query = 'INSERT INTO "' . $table . '" ("'
+ . implode('","', array_keys($input)) . '") VALUES("'
+ . implode('","', array_values($input)) . '")';
+ } else {
+ return true;
+ }
} elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql') {
- $query = 'INSERT INTO `' .$table . '` ('
- . implode(',', array_keys($input)) . ') SELECT \''
+ $query = 'INSERT INTO `' .$table . '` ('
+ . implode(',', array_keys($input)) . ') SELECT \''
. implode('\',\'', array_values($input)) . '\' FROM ' . $table . ' WHERE ';
-
+
foreach($input as $key => $value) {
$query .= $key . " = '" . $value . '\' AND ';
}
$query = substr($query, 0, strlen($query) - 5);
$query .= ' HAVING COUNT(*) = 0';
}
+
// TODO: oci should be use " (quote) instead of ` (backtick).
//OC_Log::write('core', __METHOD__ . ', type: ' . $type . ', query: ' . $query, OC_Log::DEBUG);
try {
$result = self::prepare($query);
} catch(PDOException $e) {
- $entry = 'DB Error: "'.$e->getMessage().'"<br />';
- $entry .= 'Offending command was: '.$query.'<br />';
- OC_Log::write('core', $entry,OC_Log::FATAL);
- error_log('DB error: '.$entry);
+ $entry = 'DB Error: "'.$e->getMessage() . '"<br />';
+ $entry .= 'Offending command was: ' . $query.'<br />';
+ OC_Log::write('core', $entry, OC_Log::FATAL);
+ error_log('DB error: ' . $entry);
die( $entry );
}