Reorder and Added missing databases

This commit is contained in:
2023-02-28 23:41:51 -03:00
parent a326904825
commit 99344fda7d
17 changed files with 260 additions and 251 deletions

View File

@ -2,74 +2,67 @@
namespace ProVM\Database;
use PDO;
use PDOException;
use ProVM\Concept\Database;
use ProVM\Concept\Database\Connection as ConnectionInterface;
use ProVM\Concept\Database\ResultSet as ResultSetInterface;
use ProVM\Concept\Database\Transaction as TransactionInterface;
class Connection implements ConnectionInterface
class Connection implements Database\Connection
{
public function __construct(Database $database)
{
$this->setDatabase($database);
$this->connect();
}
protected Database $database;
public function setDatabase(Database $database): ConnectionInterface
protected function getDatabase(): Database
{
return $this->database;
}
protected function setDatabase(Database $database): Database\Connection
{
$this->database = $database;
return $this;
}
public function getDatabase(): Database
{
return $this->database;
}
public function connect(): ConnectionInterface
protected PDO $pdo;
public function connect(): PDO
{
if (!isset($this->pdo)) {
$dsn = $this->getDatabase()->getDsn();
if ($this->getDatabase()->needsUser()) {
$pdo = new PDO($this->getDatabase()->getDSN(), $this->getDatabase()->getUsername(), $this->getDatabase()->getPassword());
$this->pdo = new PDO($dsn, $this->getDatabase()->getUser(), $this->getDatabase()->getPassword());
} else {
$pdo = new PDO($this->getDatabase()->getDSN());
$this->pdo = new PDO($dsn);
}
$this->setPDO($pdo);
}
return $this;
}
protected PDO $pdo;
public function setPDO(PDO $pdo): ConnectionInterface
{
$this->pdo = $pdo;
return $this;
}
public function getPDO(): PDO
{
return $this->pdo;
}
public function query(string $query): ResultSetInterface
protected Database\Transaction $transaction;
public function transaction(): Database\Transaction
{
$st = $this->getPDO()->query($query);
if (!$st) {
throw new PDOException("Could not run query {$query}");
if (!isset($this->transaction)) {
$this->transaction = new Transaction($this);
}
return new ResultSet($st);
return $this->transaction;
}
public function prepare(string $query): ResultSetInterface
public function query(string $query): Database\ResultSet
{
$st = $this->getPDO()->prepare($query);
if (!$st) {
throw new PDOException("Could not prepare query {$query}");
return new ResultSet($this->connect()->query($query));
}
public function prepare(string $query): Database\ResultSet
{
return new ResultSet($this->connect()->prepare($query));
}
public function execute(string $query, ?array $data = null): Database\ResultSet
{
if ($data !== null) {
$rs = $this->prepare($query);
$rs->execute($data);
return $rs;
}
return new ResultSet($st);
}
public function execute(string $query, array $values): ResultSetInterface
{
return $this->prepare($query)->execute($values);
}
public function transaction(): TransactionInterface
{
return new Transaction($this->getPDO());
return $this->query($query);
}
}

View File

@ -1,11 +0,0 @@
<?php
namespace ProVM\Database;
class Exception extends \Exception
{
public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
{
$code += 300;
parent::__construct($message, $code, $previous);
}
}

View File

@ -1,7 +1,7 @@
<?php
namespace ProVM\Database;
use ProVM\Alias\Database;
use ProVM\Implement\Database;
class MySQL extends Database
{
@ -9,20 +9,13 @@ class MySQL extends Database
{
return true;
}
public function getDSN(): string
public function getDsn(): string
{
$arr = [
"host={$this->getHost()}"
];
if (isset($this->port)) {
$arr []= "port={$this->getPort()}";
$dsn = ["mysql:host={$this->getHost()}"];
if ($this->getPort()) {
$dsn []= "port={$this->getPort()}";
}
$arr []= "dbname={$this->getName()}";
return implode(':', [
'mysql',
implode(';', $arr)
]);
$dsn []= "dbname={$this->getName()}";
return implode(';', $dsn);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace ProVM\Database;
use ProVM\Implement\Database;
class PostgreSQL extends Database
{
public function getDsn(): string
{
$dsn = ["pgsql:host={$this->getHost()}"];
if ($this->getPort()) {
$dsn []= "port={$this->getPort()}";
}
$dsn []= "dbname={$this->getName()}";
$dsn []= "user={$this->getUser()}";
$dsn []= "password={$this->getPassword()}";
return implode(';', $dsn);
}
}

View File

@ -3,10 +3,10 @@ namespace ProVM\Database;
use PDO;
use PDOStatement;
use ProVM\Concept\Database\ResultSet as RSInterface;
use ProVM\Exception\BlankResult;
use ProVM\Concept\Database;
use ProVM\Exception\Database\BlankResult;
class ResultSet implements RSInterface
class ResultSet implements Database\ResultSet
{
public function __construct(PDOStatement $statement)
{
@ -14,52 +14,44 @@ class ResultSet implements RSInterface
}
protected PDOStatement $statement;
public function setStatement(PDOStatement $statement): RSInterface
protected function getStatement(): PDOStatement
{
return $this->statement;
}
protected function setStatement(PDOStatement $statement): ResultSet
{
$this->statement = $statement;
return $this;
}
public function getStatement(): PDOStatement
{
return $this->statement;
}
public function execute(array $values): RSInterface
public function execute(array $data): Database\ResultSet
{
$this->getStatement()->execute($values);
$this->statement->execute($data);
return $this;
}
public function getAsArray(): array
protected function checkResults(): PDOStatement
{
$rs = $this->getStatement()->fetchAll(PDO::FETCH_ASSOC);
if (!$rs) {
throw new BlankResult();
if ($this->getStatement()->rowCount() === 0) {
throw new BlankResult(query: $this->getStatement()->queryString);
}
return $rs;
return $this->getStatement();
}
public function getAsObject(): array
public function fetchFirst(): array
{
$rs = $this->getStatement()->fetchAll(PDO::FETCH_OBJ);
if (!$rs) {
throw new BlankResult();
}
return $rs;
return $this->checkResults()->fetch(PDO::FETCH_ASSOC);
}
public function getFirstAsArray(): array
public function fetchAll(): array
{
$rs = $this->getStatement()->fetch(PDO::FETCH_ASSOC);
if (!$rs or count($rs) === 0) {
throw new BlankResult();
}
return $rs;
return $this->checkResults()->fetchAll(PDO::FETCH_ASSOC);
}
public function getFirstAsObject(): object
public function fetchFirstAsObject(): object
{
$rs = $this->getStatement()->fetch(PDO::FETCH_OBJ);
if (!$rs or count($rs) === 0) {
throw new BlankResult();
}
return $rs;
return $this->checkResults()->fetch(PDO::FETCH_OBJ);
}
public function fetchAllAsObjects(): array
{
return $this->checkResults()->fetchAll(PDO::FETCH_OBJ);
}
}

12
src/Database/SQLite.php Normal file
View File

@ -0,0 +1,12 @@
<?php
namespace ProVM\Database;
use ProVM\Implement\Database;
class SQLite extends Database
{
public function getDsn(): string
{
return "sqlite:{$this->getHost()}";
}
}

View File

@ -2,58 +2,39 @@
namespace ProVM\Database;
use PDO;
use PDOException;
use ProVM\Concept\Database\ResultSet as ResultSetInterface;
use ProVM\Concept\Database\Transaction as TransactionInterface;
use ProVM\Concept;
class Transaction implements TransactionInterface
class Transaction implements Concept\Database\Transaction
{
public function __construct(PDO $pdo)
public function __construct(Concept\Database\Connection $connection)
{
$this->setPDO($pdo);
$this->setConnection($connection);
}
protected PDO $pdo;
public function setPDO(PDO $pdo): TransactionInterface
protected Concept\Database\Connection $connection;
public function getConnection(): Concept\Database\Connection
{
$this->pdo = $pdo;
return $this->connection;
}
public function setConnection(Concept\Database\Connection $connection): Concept\Database\Transaction
{
$this->connection = $connection;
return $this;
}
public function getPDO(): PDO
public function begin(): Concept\Database\Transaction
{
return $this->pdo;
}
public function begin(): TransactionInterface
{
$this->getPDO()->beginTransaction();
$this->getConnection()->connect()->beginTransaction();
return $this;
}
public function query(string $query): ResultSetInterface
{
$st = $this->getPDO()->query($query);
if (!$st) {
throw new PDOException("Could not run query {$query}");
}
return new ResultSet($st);
}
public function prepare(string $query): ResultSetInterface
{
$st = $this->getPDO()->prepare($query);
if (!$st) {
throw new PDOException("Could not prepare query {$query}");
}
return new ResultSet($st);
}
public function execute(string $query, array $values): ResultSetInterface
{
return $this->prepare($query)->execute($values);
}
public function commit(): void
{
$this->getPDO()->commit();
$this->getConnection()->connect()->commit();
}
public function rollBack(): void
{
$this->getPDO()->rollBack();
$this->getConnection()->connect()->rollBack();
}
}