release; } /** * {@inheritdoc} */ public function require_all_upgrades() { return false; } /** * {@inheritdoc} */ public function getDoctrineMigrations() { return []; } /** * {@inheritdoc} */ public function concern() { return $this->concern; } /** * {@inheritdoc} */ public function apply(base $appbox, Application $app) { if (!$this->hasSessionTable($app)) { return true; } // Remove deleted users sessions $sql = 'SELECT s.id FROM `Sessions` s INNER JOIN Users u ON (u.id = s.user_id) WHERE u.deleted = 1'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(); $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rows as $row) { if (null !== $session = $app['repo.sessions']->find($row['id'])) { $app['EM']->remove($session); } } // Remove API sessions $query = $app['EM']->createQuery('SELECT s FROM Phraseanet:Session s WHERE s.user_agent LIKE :guzzle'); $query->setParameter(':guzzle', 'Guzzle%'); foreach ($query->getResult() as $session) { $app['EM']->remove($session); } $app['EM']->flush(); return true; } private function hasSessionTable(Application $app) { $rsm = (new ResultSetMapping())->addScalarResult('Name', 'Name'); $ret = false; foreach ($app['EM']->createNativeQuery('SHOW TABLE STATUS', $rsm)->getResult() as $row) { if ('Session' === $row['Name']) { $ret = true; break; } } return $ret; } }