SearchQueries.php: extract garbage cleanup

This commit is contained in:
Zankaria 2025-05-18 22:26:01 +02:00
parent d30ff6946a
commit a50d47aa39

View file

@ -6,20 +6,25 @@ class SearchQueries {
private \PDO $pdo; private \PDO $pdo;
private int $queries_per_minutes_single; private int $queries_per_minutes_single;
private int $queries_per_minutes_all; private int $queries_per_minutes_all;
private bool $auto_gc;
private function checkFloodImpl(string $ip, string $phrase): bool { private function checkFloodImpl(string $ip, string $phrase): bool {
$now = time(); $now = \time();
$expiry_limit = \time() - ($this->queries_per_minutes_all * 60);
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `ip` = :ip AND `time` > :time"); $query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `ip` = :ip AND `time` > :time AND `time` <= :expiry_limit");
$query->bindValue(':ip', $ip); $query->bindValue(':ip', $ip);
$query->bindValue(':time', $now - ($this->queries_per_minutes_single * 60)); $query->bindValue(':time', $now - ($this->queries_per_minutes_single * 60), \PDO::PARAM_INT);
$query->bindValue(':expiry_limit', $expiry_limit, \PDO::PARAM_INT);
$query->execute(); $query->execute();
if ($query->fetchColumn() > $this->queries_per_minutes_single) { if ($query->fetchColumn() > $this->queries_per_minutes_single) {
return false; return false;
} }
$query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `time` > :time"); $query = $this->pdo->prepare("SELECT COUNT(*) FROM `search_queries` WHERE `time` > :time AND `time` <= :expiry_limit");
$query->bindValue(':time', $now - ($this->queries_per_minutes_all * 60)); $query->bindValue(':time', $now - ($this->queries_per_minutes_all * 60), \PDO::PARAM_INT);
$query->bindValue(':expiry_limit', $expiry_limit, \PDO::PARAM_INT);
$query->execute(); $query->execute();
if ($query->fetchColumn() > $this->queries_per_minutes_all) { if ($query->fetchColumn() > $this->queries_per_minutes_all) {
return false; return false;
@ -27,22 +32,22 @@ class SearchQueries {
$query = $this->pdo->prepare("INSERT INTO `search_queries` VALUES (:ip, :time, :query)"); $query = $this->pdo->prepare("INSERT INTO `search_queries` VALUES (:ip, :time, :query)");
$query->bindValue(':ip', $ip); $query->bindValue(':ip', $ip);
$query->bindValue(':time', $now); $query->bindValue(':time', $now, \PDO::PARAM_INT);
$query->bindValue(':query', $phrase); $query->bindValue(':query', $phrase);
$query->execute(); $query->execute();
// Cleanup search queries table if ($this->auto_gc) {
$query = prepare("DELETE FROM `search_queries` WHERE `time` <= :time"); $this->purgeExpired();
$query->bindValue(':time', time() - ($this->queries_per_minutes_all * 60)); }
$query->execute();
return true; return true;
} }
public function __construct(\PDO $pdo, int $queries_per_minutes_single, int $queries_per_minutes_all) { public function __construct(\PDO $pdo, int $queries_per_minutes_single, int $queries_per_minutes_all, bool $auto_gc) {
$this->pdo = $pdo; $this->pdo = $pdo;
$this->queries_per_minutes_single = $queries_per_minutes_single; $this->queries_per_minutes_single = $queries_per_minutes_single;
$this->queries_per_minutes_all = $queries_per_minutes_all; $this->queries_per_minutes_all = $queries_per_minutes_all;
$this->auto_gc = $auto_gc;
} }
/** /**
@ -63,4 +68,12 @@ class SearchQueries {
throw $e; throw $e;
} }
} }
public function purgeExpired(): int {
// Cleanup search queries table.
$query = prepare("DELETE FROM `search_queries` WHERE `time` <= :expiry_limit");
$query->bindValue(':expiry_limit', \time() - ($this->queries_per_minutes_all * 60), \PDO::PARAM_INT);
$query->execute();
return $query->rowCount();
}
} }