/** * Check if the number or records in the database exceeds the set limit * * @see \Spork\Mvc\Listener\Limit\Storage\StorageInterface::check() * @param string $ip * @param Limit $limit * @return boolean */ public function check($ip, Limit $limit) { $this->assertReady(); if ($this->cleanOnCheck) { $this->clean(); } $sql = sprintf("SELECT count(*) as count FROM %s WHERE %s=:ip AND %s=:type AND %s >= NOW() - INTERVAL %d SECOND", $this->dbAdapter->platform->quoteIdentifier($this->table), $this->dbAdapter->platform->quoteIdentifier($this->ipColumn), $this->dbAdapter->platform->quoteIdentifier($this->typeColumn), $this->dbAdapter->platform->quoteIdentifier($this->timestampColumn), $limit->getInterval()->toSeconds()); $parameters = array('ip' => $ip, 'type' => $limit->getName()); $result = $this->dbAdapter->query($sql, $parameters); $count = $result->current()->count; return $count >= $limit->getLimit(); }
/** * Set a limit * * @param Limit|array $limit * @throws \Exception */ public function setLimit($limit) { if (is_array($limit)) { $spec = $limit; if (!isset($spec['name'])) { throw new \Exception("Cannot create Limit: Name missing from configuration."); } $name = $spec['name']; $limit = isset($spec['limit']) ? $spec['limit'] : null; $interval = isset($spec['interval']) ? $spec['interval'] : null; $actions = isset($spec['actions']) ? $spec['actions'] : array(); $limit = new Limit($name, $limit, $interval); foreach ($actions as $action) { if (is_string($action)) { $action = $this->getActionPlugins()->get($action); } elseif (is_array($action)) { if (!isset($action['name'])) { throw new \Exception('Cannot create Action: Name missing from configuration.'); } $action = $this->getActionPlugins()->get($action['name'], $action); } if (!$action instanceof Action\ActionInterface) { throw new \Exception("Action must be instance of Spork\\Mvc\\Listener\\Limit\\Action\\ActionInterface"); } $limit->addAction($action); } } if (!$limit instanceof Limit) { throw new \Exception("Limit must be instance of Spork\\Mvc\\Listener\\Limit\\Limit"); } $this->limits[$limit->getName()] = $limit; }