Files
seatmapv1/src/Tqdev/PhpCrudApi/Column/ReflectionService.php
zino 1392bd3a96 Squashed 'seatmap-webapi/' content from commit 02d4bf7
git-subtree-dir: seatmap-webapi
git-subtree-split: 02d4bf7404b8fcb788502ca45c813946b6c4f5b9
2021-01-20 12:59:59 +01:00

104 lines
3.1 KiB
PHP

<?php
namespace Tqdev\PhpCrudApi\Column;
use Tqdev\PhpCrudApi\Cache\Cache;
use Tqdev\PhpCrudApi\Column\Reflection\ReflectedDatabase;
use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
use Tqdev\PhpCrudApi\Database\GenericDB;
class ReflectionService
{
private $db;
private $cache;
private $ttl;
private $database;
private $tables;
public function __construct(GenericDB $db, Cache $cache, int $ttl)
{
$this->db = $db;
$this->cache = $cache;
$this->ttl = $ttl;
$this->database = null;
$this->tables = [];
}
private function database(): ReflectedDatabase
{
if ($this->database) {
return $this->database;
}
$this->database = $this->loadDatabase(true);
return $this->database;
}
private function loadDatabase(bool $useCache): ReflectedDatabase
{
$key = sprintf('%s-ReflectedDatabase', $this->db->getCacheKey());
$data = $useCache ? $this->cache->get($key) : '';
if ($data != '') {
$database = ReflectedDatabase::fromJson(json_decode(gzuncompress($data)));
} else {
$database = ReflectedDatabase::fromReflection($this->db->reflection());
$data = gzcompress(json_encode($database, JSON_UNESCAPED_UNICODE));
$this->cache->set($key, $data, $this->ttl);
}
return $database;
}
private function loadTable(string $tableName, bool $useCache): ReflectedTable
{
$key = sprintf('%s-ReflectedTable(%s)', $this->db->getCacheKey(), $tableName);
$data = $useCache ? $this->cache->get($key) : '';
if ($data != '') {
$table = ReflectedTable::fromJson(json_decode(gzuncompress($data)));
} else {
$tableType = $this->database()->getType($tableName);
$table = ReflectedTable::fromReflection($this->db->reflection(), $tableName, $tableType);
$data = gzcompress(json_encode($table, JSON_UNESCAPED_UNICODE));
$this->cache->set($key, $data, $this->ttl);
}
return $table;
}
public function refreshTables()
{
$this->database = $this->loadDatabase(false);
}
public function refreshTable(string $tableName)
{
$this->tables[$tableName] = $this->loadTable($tableName, false);
}
public function hasTable(string $tableName): bool
{
return $this->database()->hasTable($tableName);
}
public function getType(string $tableName): string
{
return $this->database()->getType($tableName);
}
public function getTable(string $tableName): ReflectedTable
{
if (!isset($this->tables[$tableName])) {
$this->tables[$tableName] = $this->loadTable($tableName, true);
}
return $this->tables[$tableName];
}
public function getTableNames(): array
{
return $this->database()->getTableNames();
}
public function removeTable(string $tableName): bool
{
unset($this->tables[$tableName]);
return $this->database()->removeTable($tableName);
}
}