aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Tanghus <thomas@tanghus.net>2012-09-17 16:01:25 +0200
committerThomas Tanghus <thomas@tanghus.net>2012-09-17 16:01:25 +0200
commitffe04182a86a326861763a5e6afa3577c52e07a5 (patch)
tree61a9cdb5d01a0d344d539240c3795865b4b7a089
parent6568671bdccb335ef7daddac0147056f457a3ea4 (diff)
downloadnextcloud-server-ffe04182a86a326861763a5e6afa3577c52e07a5.tar.gz
nextcloud-server-ffe04182a86a326861763a5e6afa3577c52e07a5.zip
Added methods OC_DB::insertIfNotExist() and OCP\DB::insertIfNotExist().
-rw-r--r--lib/db.php49
-rw-r--r--lib/public/db.php21
2 files changed, 70 insertions, 0 deletions
diff --git a/lib/db.php b/lib/db.php
index 4d8e5a1a868..8598f659cad 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -513,6 +513,55 @@ class OC_DB {
}
/**
+ * @brief Insert a row if a matching row doesn't exists.
+ * @returns true/false
+ *
+ */
+ public static function insertIfNotExist($table, $input) {
+ self::connect();
+ $prefix = OC_Config::getValue( "dbtableprefix", "oc_" );
+ $table = str_replace( '*PREFIX*', $prefix, $table );
+
+ if(is_null(self::$type)) {
+ self::$type=OC_Config::getValue( "dbtype", "sqlite" );
+ }
+ $type = self::$type;
+
+ $query = '';
+ // differences in escaping of table names ('`' for mysql) and getting the current timestamp
+ if( $type == 'sqlite' || $type == 'sqlite3' ) {
+ $query = 'REPLACE OR INSERT INTO "' . $table . '" ("'
+ . implode('","', array_keys($input)) . '") VALUES("'
+ . implode('","', array_values($input)) . '")';
+ } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql') {
+ $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::$connection->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);
+ die( $entry );
+ }
+
+ $result = new PDOStatementWrapper($result);
+ $result->execute();
+ }
+
+ /**
* @brief does minor chages to query
* @param $query Query string
* @returns corrected query string
diff --git a/lib/public/db.php b/lib/public/db.php
index 6ce62b27ca2..b9e56985e9d 100644
--- a/lib/public/db.php
+++ b/lib/public/db.php
@@ -46,6 +46,27 @@ class DB {
}
/**
+ * @brief Insert a row if a matching row doesn't exists.
+ * @param $table string The table name (will replace *PREFIX*) to perform the replace on.
+ * @param $input array
+ *
+ * The input array if in the form:
+ *
+ * array ( 'id' => array ( 'value' => 6,
+ * 'key' => true
+ * ),
+ * 'name' => array ('value' => 'Stoyan'),
+ * 'family' => array ('value' => 'Stefanov'),
+ * 'birth_date' => array ('value' => '1975-06-20')
+ * );
+ * @returns true/false
+ *
+ */
+ public static function insertIfNotExist($table, $input) {
+ return(\OC_DB::insertIfNotExist($table, $input));
+ }
+
+ /**
* @brief gets last value of autoincrement
* @param $table string The optional table name (will replace *PREFIX*) and add sequence suffix
* @returns id