ON Conflict for postgres
This commit is contained in:
parent
94eb70c24e
commit
63fcba9dd9
@ -4,6 +4,7 @@ namespace Driver\SQL;
|
|||||||
|
|
||||||
use \Api\Parameter\Parameter;
|
use \Api\Parameter\Parameter;
|
||||||
|
|
||||||
|
use Driver\SQL\Column\Column;
|
||||||
use \Driver\SQL\Column\IntColumn;
|
use \Driver\SQL\Column\IntColumn;
|
||||||
use \Driver\SQL\Column\SerialColumn;
|
use \Driver\SQL\Column\SerialColumn;
|
||||||
use \Driver\SQL\Column\StringColumn;
|
use \Driver\SQL\Column\StringColumn;
|
||||||
@ -12,7 +13,9 @@ use \Driver\SQL\Column\DateTimeColumn;
|
|||||||
use Driver\SQL\Column\BoolColumn;
|
use Driver\SQL\Column\BoolColumn;
|
||||||
use Driver\SQL\Column\JsonColumn;
|
use Driver\SQL\Column\JsonColumn;
|
||||||
|
|
||||||
|
use Driver\SQL\Expression\Add;
|
||||||
use Driver\SQL\Strategy\Strategy;
|
use Driver\SQL\Strategy\Strategy;
|
||||||
|
use Driver\SQL\Strategy\UpdateStrategy;
|
||||||
|
|
||||||
class PostgreSQL extends SQL {
|
class PostgreSQL extends SQL {
|
||||||
|
|
||||||
@ -129,20 +132,27 @@ class PostgreSQL extends SQL {
|
|||||||
|
|
||||||
protected function getOnDuplicateStrategy(?Strategy $strategy, &$params) {
|
protected function getOnDuplicateStrategy(?Strategy $strategy, &$params) {
|
||||||
if (!is_null($strategy)) {
|
if (!is_null($strategy)) {
|
||||||
|
if ($strategy instanceof UpdateStrategy) {
|
||||||
/*if ($onDuplicateKey instanceof UpdateStrategy) {
|
|
||||||
$updateValues = array();
|
$updateValues = array();
|
||||||
foreach($onDuplicateKey->getValues() as $key => $value) {
|
foreach($strategy->getValues() as $key => $value) {
|
||||||
|
$leftColumn = $this->columnName($key);
|
||||||
if ($value instanceof Column) {
|
if ($value instanceof Column) {
|
||||||
$columnName = $value->getName();
|
$columnName = $this->columnName($value->getName());
|
||||||
$updateValues[] = "\"$key\"=\"$columnName\"";
|
$updateValues[] = "$leftColumn=$columnName";
|
||||||
|
} else if ($value instanceof Add) {
|
||||||
|
$columnName = $this->columnName($value->getColumn());
|
||||||
|
$operator = $value->getOperator();
|
||||||
|
$value = $value->getValue();
|
||||||
|
$updateValues[] = "$leftColumn=$columnName$operator" . $this->addValue($value, $params);
|
||||||
} else {
|
} else {
|
||||||
$updateValues[] = "\"$key\"=" . $this->addValue($value, $parameters);
|
$updateValues[] = "$leftColumn=" . $this->addValue($value, $parameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$onDuplicateKey = " ON CONFLICT DO UPDATE SET " . implode(",", $updateValues);
|
$conflictingColumns = $this->columnName($strategy->getConflictingColumns());
|
||||||
} else*/ {
|
$updateValues = implode(",", $updateValues);
|
||||||
|
return " ON CONFLICT ($conflictingColumns) DO UPDATE SET $updateValues";
|
||||||
|
} else {
|
||||||
$strategyClass = get_class($strategy);
|
$strategyClass = get_class($strategy);
|
||||||
$this->lastError = "ON DUPLICATE Strategy $strategyClass is not supported yet.";
|
$this->lastError = "ON DUPLICATE Strategy $strategyClass is not supported yet.";
|
||||||
return false;
|
return false;
|
||||||
|
@ -143,7 +143,7 @@ abstract class SQL {
|
|||||||
$returningCol = $insert->getReturning();
|
$returningCol = $insert->getReturning();
|
||||||
$returning = $this->getReturning($returningCol);
|
$returning = $this->getReturning($returningCol);
|
||||||
|
|
||||||
$query = "INSERT INTO $tableName$columnStr VALUES$values$onDuplicateKey$returning";
|
$query = "INSERT INTO $tableName$columnStr VALUES $values$onDuplicateKey$returning";
|
||||||
if($insert->dump) { var_dump($query); var_dump($parameters); }
|
if($insert->dump) { var_dump($query); var_dump($parameters); }
|
||||||
$res = $this->execute($query, $parameters, !empty($returning));
|
$res = $this->execute($query, $parameters, !empty($returning));
|
||||||
$success = ($res !== FALSE);
|
$success = ($res !== FALSE);
|
||||||
|
@ -5,10 +5,16 @@ namespace Driver\SQL\Strategy;
|
|||||||
class UpdateStrategy extends Strategy {
|
class UpdateStrategy extends Strategy {
|
||||||
|
|
||||||
private array $values;
|
private array $values;
|
||||||
|
private array $conflictingColumns;
|
||||||
|
|
||||||
public function __construct($values) {
|
public function __construct($conflictingColumns, $values) {
|
||||||
|
$this->conflictingColumns = $conflictingColumns;
|
||||||
$this->values = $values;
|
$this->values = $values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getConflictingColumns() {
|
||||||
|
return $this->conflictingColumns;
|
||||||
|
}
|
||||||
|
|
||||||
public function getValues() { return $this->values; }
|
public function getValues() { return $this->values; }
|
||||||
}
|
}
|
@ -239,13 +239,28 @@ class User extends ApiObject {
|
|||||||
|
|
||||||
public function processVisit() {
|
public function processVisit() {
|
||||||
if ($this->sql && isset($_COOKIE["PHPSESSID"]) && !empty($_COOKIE["PHPSESSID"])) {
|
if ($this->sql && isset($_COOKIE["PHPSESSID"]) && !empty($_COOKIE["PHPSESSID"])) {
|
||||||
|
|
||||||
|
if ($this->isBot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$cookie = $_COOKIE["PHPSESSID"];
|
$cookie = $_COOKIE["PHPSESSID"];
|
||||||
$month = (new DateTime())->format("Ym");
|
$month = (new DateTime())->format("Ym");
|
||||||
|
|
||||||
$this->sql->insert("Visitor", array("cookie", "month"))
|
$this->sql->insert("Visitor", array("cookie", "month"))
|
||||||
->addRow($cookie, $month)
|
->addRow($cookie, $month)
|
||||||
->onDuplicateKeyStrategy(new UpdateStrategy(array("count" => new Add("count", 1))))
|
->onDuplicateKeyStrategy(new UpdateStrategy(
|
||||||
|
array("month", "cookie"),
|
||||||
|
array("count" => new Add("Visitor.count", 1))))
|
||||||
->execute();
|
->execute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function isBot() {
|
||||||
|
if (!isset($_SERVER["HTTP_USER_AGENT"]) || empty($_SERVER["HTTP_USER_AGENT"])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return preg_match('/robot|spider|crawler|curl|^$/i', $_SERVER['HTTP_USER_AGENT']) === 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user