<?php declare(strict_types=1); 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) */ 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; /** @var Mode|null The mode in which the library is operating (filled after first connection if not configured) */ public static ?Mode $mode = null; /** @var PDO|null The PDO instance to use for database commands */ private static ?PDO $_pdo = null; /** * Retrieve a new connection to the database * * @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 dbConn(): PDO { if (is_null(self::$_pdo)) { if (empty(self::$pdoDSN)) { throw new DocumentException('Please provide a data source name (DSN) before attempting data access'); } self::$_pdo = new PDO(self::$pdoDSN, $_ENV['PDO_DOC_USERNAME'] ?? self::$username, $_ENV['PDO_DOC_PASSWORD'] ?? self::$password, self::$options); if (is_null(self::$mode)) { $driver = self::$_pdo->getAttribute(PDO::ATTR_DRIVER_NAME); self::$mode = match ($driver) { 'pgsql' => Mode::PgSQL, 'sqlite' => Mode::SQLite, default => throw new DocumentException( "Unsupported driver $driver: this library currently supports PostgreSQL and SQLite") }; } } return self::$_pdo; } public static function resetPDO(): void { self::$_pdo = null; } }