diff --git a/core/Driver/SQL/PostgreSQL.class.php b/core/Driver/SQL/PostgreSQL.class.php index a97aa69..fdc10f3 100644 --- a/core/Driver/SQL/PostgreSQL.class.php +++ b/core/Driver/SQL/PostgreSQL.class.php @@ -4,6 +4,7 @@ namespace Driver\SQL; use \Api\Parameter\Parameter; +use Driver\SQL\Column\Column; use \Driver\SQL\Column\IntColumn; use \Driver\SQL\Column\SerialColumn; use \Driver\SQL\Column\StringColumn; @@ -12,7 +13,9 @@ use \Driver\SQL\Column\DateTimeColumn; use Driver\SQL\Column\BoolColumn; use Driver\SQL\Column\JsonColumn; +use Driver\SQL\Expression\Add; use Driver\SQL\Strategy\Strategy; +use Driver\SQL\Strategy\UpdateStrategy; class PostgreSQL extends SQL { @@ -129,24 +132,31 @@ class PostgreSQL extends SQL { protected function getOnDuplicateStrategy(?Strategy $strategy, &$params) { if (!is_null($strategy)) { - - /*if ($onDuplicateKey instanceof UpdateStrategy) { + if ($strategy instanceof UpdateStrategy) { $updateValues = array(); - foreach($onDuplicateKey->getValues() as $key => $value) { + foreach($strategy->getValues() as $key => $value) { + $leftColumn = $this->columnName($key); if ($value instanceof Column) { - $columnName = $value->getName(); - $updateValues[] = "\"$key\"=\"$columnName\""; + $columnName = $this->columnName($value->getName()); + $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 { - $updateValues[] = "\"$key\"=" . $this->addValue($value, $parameters); + $updateValues[] = "$leftColumn=" . $this->addValue($value, $parameters); } } - $onDuplicateKey = " ON CONFLICT DO UPDATE SET " . implode(",", $updateValues); - } else*/ { - $strategyClass = get_class($strategy); - $this->lastError = "ON DUPLICATE Strategy $strategyClass is not supported yet."; - return false; - } + $conflictingColumns = $this->columnName($strategy->getConflictingColumns()); + $updateValues = implode(",", $updateValues); + return " ON CONFLICT ($conflictingColumns) DO UPDATE SET $updateValues"; + } else { + $strategyClass = get_class($strategy); + $this->lastError = "ON DUPLICATE Strategy $strategyClass is not supported yet."; + return false; + } } else { return ""; } diff --git a/core/Driver/SQL/SQL.class.php b/core/Driver/SQL/SQL.class.php index 0fbb1a4..96418e6 100644 --- a/core/Driver/SQL/SQL.class.php +++ b/core/Driver/SQL/SQL.class.php @@ -143,7 +143,7 @@ abstract class SQL { $returningCol = $insert->getReturning(); $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); } $res = $this->execute($query, $parameters, !empty($returning)); $success = ($res !== FALSE); diff --git a/core/Driver/SQL/Strategy/UpdateStrategy.class.php b/core/Driver/SQL/Strategy/UpdateStrategy.class.php index 171d3d1..56df47a 100644 --- a/core/Driver/SQL/Strategy/UpdateStrategy.class.php +++ b/core/Driver/SQL/Strategy/UpdateStrategy.class.php @@ -5,10 +5,16 @@ namespace Driver\SQL\Strategy; class UpdateStrategy extends Strategy { private array $values; + private array $conflictingColumns; - public function __construct($values) { + public function __construct($conflictingColumns, $values) { + $this->conflictingColumns = $conflictingColumns; $this->values = $values; } + public function getConflictingColumns() { + return $this->conflictingColumns; + } + public function getValues() { return $this->values; } } \ No newline at end of file diff --git a/core/Objects/User.class.php b/core/Objects/User.class.php index 088e745..1fb423b 100644 --- a/core/Objects/User.class.php +++ b/core/Objects/User.class.php @@ -239,13 +239,28 @@ class User extends ApiObject { public function processVisit() { if ($this->sql && isset($_COOKIE["PHPSESSID"]) && !empty($_COOKIE["PHPSESSID"])) { + + if ($this->isBot()) { + return; + } + $cookie = $_COOKIE["PHPSESSID"]; $month = (new DateTime())->format("Ym"); $this->sql->insert("Visitor", array("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(); } } + + 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; + } }