diff --git a/src/Contracts/Database/ConnectionInterface.php b/src/Contracts/Database/ConnectionInterface.php index 43b0209..618c2a2 100644 --- a/src/Contracts/Database/ConnectionInterface.php +++ b/src/Contracts/Database/ConnectionInterface.php @@ -20,4 +20,11 @@ public function performQuery(string $query): array; * @return array */ public function getTables(): array; + + /** + * Get all columns with types in the given table. + * + * @return array + */ + public function getColumns(string $table): array; } diff --git a/src/Database/DoctrineConnection.php b/src/Database/DoctrineConnection.php index 1fe74eb..61d8505 100644 --- a/src/Database/DoctrineConnection.php +++ b/src/Database/DoctrineConnection.php @@ -3,6 +3,7 @@ namespace Farzai\Viola\Database; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Types\Type; use Farzai\Viola\Contracts\Database\ConnectionInterface; final class DoctrineConnection implements ConnectionInterface @@ -55,4 +56,28 @@ public function getTables(): array { return $this->connection->createSchemaManager()->listTableNames(); } + + /** + * Get all columns with types in the given table. + * + * @return array + */ + public function getColumns(string $table): array + { + $columns = $this->connection->createSchemaManager()->listTableColumns($table); + + $columnsWithType = []; + + foreach ($columns as $column) { + $type = basename(str_replace('\\', '/', get_class($column->getType()))); + + // Remove the "Type" suffix from the type name. + $type = str_replace('Type', '', $type); + $type = strtolower($type); + + $columnsWithType[$column->getName()] = $type; + } + + return $columnsWithType; + } } diff --git a/src/Storage/CacheFilesystemStorage.php b/src/Storage/CacheFilesystemStorage.php index 76358af..667c1c2 100644 --- a/src/Storage/CacheFilesystemStorage.php +++ b/src/Storage/CacheFilesystemStorage.php @@ -26,6 +26,7 @@ public function __construct($prefix = '') public function get(string $key, mixed $default = null): mixed { $item = $this->cache->getItem($key); + if ($item->isHit()) { return $item->get(); } @@ -40,10 +41,9 @@ public function set(string $key, mixed $value): void { $item = $this->cache->getItem($key); - $item->set($value); - - // 5 years - $item->expiresAfter(60 * 60 * 24 * 365 * 5); + $item + ->set($value) + ->expiresAfter(new \DateInterval('P5Y')); $this->cache->save($item); } diff --git a/tests/Database/ConnectionTest.php b/tests/Database/ConnectionTest.php index a4d9ccc..b59a866 100644 --- a/tests/Database/ConnectionTest.php +++ b/tests/Database/ConnectionTest.php @@ -49,3 +49,27 @@ $connection->performQuery('SELECT * FROM users'); })->throws(\Exception::class, "Error Processing Query: \nSELECT * FROM users\n\nInvalid Query"); + +it('should get the correct columns from table successfully', function () { + $schemaManager = $this->createMock(\Doctrine\DBAL\Schema\AbstractSchemaManager::class); + $schemaManager->expects($this->once()) + ->method('listTableColumns') + ->willReturn([ + new \Doctrine\DBAL\Schema\Column('id', new \Doctrine\DBAL\Types\IntegerType()), + new \Doctrine\DBAL\Schema\Column('name', new \Doctrine\DBAL\Types\StringType()), + new \Doctrine\DBAL\Schema\Column('email', new \Doctrine\DBAL\Types\StringType()), + ]); + + $mysqlConnection = $this->createMock(\Doctrine\DBAL\Connection::class); + $mysqlConnection->expects($this->once()) + ->method('createSchemaManager') + ->willReturn($schemaManager); + + $connection = new DoctrineConnection($mysqlConnection); + + expect($connection->getColumns('users'))->toBe([ + 'id' => 'integer', + 'name' => 'string', + 'email' => 'string', + ]); +});