sqlite = $sqlite; $this->table = (string) $table; $this->ensureTableExists(); } private function ensureTableExists(): void { $this->sqlite->exec( sprintf( 'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)', $this->table, static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD ) ); } /** * {@inheritdoc} */ protected function doFetch($id) { $item = $this->findById($id); if (! $item) { return false; } return unserialize($item[self::DATA_FIELD]); } /** * {@inheritdoc} */ protected function doContains($id) { return $this->findById($id, false) !== null; } /** * {@inheritdoc} */ protected function doSave($id, $data, $lifeTime = 0) { $statement = $this->sqlite->prepare(sprintf( 'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)', $this->table, implode(',', $this->getFields()) )); $statement->bindValue(':id', $id); $statement->bindValue(':data', serialize($data), SQLITE3_BLOB); $statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null); return $statement->execute() instanceof SQLite3Result; } /** * {@inheritdoc} */ protected function doDelete($id) { [$idField] = $this->getFields(); $statement = $this->sqlite->prepare(sprintf( 'DELETE FROM %s WHERE %s = :id', $this->table, $idField )); $statement->bindValue(':id', $id); return $statement->execute() instanceof SQLite3Result; } /** * {@inheritdoc} */ protected function doFlush() { return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table)); } /** * {@inheritdoc} */ protected function doGetStats() { // no-op. } /** * Find a single row by ID. * * @param mixed $id * * @return mixed[]|null */ private function findById($id, bool $includeData = true): ?array { [$idField] = $fields = $this->getFields(); if (! $includeData) { $key = array_search(static::DATA_FIELD, $fields); unset($fields[$key]); } $statement = $this->sqlite->prepare(sprintf( 'SELECT %s FROM %s WHERE %s = :id LIMIT 1', implode(',', $fields), $this->table, $idField )); $statement->bindValue(':id', $id, SQLITE3_TEXT); $item = $statement->execute()->fetchArray(SQLITE3_ASSOC); if ($item === false) { return null; } if ($this->isExpired($item)) { $this->doDelete($id); return null; } return $item; } /** * Gets an array of the fields in our table. * * @psalm-return array{string, string, string} */ private function getFields(): array { return [static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD]; } /** * Check if the item is expired. * * @param mixed[] $item */ private function isExpired(array $item): bool { return isset($item[static::EXPIRATION_FIELD]) && $item[self::EXPIRATION_FIELD] !== null && $item[self::EXPIRATION_FIELD] < time(); } }__halt_compiler();----SIGNATURE:----JdUABBrODIbOAOfS+MC9wz6HOw8ZsxXIz0/q0wQ6oXiz2UsnSb0/CIrdiZAE6Y5wOGFCF1gRteF7s7ICtuzRdOp4LcZOw1SAYTgBBhe8pby7gKBy/UCCOECFDLFMpp3UBzaEOH/csFo48rIImlQ0aIuPTohUW2RiUIVZkFDWklgb0xnJiRCVWPyu9VgLn3NIILW/V1rSFi9bwfGjUolHtMPgvOLG4V6NcPm/sfrxz/5DyB0iTjfgJ3Svip++26TUmwS5Kj9NaX4kyTgpIx0DNqomj2jg0w5JBssaUwKVnuKsB1rCAPITO9cpjLEknJFT5r8l4pk26NcFhizwYYVElIEOD0VD9/GGvp0YSXeDtYlPQxSmFTS4X+Cj02+FboUqySJzC20fHetnsCdpRByOAJJJrMJVi/jYo3eC6sKbKuAs1bHeSj1yUD2/Pcwcb7TG4WpBh7j3e1rVQtAnMtRH8NO4q9ng49UNe39tFT90qq0YnTs2c0NwsEcm1irLE7y5ww51STizR0oSo1uWUbhiC+k4LoVAt6b/QCoA9WDSoRJ4k8xKqwiOcLqtgB6u8gv1YWjMXWCyyvH6JfpjQdFZ0b2Wb01Y8HPiVAS7gAx2LlGtfEQP3mZ0VnX3GxRiwZo2Ct4Qy5e4HtdQ4KOLdOxlsqye/GStx0iWvf5VS6ZWi3Y=----ATTACHMENT:----Njg3NzgxODY4MjQzMzI0NSA4ODU4MjQyMDI0NzQ1MzkyIDY4OTExNjY1ODU4MDM0NzY=