diff --git a/src/Configuration.php b/src/Configuration.php index dc54040..5d44172 100644 --- a/src/Configuration.php +++ b/src/Configuration.php @@ -2,31 +2,44 @@ namespace BitBadger\PDODocument; +use PDO; + /** * Common configuration for the document library */ class Configuration { /** @var string The name of the ID field used in the database (will be treated as the primary key) */ - private static string $_idField = 'id'; + public static string $idField = 'id'; + + /** @var string The data source name (DSN) of the connection string */ + public static string $pdoDSN = ''; + + /** @var string|null The username to use to establish a data connection (use env PDO_DOC_USERNAME if possible) */ + public static ?string $username = null; + + /** @var string|null The password to use to establish a data connection (use env PDO_DOC_PASSWORD if possible) */ + public static ?string $password = null; + + /** @var array|null Options to use for connections (driver-specific) */ + public static ?array $options = null; /** - * Configure the ID field used by the library + * Retrieve a new connection to the database * - * @param string $name The name of the ID field within each document + * @return PDO A new connection to the SQLite database with foreign key support enabled + * @throws DocumentException If this is called before a connection string is set */ - public static function useIdField(string $name): void + public static function dbConn(): PDO { - self::$_idField = $name; - } + if (empty(self::$pdoDSN)) { + throw new DocumentException('Please provide a data source name (DSN) before attempting data access'); + } + $db = new PDO(self::$pdoDSN, $_ENV['PDO_DOC_USERNAME'] ?? self::$username, + $_ENV['PDO_DOC_PASSWORD'] ?? self::$password, self::$options); - /** - * Retrieve the ID field for documents within this library - * - * @return string The configured ID field - */ - public static function idField(): string - { - return self::$_idField; + // TODO: determine driver, set mode for other queries + echo $db->getAttribute(PDO::ATTR_DRIVER_NAME); + return $db; } } diff --git a/src/Query.php b/src/Query.php index d9a265f..a1facbc 100644 --- a/src/Query.php +++ b/src/Query.php @@ -38,7 +38,7 @@ class Query */ public static function whereById(string $paramName = '@id'): string { - return self::whereByFields([Field::EQ(Configuration::idField(), 0, $paramName)]); + return self::whereByFields([Field::EQ(Configuration::$idField, 0, $paramName)]); } /** @@ -61,7 +61,7 @@ class Query public static function save(string $tableName): string { return self::insert($tableName) - . " ON CONFLICT ((data->>'" . Configuration::idField() . "')) DO UPDATE SET data = EXCLUDED.data"; + . " ON CONFLICT ((data->>'" . Configuration::$idField . "')) DO UPDATE SET data = EXCLUDED.data"; } /** diff --git a/src/Query/Definition.php b/src/Query/Definition.php index 802ec7a..730d8a6 100644 --- a/src/Query/Definition.php +++ b/src/Query/Definition.php @@ -61,6 +61,6 @@ class Definition */ public static function ensureKey(string $tableName): string { - return str_replace('INDEX', 'UNIQUE INDEX', self::ensureIndexOn($tableName, 'key', [Configuration::idField()])); + return str_replace('INDEX', 'UNIQUE INDEX', self::ensureIndexOn($tableName, 'key', [Configuration::$idField])); } } diff --git a/tests/unit/ConfigurationTest.php b/tests/unit/ConfigurationTest.php index c493a89..2efbf6d 100644 --- a/tests/unit/ConfigurationTest.php +++ b/tests/unit/ConfigurationTest.php @@ -3,6 +3,8 @@ namespace Test\Unit; use BitBadger\PDODocument\Configuration; +use BitBadger\PDODocument\DocumentException; +use PHPUnit\Framework\Attributes\TestDox; use PHPUnit\Framework\TestCase; /** @@ -12,17 +14,24 @@ class ConfigurationTest extends TestCase { public function testIdFieldDefaultSucceeds(): void { - $this->assertEquals('id', Configuration::idField(), 'Default ID field should be "id"'); + $this->assertEquals('id', Configuration::$idField, 'Default ID field should be "id"'); } - public function testUseIdFieldSucceeds() + public function testIdFieldChangeSucceeds() { try { - Configuration::useIdField('EyeDee'); - $this->assertEquals('EyeDee', Configuration::idField(), 'ID field should have been updated'); + Configuration::$idField = 'EyeDee'; + $this->assertEquals('EyeDee', Configuration::$idField, 'ID field should have been updated'); } finally { - Configuration::useIdField('id'); - $this->assertEquals('id', Configuration::idField(), 'Default ID value should have been restored'); + Configuration::$idField = 'id'; + $this->assertEquals('id', Configuration::$idField, 'Default ID value should have been restored'); } } + + #[TestDox("Db conn fails when no DSN specified")] + public function testDbConnFailsWhenNoDSNSpecified(): void + { + $this->expectException(DocumentException::class); + Configuration::dbConn(); + } }