Allow specifying the compare-array for insertIfNotExists()

This commit is contained in:
Joas Schilling 2015-03-09 17:25:02 +01:00 committed by Thomas Müller
parent 94b7fa17c5
commit 8fa692388b
8 changed files with 34 additions and 21 deletions

View File

@ -189,11 +189,18 @@ class AllConfig implements \OCP\IConfig {
return; return;
} }
$data = array($value, $userId, $appName, $key); $affectedRows = 0;
if (!$exists && $preCondition === null) { if (!$exists && $preCondition === null) {
$sql = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'. $this->connection->insertIfNotExist('*PREFIX*preferences', [
'VALUES (?, ?, ?, ?)'; 'configvalue' => $value,
'userid' => $userId,
'appid' => $appName,
'configkey' => $key,
], ['configvalue', 'userid', 'appid']);
$affectedRows = 1;
} elseif ($exists) { } elseif ($exists) {
$data = array($value, $userId, $appName, $key);
$sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '. $sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '.
'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? '; 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? ';
@ -206,8 +213,8 @@ class AllConfig implements \OCP\IConfig {
} }
$data[] = $preCondition; $data[] = $preCondition;
} }
$affectedRows = $this->connection->executeUpdate($sql, $data);
} }
$affectedRows = $this->connection->executeUpdate($sql, $data);
// only add to the cache if we already loaded data for the user // only add to the cache if we already loaded data for the user
if ($affectedRows > 0 && isset($this->userCache[$userId])) { if ($affectedRows > 0 && isset($this->userCache[$userId])) {

View File

@ -138,8 +138,8 @@ class Db implements IDb {
* @return bool * @return bool
* *
*/ */
public function insertIfNotExist($table, $input) { public function insertIfNotExist($table, $input, $compare = null) {
return $this->connection->insertIfNotExist($table, $input); return $this->connection->insertIfNotExist($table, $input, $compare);
} }
/** /**

View File

@ -172,8 +172,8 @@ class OC_DB {
* @param array $input An array of fieldname/value pairs * @param array $input An array of fieldname/value pairs
* @return boolean number of updated rows * @return boolean number of updated rows
*/ */
public static function insertIfNotExist($table, $input) { public static function insertIfNotExist($table, $input, $compare = null) {
return \OC::$server->getDatabaseConnection()->insertIfNotExist($table, $input); return \OC::$server->getDatabaseConnection()->insertIfNotExist($table, $input, $compare);
} }
/** /**

View File

@ -46,19 +46,22 @@ class Adapter {
* @throws \OC\HintException * @throws \OC\HintException
* @return int count of inserted rows * @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 . '` (`' $query = 'INSERT INTO `' .$table . '` (`'
. implode('`,`', array_keys($input)) . '`) SELECT ' . implode('`,`', array_keys($input)) . '`) SELECT '
. str_repeat('?,', count($input)-1).'? ' // Is there a prettier alternative? . str_repeat('?,', count($input)-1).'? ' // Is there a prettier alternative?
. 'FROM `' . $table . '` WHERE '; . 'FROM `' . $table . '` WHERE ';
$inserts = array_values($input); $inserts = array_values($input);
foreach($input as $key => $value) { foreach($compare as $key) {
$query .= '`' . $key . '`'; $query .= '`' . $key . '`';
if (is_null($value)) { if (is_null($input[$key])) {
$query .= ' IS NULL AND '; $query .= ' IS NULL AND ';
} else { } else {
$inserts[] = $value; $inserts[] = $input[$key];
$query .= ' = ? AND '; $query .= ' = ? AND ';
} }
} }

View File

@ -18,19 +18,22 @@ class AdapterSqlite extends Adapter {
return $statement; 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)) . '`'; $fieldList = '`' . implode('`,`', array_keys($input)) . '`';
$query = "INSERT INTO `$table` ($fieldList) SELECT " $query = "INSERT INTO `$table` ($fieldList) SELECT "
. str_repeat('?,', count($input)-1).'? ' . str_repeat('?,', count($input)-1).'? '
. " WHERE NOT EXISTS (SELECT 1 FROM `$table` WHERE "; . " WHERE NOT EXISTS (SELECT 1 FROM `$table` WHERE ";
$inserts = array_values($input); $inserts = array_values($input);
foreach($input as $key => $value) { foreach($compare as $key) {
$query .= '`' . $key . '`'; $query .= '`' . $key . '`';
if (is_null($value)) { if (is_null($input[$key])) {
$query .= ' IS NULL AND '; $query .= ' IS NULL AND ';
} else { } else {
$inserts[] = $value; $inserts[] = $input[$key];
$query .= ' = ? AND '; $query .= ' = ? AND ';
} }
} }

View File

@ -164,8 +164,8 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
* @throws \OC\HintException * @throws \OC\HintException
* @return bool The return value from execute() * @return bool The return value from execute()
*/ */
public function insertIfNotExist($table, $input) { public function insertIfNotExist($table, $input, $compare = null) {
return $this->adapter->insertIfNotExist($table, $input); return $this->adapter->insertIfNotExist($table, $input, $compare);
} }
/** /**

View File

@ -64,8 +64,8 @@ class DB {
* @return bool * @return bool
* *
*/ */
public static function insertIfNotExist($table, $input) { public static function insertIfNotExist($table, $input, $compare = null) {
return(\OC_DB::insertIfNotExist($table, $input)); return(\OC_DB::insertIfNotExist($table, $input, $compare));
} }
/** /**

View File

@ -94,7 +94,7 @@ interface IDBConnection {
* @return bool * @return bool
* *
*/ */
public function insertIfNotExist($table, $input); public function insertIfNotExist($table, $input, $compare = null);
/** /**
* Start a transaction * Start a transaction