diff options
author | Thomas Tanghus <thomas@tanghus.net> | 2012-11-12 23:34:02 +0100 |
---|---|---|
committer | Thomas Tanghus <thomas@tanghus.net> | 2012-11-12 23:34:02 +0100 |
commit | d809efc1e5a90ee6e699620ce7081ad4c34876c2 (patch) | |
tree | d59a8996be58fde140134c9497a2303e107cfb71 /lib/db.php | |
parent | 42b871dcf1353ceddf9d98a960b133fecddbff6f (diff) | |
download | nextcloud-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.php | 48 |
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 ); } |