Initial SQLite development #1
|
@ -2,31 +2,44 @@
|
||||||
|
|
||||||
namespace BitBadger\PDODocument;
|
namespace BitBadger\PDODocument;
|
||||||
|
|
||||||
|
use PDO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common configuration for the document library
|
* Common configuration for the document library
|
||||||
*/
|
*/
|
||||||
class Configuration
|
class Configuration
|
||||||
{
|
{
|
||||||
/** @var string The name of the ID field used in the database (will be treated as the primary key) */
|
/** @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);
|
||||||
|
|
||||||
/**
|
// TODO: determine driver, set mode for other queries
|
||||||
* Retrieve the ID field for documents within this library
|
echo $db->getAttribute(PDO::ATTR_DRIVER_NAME);
|
||||||
*
|
return $db;
|
||||||
* @return string The configured ID field
|
|
||||||
*/
|
|
||||||
public static function idField(): string
|
|
||||||
{
|
|
||||||
return self::$_idField;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ class Query
|
||||||
*/
|
*/
|
||||||
public static function whereById(string $paramName = '@id'): string
|
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
|
public static function save(string $tableName): string
|
||||||
{
|
{
|
||||||
return self::insert($tableName)
|
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";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -61,6 +61,6 @@ class Definition
|
||||||
*/
|
*/
|
||||||
public static function ensureKey(string $tableName): string
|
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]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
namespace Test\Unit;
|
namespace Test\Unit;
|
||||||
|
|
||||||
use BitBadger\PDODocument\Configuration;
|
use BitBadger\PDODocument\Configuration;
|
||||||
|
use BitBadger\PDODocument\DocumentException;
|
||||||
|
use PHPUnit\Framework\Attributes\TestDox;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,17 +14,24 @@ class ConfigurationTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testIdFieldDefaultSucceeds(): void
|
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 {
|
try {
|
||||||
Configuration::useIdField('EyeDee');
|
Configuration::$idField = 'EyeDee';
|
||||||
$this->assertEquals('EyeDee', Configuration::idField(), 'ID field should have been updated');
|
$this->assertEquals('EyeDee', Configuration::$idField, 'ID field should have been updated');
|
||||||
} finally {
|
} finally {
|
||||||
Configuration::useIdField('id');
|
Configuration::$idField = 'id';
|
||||||
$this->assertEquals('id', Configuration::idField(), 'Default ID value should have been restored');
|
$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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user