Allow specifying the compare-array for insertIfNotExists()
This commit is contained in:
parent
94b7fa17c5
commit
8fa692388b
|
@ -189,11 +189,18 @@ class AllConfig implements \OCP\IConfig {
|
|||
return;
|
||||
}
|
||||
|
||||
$data = array($value, $userId, $appName, $key);
|
||||
$affectedRows = 0;
|
||||
if (!$exists && $preCondition === null) {
|
||||
$sql = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'.
|
||||
'VALUES (?, ?, ?, ?)';
|
||||
$this->connection->insertIfNotExist('*PREFIX*preferences', [
|
||||
'configvalue' => $value,
|
||||
'userid' => $userId,
|
||||
'appid' => $appName,
|
||||
'configkey' => $key,
|
||||
], ['configvalue', 'userid', 'appid']);
|
||||
$affectedRows = 1;
|
||||
} elseif ($exists) {
|
||||
$data = array($value, $userId, $appName, $key);
|
||||
|
||||
$sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '.
|
||||
'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? ';
|
||||
|
||||
|
@ -206,8 +213,8 @@ class AllConfig implements \OCP\IConfig {
|
|||
}
|
||||
$data[] = $preCondition;
|
||||
}
|
||||
}
|
||||
$affectedRows = $this->connection->executeUpdate($sql, $data);
|
||||
}
|
||||
|
||||
// only add to the cache if we already loaded data for the user
|
||||
if ($affectedRows > 0 && isset($this->userCache[$userId])) {
|
||||
|
|
|
@ -138,8 +138,8 @@ class Db implements IDb {
|
|||
* @return bool
|
||||
*
|
||||
*/
|
||||
public function insertIfNotExist($table, $input) {
|
||||
return $this->connection->insertIfNotExist($table, $input);
|
||||
public function insertIfNotExist($table, $input, $compare = null) {
|
||||
return $this->connection->insertIfNotExist($table, $input, $compare);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -172,8 +172,8 @@ class OC_DB {
|
|||
* @param array $input An array of fieldname/value pairs
|
||||
* @return boolean number of updated rows
|
||||
*/
|
||||
public static function insertIfNotExist($table, $input) {
|
||||
return \OC::$server->getDatabaseConnection()->insertIfNotExist($table, $input);
|
||||
public static function insertIfNotExist($table, $input, $compare = null) {
|
||||
return \OC::$server->getDatabaseConnection()->insertIfNotExist($table, $input, $compare);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -46,19 +46,22 @@ class Adapter {
|
|||
* @throws \OC\HintException
|
||||
* @return int count of inserted rows
|
||||
*/
|
||||
public function insertIfNotExist($table, $input) {
|
||||
public function insertIfNotExist($table, $input, $compare = null) {
|
||||
if ($compare === null) {
|
||||
$compare = array_keys($input);
|
||||
}
|
||||
$query = 'INSERT INTO `' .$table . '` (`'
|
||||
. implode('`,`', array_keys($input)) . '`) SELECT '
|
||||
. str_repeat('?,', count($input)-1).'? ' // Is there a prettier alternative?
|
||||
. 'FROM `' . $table . '` WHERE ';
|
||||
|
||||
$inserts = array_values($input);
|
||||
foreach($input as $key => $value) {
|
||||
foreach($compare as $key) {
|
||||
$query .= '`' . $key . '`';
|
||||
if (is_null($value)) {
|
||||
if (is_null($input[$key])) {
|
||||
$query .= ' IS NULL AND ';
|
||||
} else {
|
||||
$inserts[] = $value;
|
||||
$inserts[] = $input[$key];
|
||||
$query .= ' = ? AND ';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,19 +18,22 @@ class AdapterSqlite extends Adapter {
|
|||
return $statement;
|
||||
}
|
||||
|
||||
public function insertIfNotExist($table, $input) {
|
||||
public function insertIfNotExist($table, $input, $compare = null) {
|
||||
if ($compare === null) {
|
||||
$compare = array_keys($input);
|
||||
}
|
||||
$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) {
|
||||
foreach($compare as $key) {
|
||||
$query .= '`' . $key . '`';
|
||||
if (is_null($value)) {
|
||||
if (is_null($input[$key])) {
|
||||
$query .= ' IS NULL AND ';
|
||||
} else {
|
||||
$inserts[] = $value;
|
||||
$inserts[] = $input[$key];
|
||||
$query .= ' = ? AND ';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -164,8 +164,8 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
|
|||
* @throws \OC\HintException
|
||||
* @return bool The return value from execute()
|
||||
*/
|
||||
public function insertIfNotExist($table, $input) {
|
||||
return $this->adapter->insertIfNotExist($table, $input);
|
||||
public function insertIfNotExist($table, $input, $compare = null) {
|
||||
return $this->adapter->insertIfNotExist($table, $input, $compare);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -64,8 +64,8 @@ class DB {
|
|||
* @return bool
|
||||
*
|
||||
*/
|
||||
public static function insertIfNotExist($table, $input) {
|
||||
return(\OC_DB::insertIfNotExist($table, $input));
|
||||
public static function insertIfNotExist($table, $input, $compare = null) {
|
||||
return(\OC_DB::insertIfNotExist($table, $input, $compare));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -94,7 +94,7 @@ interface IDBConnection {
|
|||
* @return bool
|
||||
*
|
||||
*/
|
||||
public function insertIfNotExist($table, $input);
|
||||
public function insertIfNotExist($table, $input, $compare = null);
|
||||
|
||||
/**
|
||||
* Start a transaction
|
||||
|
|
Loading…
Reference in New Issue