From 2d42e4833a8f84ba97a54a76a8518b24aba8c6c4 Mon Sep 17 00:00:00 2001 From: Caio Fernandes Date: Thu, 8 Oct 2026 23:20:22 -0300 Subject: [PATCH] feat(database): add SQLite support to Database::connect() - Database now supports driver=sqlite (database = path or :memory:) in addition to mysql/mariadb/pgsql via host/port. Refs: SPEC-005 (PivotPHP/pivotphp-core#19) --- src/Database/Database.php | 25 +++++++++++++----- tests/Database/DatabaseTest.php | 46 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 tests/Database/DatabaseTest.php diff --git a/src/Database/Database.php b/src/Database/Database.php index 6fb8e6a..16da8aa 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -3,7 +3,10 @@ namespace PivotPHP\Core\Database; /** - * Conexão simples com banco de dados usando PDO + * Conexão simples com banco de dados usando PDO. + * + * Drivers suportados: sqlite (via `database` = caminho ou ':memory:') e + * mysql/mariadb/pgsql (via `host`, `port`, `database`, `username`, `password`). */ class Database { @@ -25,6 +28,20 @@ public function __construct(array $config) private function connect(): void { $driver = $this->config['driver'] ?? 'mysql'; + + $options = [ + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, + \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, + \PDO::ATTR_EMULATE_PREPARES => false, + ]; + + if ($driver === 'sqlite') { + $database = $this->config['database'] ?? ':memory:'; + $this->pdo = new \PDO("sqlite:{$database}", null, null, $options); + + return; + } + $host = $this->config['host'] ?? 'localhost'; $port = $this->config['port'] ?? 3306; $database = $this->config['database']; @@ -34,12 +51,6 @@ private function connect(): void $dsn = "{$driver}:host={$host};port={$port};dbname={$database};charset={$charset}"; - $options = [ - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, - \PDO::ATTR_EMULATE_PREPARES => false, - ]; - $this->pdo = new \PDO($dsn, $username, $password, $options); } diff --git a/tests/Database/DatabaseTest.php b/tests/Database/DatabaseTest.php new file mode 100644 index 0000000..287e145 --- /dev/null +++ b/tests/Database/DatabaseTest.php @@ -0,0 +1,46 @@ + 'sqlite', 'database' => ':memory:']); + + $db->statement('CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT)'); + $db->insert('INSERT INTO books (title) VALUES (:title)', ['title' => 'Dom Casmurro']); + + $rows = $db->select('SELECT * FROM books'); + + $this->assertCount(1, $rows); + $this->assertEquals('Dom Casmurro', $rows[0]['title']); + + $one = $db->selectOne('SELECT * FROM books WHERE id = :id', ['id' => 1]); + $this->assertNotNull($one); + $this->assertEquals('Dom Casmurro', $one['title']); + } + + public function testSqliteTransaction(): void + { + $db = new Database(['driver' => 'sqlite', 'database' => ':memory:']); + + $db->statement('CREATE TABLE t (id INTEGER PRIMARY KEY, v TEXT)'); + + $result = $db->transaction( + function (Database $db) { + $db->insert('INSERT INTO t (v) VALUES (:v)', ['v' => 'x']); + + return 'ok'; + } + ); + + $this->assertEquals('ok', $result); + $this->assertCount(1, $db->select('SELECT * FROM t')); + } +}