Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
Abel Hoogeveen | 5abb6b63b6 | |
Abel Hoogeveen | 63cd0ec6a8 | |
Abel Hoogeveen | 4b200dbd63 | |
Abel Hoogeveen | 029511f0cd | |
Abel Hoogeveen | 1938ebad55 | |
Abel Hoogeveen | bb8eb0300a | |
Abel Hoogeveen | 6c53eb8cd4 | |
Abel Hoogeveen | 72b404ecc9 | |
Abel Hoogeveen | 3a9e63fcdf | |
Abel Hoogeveen | a83947d0f4 | |
Abel Hoogeveen | 8260038310 | |
Abel Hoogeveen | 88135275d9 |
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2013-2018 TechFuze
|
||||
Copyright (c) 2013-2021 TechFuze
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,27 +1,30 @@
|
|||
{
|
||||
"name": "fuzeworks/database",
|
||||
"description": "FuzeWorks Framework Database Component",
|
||||
"homepage": "https://techfuze.net/fuzeworks",
|
||||
"homepage": "https://i15.nl/fuzeworks",
|
||||
"license": ["MIT"],
|
||||
"authors": [
|
||||
{
|
||||
"name": "TechFuze",
|
||||
"homepage": "https://techfuze.net"
|
||||
},
|
||||
{
|
||||
"name": "FuzeWorks Community",
|
||||
"homepage": "https://techfuze.net/fuzeworks/contributors"
|
||||
"name": "Abel Hoogeveen",
|
||||
"homepage": "https://i15.nl"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.1.0",
|
||||
"fuzeworks/core": "1.2.0-RC4",
|
||||
"fuzeworks/mvcr": "1.2.0-RC4",
|
||||
"ext-pdo": "*"
|
||||
"php": ">=8.1.0",
|
||||
"fuzeworks/core": "~1.3.0",
|
||||
"fuzeworks/mvcr": "~1.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7",
|
||||
"fuzeworks/tracycomponent": "1.2.0-RC4"
|
||||
"phpunit/phpunit": "^9",
|
||||
"fuzeworks/tracycomponent": "~1.3.0",
|
||||
"mongodb/mongodb": "~1.15.0",
|
||||
"ext-pdo": "*",
|
||||
"ext-mongodb": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"mongodb/mongodb": "For using MongoDB databases with this component",
|
||||
"ext-pdo": "For using PDO endpoints with this component",
|
||||
"ext-mongodb": "For using MongoDB endpoints with this component"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
|
|
@ -63,51 +63,51 @@ class Database
|
|||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $dbConfig;
|
||||
protected array $dbConfig;
|
||||
|
||||
/**
|
||||
* All engines that can be used for databases
|
||||
*
|
||||
* @var iDatabaseEngine[]
|
||||
*/
|
||||
protected $engines = [];
|
||||
protected array $engines = [];
|
||||
|
||||
/**
|
||||
* All tableModels that can be used for connections
|
||||
*
|
||||
* @var iDatabaseTableModel[]
|
||||
*/
|
||||
protected $tableModels = [];
|
||||
protected array $tableModels = [];
|
||||
|
||||
/**
|
||||
* Whether all DatabaseEngines have been loaded yet
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $enginesLoaded = false;
|
||||
protected bool $enginesLoaded = false;
|
||||
|
||||
/**
|
||||
* Array of all the database engines
|
||||
*
|
||||
* @var iDatabaseEngine[]
|
||||
*/
|
||||
protected $connections = [];
|
||||
protected array $connections = [];
|
||||
|
||||
/**
|
||||
* Array of all the tableModels
|
||||
*
|
||||
* @var iDatabaseTableModel[]
|
||||
*/
|
||||
protected $tables;
|
||||
protected array $tables;
|
||||
|
||||
/**
|
||||
* Register with the TracyBridge upon startup
|
||||
*/
|
||||
public function init()
|
||||
public function init(): void
|
||||
{
|
||||
$this->dbConfig = Factory::getInstance()->config->get('database')->toArray();
|
||||
|
||||
if (class_exists('Tracy\Debugger', true))
|
||||
if (class_exists('Tracy\Debugger'))
|
||||
DatabaseTracyBridge::register();
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,7 @@ class Database
|
|||
|
||||
/** @var iDatabaseEngine $engine */
|
||||
// If a databaseEngine is provided by the event, use that. Otherwise search in the list of engines
|
||||
if (is_object($event->databaseEngine) && $event->databaseEngine instanceof iDatabaseEngine)
|
||||
if ($event->databaseEngine instanceof iDatabaseEngine)
|
||||
{
|
||||
// Do intervention first
|
||||
$engine = $this->connections[$event->connectionName] = $event->databaseEngine;
|
||||
|
@ -177,7 +177,7 @@ class Database
|
|||
}
|
||||
|
||||
// Tie it into the Tracy Bar if available
|
||||
if (class_exists('\Tracy\Debugger', true))
|
||||
if (class_exists('\Tracy\Debugger'))
|
||||
DatabaseTracyBridge::registerDatabase($engine);
|
||||
|
||||
return $engine;
|
||||
|
@ -185,17 +185,17 @@ class Database
|
|||
|
||||
/**
|
||||
* @param string $tableName
|
||||
* @param string $tableModelName
|
||||
* @param string $connectionName
|
||||
* @param string $engineName
|
||||
* @param array $parameters
|
||||
* @return iDatabaseTableModel
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function getTableModel(string $tableName, string $tableModelName, string $connectionName = 'default', array $parameters = []): iDatabaseTableModel
|
||||
public function getTableModel(string $tableName, string $connectionName = 'default', string $engineName = '', array $parameters = []): iDatabaseTableModel
|
||||
{
|
||||
try {
|
||||
/** @var DatabaseLoadTableModelEvent $event */
|
||||
$event = Events::fireEvent('databaseLoadTableModelEvent', strtolower($tableModelName), $parameters, $connectionName, $tableName);
|
||||
$event = Events::fireEvent('databaseLoadTableModelEvent', strtolower($engineName), $parameters, $connectionName, $tableName);
|
||||
} catch (EventException $e) {
|
||||
throw new DatabaseException("Could not get TableModel. databaseLoadTableModelEvent threw exception: '" . $e->getMessage() . "'");
|
||||
}
|
||||
|
@ -205,10 +205,10 @@ class Database
|
|||
|
||||
/** @var iDatabaseTableModel $tableModel */
|
||||
// If a TableModel is provided by the event, use that. Otherwise search in the list of tableModels
|
||||
if (is_object($event->tableModel) && $event->tableModel instanceof iDatabaseTableModel)
|
||||
if ($event->tableModel instanceof iDatabaseTableModel)
|
||||
{
|
||||
$tableModel = $this->tables[$event->connectionName . "|" . $event->tableName] = $event->tableModel;
|
||||
if (!$tableModel->setup())
|
||||
if (!$tableModel->isSetup())
|
||||
$tableModel->setUp($this->get($event->connectionName, $tableModel->getEngineName(), $event->parameters), $event->tableName);
|
||||
}
|
||||
// If the connection already exists, use that
|
||||
|
@ -219,9 +219,13 @@ class Database
|
|||
// Otherwise use the provided configuration
|
||||
else
|
||||
{
|
||||
$tableModelClass = get_class($this->fetchTableModel($event->tableModelName));
|
||||
// First the engine shall be fetched, so the name of the tableModel is known
|
||||
$engine = $this->get($event->connectionName, $event->engineName, $event->parameters);
|
||||
$tableModelClass = get_class($this->fetchTableModel($engine->getName()));
|
||||
|
||||
// Load the tableModel and add the engine
|
||||
$tableModel = $this->tables[$event->connectionName . "|" . $event->tableName] = new $tableModelClass();
|
||||
$tableModel->setUp($this->get($event->connectionName, $tableModel->getEngineName(), $event->parameters), $event->tableName);
|
||||
$tableModel->setUp($engine, $event->tableName);
|
||||
}
|
||||
|
||||
// And return the tableModel
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace FuzeWorks\DatabaseEngine;
|
|||
/**
|
||||
* Class DatabaseDriver
|
||||
*/
|
||||
abstract class DatabaseDriver
|
||||
abstract class DatabaseDriver implements iDatabaseEngine
|
||||
{
|
||||
|
||||
// --- Query Logging --------------------------------------------------
|
||||
|
@ -49,7 +49,7 @@ abstract class DatabaseDriver
|
|||
*
|
||||
* @var array
|
||||
*/
|
||||
private $queries = [];
|
||||
private array $queries = [];
|
||||
|
||||
/**
|
||||
* Log information about a query. Used for debugging issues
|
||||
|
@ -74,7 +74,7 @@ abstract class DatabaseDriver
|
|||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueries()
|
||||
public function getQueries(): array
|
||||
{
|
||||
return $this->queries;
|
||||
}
|
||||
|
@ -82,5 +82,4 @@ abstract class DatabaseDriver
|
|||
// --------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -36,11 +36,11 @@
|
|||
|
||||
namespace FuzeWorks\DatabaseEngine;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use MongoDB\Driver\Monitoring\CommandFailedEvent;
|
||||
use MongoDB\Driver\Monitoring\CommandStartedEvent;
|
||||
use MongoDB\Driver\Monitoring\CommandSubscriber;
|
||||
use MongoDB\Driver\Monitoring\CommandSucceededEvent;
|
||||
use Tracy\Debugger;
|
||||
|
||||
class MongoCommandSubscriber implements CommandSubscriber
|
||||
{
|
||||
|
@ -48,17 +48,17 @@ class MongoCommandSubscriber implements CommandSubscriber
|
|||
/**
|
||||
* @var MongoEngine
|
||||
*/
|
||||
private $mongoEngine;
|
||||
private MongoEngine $mongoEngine;
|
||||
|
||||
/**
|
||||
* @var float
|
||||
*/
|
||||
private $commandTimings = 0.0;
|
||||
private float $commandTimings = 0.0;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $queryString;
|
||||
private string $queryString;
|
||||
|
||||
public function __construct(MongoEngine $engine)
|
||||
{
|
||||
|
@ -71,10 +71,10 @@ class MongoCommandSubscriber implements CommandSubscriber
|
|||
* @link https://secure.php.net/manual/en/mongodb-driver-monitoring-commandsubscriber.commandfailed.php
|
||||
* @param CommandFailedEvent $event An event object encapsulating information about the failed command.
|
||||
* @return void
|
||||
* @throws \InvalidArgumentException on argument parsing errors.
|
||||
* @throws InvalidArgumentException on argument parsing errors.
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public function commandFailed(CommandFailedEvent $event)
|
||||
public function commandFailed(CommandFailedEvent $event): void
|
||||
{
|
||||
// TODO: Implement commandFailed() method.
|
||||
}
|
||||
|
@ -85,10 +85,10 @@ class MongoCommandSubscriber implements CommandSubscriber
|
|||
* @link https://secure.php.net/manual/en/mongodb-driver-monitoring-commandsubscriber.commandstarted.php
|
||||
* @param CommandStartedEvent $event An event object encapsulating information about the started command.
|
||||
* @return void
|
||||
* @throws \InvalidArgumentException on argument parsing errors.
|
||||
* @throws InvalidArgumentException on argument parsing errors.
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public function commandStarted(CommandStartedEvent $event)
|
||||
public function commandStarted(CommandStartedEvent $event): void
|
||||
{
|
||||
$this->commandTimings = microtime(true);
|
||||
$this->queryString = strtoupper($event->getCommandName());
|
||||
|
@ -168,10 +168,10 @@ class MongoCommandSubscriber implements CommandSubscriber
|
|||
* @link https://secure.php.net/manual/en/mongodb-driver-monitoring-commandsubscriber.commandsucceeded.php
|
||||
* @param CommandSucceededEvent $event An event object encapsulating information about the successful command.
|
||||
* @return void
|
||||
* @throws \InvalidArgumentException on argument parsing errors.
|
||||
* @throws InvalidArgumentException on argument parsing errors.
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public function commandSucceeded(CommandSucceededEvent $event)
|
||||
public function commandSucceeded(CommandSucceededEvent $event): void
|
||||
{
|
||||
// Get variables
|
||||
$queryTimings = microtime(true) - $this->commandTimings;
|
||||
|
@ -184,17 +184,12 @@ class MongoCommandSubscriber implements CommandSubscriber
|
|||
$queryData = count($event->getReply()->cursor->firstBatch);
|
||||
break;
|
||||
|
||||
case 'update':
|
||||
case 'delete':
|
||||
case 'insert':
|
||||
$queryData = $event->getReply()->n;
|
||||
break;
|
||||
|
||||
case 'update':
|
||||
$queryData = $event->getReply()->n;
|
||||
break;
|
||||
|
||||
case 'delete':
|
||||
$queryData = $event->getReply()->n;
|
||||
break;
|
||||
}
|
||||
|
||||
// And log query
|
||||
|
|
|
@ -66,7 +66,7 @@ use MongoDB\Model\DatabaseInfoIterator;
|
|||
* @method Session startSession(array $options = [])
|
||||
* @method ChangeStream watch(array $pipeline = [], array $options = [])
|
||||
*/
|
||||
class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
||||
class MongoEngine extends DatabaseDriver
|
||||
{
|
||||
|
||||
/**
|
||||
|
@ -74,19 +74,19 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $setUp = false;
|
||||
protected bool $setUp = false;
|
||||
|
||||
/**
|
||||
* @var Client
|
||||
* @var Client|null
|
||||
*/
|
||||
protected $mongoConnection;
|
||||
protected ?Client $mongoConnection = null;
|
||||
|
||||
/**
|
||||
* Connection string with the database
|
||||
*
|
||||
* @var string
|
||||
* @var string|null
|
||||
*/
|
||||
protected $uri;
|
||||
protected ?string $uri = null;
|
||||
|
||||
/**
|
||||
* Returns the name of this engine
|
||||
|
@ -126,9 +126,9 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
public function setUp(array $parameters): bool
|
||||
{
|
||||
// Prepare variables for connection
|
||||
$this->uri = isset($parameters['uri']) ? $parameters['uri'] : null;
|
||||
$uriOptions = isset($parameters['uriOptions']) ? $parameters['uriOptions'] : [];
|
||||
$driverOptions = isset($parameters['driverOptions']) ? $parameters['driverOptions'] : [];
|
||||
$this->uri = $parameters['uri'] ?? null;
|
||||
$uriOptions = $parameters['uriOptions'] ?? [];
|
||||
$driverOptions = $parameters['driverOptions'] ?? [];
|
||||
|
||||
// Don't attempt and connect without a URI
|
||||
if (is_null($this->uri))
|
||||
|
@ -205,7 +205,7 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*/
|
||||
public function transactionStart(): bool
|
||||
{
|
||||
// TODO: Implement transactionStart() method.
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -213,7 +213,7 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*/
|
||||
public function transactionEnd(): bool
|
||||
{
|
||||
// TODO: Implement transactionEnd() method.
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -221,7 +221,7 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*/
|
||||
public function transactionCommit(): bool
|
||||
{
|
||||
// TODO: Implement transactionCommit() method.
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -229,6 +229,6 @@ class MongoEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*/
|
||||
public function transactionRollback(): bool
|
||||
{
|
||||
// TODO: Implement transactionRollback() method.
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -52,7 +52,7 @@ use PDOStatement;
|
|||
* @method string quote(string $string, int $parameter_type = PDO::PARAM_STR)
|
||||
* @method bool setAttribute(int $attribute, mixed $value)
|
||||
*/
|
||||
class PDOEngine extends DatabaseDriver implements iDatabaseEngine
|
||||
class PDOEngine extends DatabaseDriver
|
||||
{
|
||||
|
||||
/**
|
||||
|
@ -60,28 +60,28 @@ class PDOEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $setUp = false;
|
||||
protected bool $setUp = false;
|
||||
|
||||
/**
|
||||
* The PDO object connected with the database
|
||||
*
|
||||
* @var PDO
|
||||
*/
|
||||
protected $pdoConnection;
|
||||
protected PDO $pdoConnection;
|
||||
|
||||
/**
|
||||
* Connection string with the database
|
||||
*
|
||||
* @var string
|
||||
* @var string|null
|
||||
*/
|
||||
protected $dsn;
|
||||
protected ?string $dsn = null;
|
||||
|
||||
/**
|
||||
* Whether a transaction has failed and should be reverted in the future
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $transactionFailed = false;
|
||||
protected bool $transactionFailed = false;
|
||||
|
||||
/**
|
||||
* Whether a transaction should be automatically committed if not manually aborted by the user.
|
||||
|
@ -91,7 +91,7 @@ class PDOEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $transactionAutocommit = false;
|
||||
protected bool $transactionAutocommit = false;
|
||||
|
||||
/**
|
||||
* Returns the name of this engine
|
||||
|
@ -128,9 +128,9 @@ class PDOEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
public function setUp(array $parameters): bool
|
||||
{
|
||||
// Prepare variables for connection
|
||||
$this->dsn = isset($parameters['dsn']) ? $parameters['dsn'] : null;
|
||||
$username = isset($parameters['username']) ? $parameters['username'] : '';
|
||||
$password = isset($parameters['password']) ? $parameters['password'] : '';
|
||||
$this->dsn = $parameters['dsn'] ?? null;
|
||||
$username = $parameters['username'] ?? '';
|
||||
$password = $parameters['password'] ?? '';
|
||||
|
||||
// Don't attempt connection without DSN
|
||||
if (is_null($this->dsn))
|
||||
|
@ -163,9 +163,6 @@ class PDOEngine extends DatabaseDriver implements iDatabaseEngine
|
|||
{
|
||||
// Commit or rollback all changes to the database
|
||||
$this->transactionEnd();
|
||||
|
||||
//
|
||||
$this->pdoConnection = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ class PDOStatementWrapper
|
|||
/**
|
||||
* @var PDOStatement
|
||||
*/
|
||||
private $statement;
|
||||
private PDOStatement $statement;
|
||||
|
||||
/**
|
||||
* Callable for logging queries and errors
|
||||
|
@ -83,7 +83,7 @@ class PDOStatementWrapper
|
|||
/**
|
||||
* @var PDOEngine
|
||||
*/
|
||||
private $engine;
|
||||
private PDOEngine $engine;
|
||||
|
||||
public function __construct(PDOStatement $statement, callable $logQueryCallable, PDOEngine $engine)
|
||||
{
|
||||
|
@ -97,11 +97,14 @@ class PDOStatementWrapper
|
|||
* @return bool
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function execute(array $input_parameters = [])
|
||||
public function execute(array $input_parameters = []): bool
|
||||
{
|
||||
// Run the query and benchmark the time
|
||||
$benchmarkStart = microtime(true);
|
||||
$result = $this->statement->execute($input_parameters);
|
||||
if (empty($input_parameters))
|
||||
$result = $this->statement->execute();
|
||||
else
|
||||
$result = $this->statement->execute($input_parameters);
|
||||
$benchmarkEnd = microtime(true) - $benchmarkStart;
|
||||
$errInfo = $this->error();
|
||||
call_user_func_array($this->logQueryCallable, [$this->statement->queryString, $this->statement->rowCount(), $benchmarkEnd, $errInfo]);
|
||||
|
@ -115,7 +118,27 @@ class PDOStatementWrapper
|
|||
throw new DatabaseException("Could not run query. Database returned an error. Error code: " . $errInfo['code']);
|
||||
}
|
||||
|
||||
return $result;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the statement last used
|
||||
*
|
||||
* @return PDOStatement
|
||||
*/
|
||||
public function getStatement(): PDOStatement
|
||||
{
|
||||
return $this->statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getQuery(): string
|
||||
{
|
||||
return $this->statement->queryString;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -146,5 +169,4 @@ class PDOStatementWrapper
|
|||
{
|
||||
return $this->statement->$name;
|
||||
}
|
||||
|
||||
}
|
|
@ -36,7 +36,6 @@
|
|||
|
||||
namespace FuzeWorks\DatabaseEngine;
|
||||
|
||||
|
||||
interface iDatabaseEngine
|
||||
{
|
||||
public function getName(): string;
|
||||
|
|
|
@ -38,7 +38,6 @@ namespace FuzeWorks;
|
|||
use FuzeWorks\DatabaseEngine\iDatabaseEngine;
|
||||
use Tracy\IBarPanel;
|
||||
use Tracy\Debugger;
|
||||
use Tracy\Dumper;
|
||||
|
||||
/**
|
||||
* DatabaseTracyBridge Class.
|
||||
|
@ -57,9 +56,9 @@ class DatabaseTracyBridge implements IBarPanel
|
|||
/**
|
||||
* @var iDatabaseEngine[]
|
||||
*/
|
||||
public static $databases = array();
|
||||
public static array $databases = array();
|
||||
|
||||
protected $results = array();
|
||||
protected array $results = array();
|
||||
|
||||
public static function register()
|
||||
{
|
||||
|
|
|
@ -54,28 +54,28 @@ class DatabaseLoadDriverEvent extends Event
|
|||
*
|
||||
* @var iDatabaseEngine|null
|
||||
*/
|
||||
public $databaseEngine = null;
|
||||
public ?iDatabaseEngine $databaseEngine = null;
|
||||
|
||||
/**
|
||||
* The name of the engine to be loaded
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $engineName;
|
||||
public string $engineName;
|
||||
|
||||
/**
|
||||
* Parameters of the database to be loaded
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $parameters;
|
||||
public array $parameters;
|
||||
|
||||
/**
|
||||
* Database group to load
|
||||
*
|
||||
* @var bool
|
||||
* @var string
|
||||
*/
|
||||
public $connectionName;
|
||||
public string $connectionName;
|
||||
|
||||
public function init(string $engineName, array $parameters, string $connectionName)
|
||||
{
|
||||
|
|
|
@ -49,40 +49,40 @@ class DatabaseLoadTableModelEvent extends Event
|
|||
*
|
||||
* @var iDatabaseTableModel|null
|
||||
*/
|
||||
public $tableModel = null;
|
||||
public ?iDatabaseTableModel $tableModel = null;
|
||||
|
||||
/**
|
||||
* The name of the engine to be loaded
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $tableModelName;
|
||||
public string $engineName;
|
||||
|
||||
/**
|
||||
* The name of the table this model manages
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $tableName;
|
||||
public string $tableName;
|
||||
|
||||
/**
|
||||
* Parameters of the database to be loaded
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $parameters;
|
||||
public array $parameters;
|
||||
|
||||
/**
|
||||
* Database group to load
|
||||
*
|
||||
* @var bool
|
||||
* @var string
|
||||
*/
|
||||
public $connectionName;
|
||||
public string $connectionName;
|
||||
|
||||
|
||||
public function init(string $tableModelName, array $parameters, string $connectionName, string $tableName)
|
||||
public function init(string $engineName, array $parameters, string $connectionName, string $tableName)
|
||||
{
|
||||
$this->tableModelName = $tableModelName;
|
||||
$this->engineName = $engineName;
|
||||
$this->parameters = $parameters;
|
||||
$this->connectionName = $connectionName;
|
||||
$this->tableName = $tableName;
|
||||
|
|
|
@ -49,28 +49,28 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
*
|
||||
* @var Database
|
||||
*/
|
||||
private $databases;
|
||||
private Database $databases;
|
||||
|
||||
/**
|
||||
* Whether the tableModel has been properly setup
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $setup = false;
|
||||
protected bool $setup = false;
|
||||
|
||||
/**
|
||||
* Holds the PDOEngine for this model
|
||||
*
|
||||
* @var MongoEngine
|
||||
*/
|
||||
protected $dbEngine;
|
||||
protected MongoEngine $dbEngine;
|
||||
|
||||
/**
|
||||
* Holds the collection that is being modified
|
||||
*
|
||||
* @var Collection
|
||||
*/
|
||||
protected $collection;
|
||||
protected Collection $collection;
|
||||
|
||||
/**
|
||||
* Initializes the model
|
||||
|
@ -79,8 +79,11 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
* @param string $tableName
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName)
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName): void
|
||||
{
|
||||
if (!$engine instanceof MongoEngine)
|
||||
throw new DatabaseException('MongoTableModel can only be used with a MongoEngine');
|
||||
|
||||
$this->dbEngine = $engine;
|
||||
$this->collection = $this->getCollection($tableName);
|
||||
$this->setup = true;
|
||||
|
@ -96,7 +99,7 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
* @return Collection
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
protected function getCollection(string $collectionString)
|
||||
protected function getCollection(string $collectionString): Collection
|
||||
{
|
||||
// Determine collection
|
||||
$coll = explode('.', $collectionString);
|
||||
|
@ -122,6 +125,18 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
return 'mongo';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return iDatabaseEngine
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function getEngine(): iDatabaseEngine
|
||||
{
|
||||
if (!$this->setup)
|
||||
throw new DatabaseException("Could not return Engine. Engine not setup yet.");
|
||||
|
||||
return $this->dbEngine;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @param array $options
|
||||
|
@ -155,10 +170,10 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
* @param array $filter
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return array
|
||||
* @return TableModelResult
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function read(array $filter = [], array $options = [], string $table = 'default'): array
|
||||
public function read(array $filter = [], array $options = [], string $table = 'default'): TableModelResult
|
||||
{
|
||||
// Select collection
|
||||
if ($table == 'default')
|
||||
|
@ -169,12 +184,8 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
// Execute the request
|
||||
$results = $collection->find($filter, $options);
|
||||
|
||||
// Return the result
|
||||
$return = [];
|
||||
foreach ($results->toArray() as $result)
|
||||
$return[] = iterator_to_array($result);
|
||||
|
||||
return $return;
|
||||
// Convert the result into a TableModelResult
|
||||
return new TableModelResult($results);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -232,7 +243,7 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
*/
|
||||
public function transactionStart(): bool
|
||||
{
|
||||
// TODO: Implement transactionStart() method.
|
||||
return $this->dbEngine->transactionStart();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -240,7 +251,7 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
*/
|
||||
public function transactionEnd(): bool
|
||||
{
|
||||
// TODO: Implement transactionEnd() method.
|
||||
return $this->dbEngine->transactionEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -248,7 +259,7 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
*/
|
||||
public function transactionCommit(): bool
|
||||
{
|
||||
// TODO: Implement transactionCommit() method.
|
||||
return $this->dbEngine->transactionCommit();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -256,7 +267,7 @@ class MongoTableModel implements iDatabaseTableModel
|
|||
*/
|
||||
public function transactionRollback(): bool
|
||||
{
|
||||
// TODO: Implement transactionRollback() method.
|
||||
return $this->dbEngine->transactionRollback();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -65,37 +65,41 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
*
|
||||
* @var PDOEngine
|
||||
*/
|
||||
protected $dbEngine;
|
||||
protected PDOEngine $dbEngine;
|
||||
|
||||
/**
|
||||
* Whether the tableModel has been properly setup
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $setup = false;
|
||||
protected bool $setup = false;
|
||||
|
||||
/**
|
||||
* The table this model manages on the database
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $tableName;
|
||||
protected string $tableName;
|
||||
|
||||
/**
|
||||
* The last statement used by PDO
|
||||
*
|
||||
* @var PDOStatementWrapper
|
||||
*/
|
||||
protected $lastStatement;
|
||||
protected PDOStatementWrapper $lastStatement;
|
||||
|
||||
/**
|
||||
* Initializes the model
|
||||
*
|
||||
* @param iDatabaseEngine $engine
|
||||
* @param string $tableName
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName)
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName): void
|
||||
{
|
||||
if (!$engine instanceof PDOEngine)
|
||||
throw new DatabaseException('PDOTableModel can only be used with PDOEngine');
|
||||
|
||||
$this->dbEngine = $engine;
|
||||
$this->tableName = $tableName;
|
||||
$this->setup = true;
|
||||
|
@ -119,30 +123,37 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
return 'pdo';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return iDatabaseEngine
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function getEngine(): iDatabaseEngine
|
||||
{
|
||||
if (!$this->setup)
|
||||
throw new DatabaseException("Could not return Engine. Engine not setup yet.");
|
||||
|
||||
return $this->dbEngine;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return int
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function create(array $data, array $options = [], string $table = 'default'): int
|
||||
public function create(array $data, array $options = []): int
|
||||
{
|
||||
// If no data is provided, stop now
|
||||
if (empty($data))
|
||||
throw new DatabaseException("Could not create data. No data provided.");
|
||||
|
||||
// Select table
|
||||
if ($table == 'default')
|
||||
$table = $this->tableName;
|
||||
|
||||
// Determine which fields will be inserted
|
||||
$fieldsArr = $this->createFields($data);
|
||||
$fields = $fieldsArr['fields'];
|
||||
$values = $fieldsArr['values'];
|
||||
|
||||
// Generate the sql and create a PDOStatement
|
||||
$sql = "INSERT INTO {$table} ({$fields}) VALUES ({$values})";
|
||||
$sql = "INSERT INTO {$this->tableName} ({$fields}) VALUES ({$values})";
|
||||
|
||||
/** @var PDOStatement $statement */
|
||||
$this->lastStatement = $this->dbEngine->prepare($sql);
|
||||
|
@ -159,83 +170,59 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
}
|
||||
|
||||
/**
|
||||
* @todo: WRITE ABOUT FETCHMODE
|
||||
*
|
||||
* @param array $filter
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return array
|
||||
* @return TableModelResult
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function read(array $filter = [], array $options = [], string $table = 'default'): array
|
||||
public function read(array $filter = [], array $options = []): TableModelResult
|
||||
{
|
||||
// Select table
|
||||
if ($table == 'default')
|
||||
$table = $this->tableName;
|
||||
|
||||
// Determine which fields to select. If none provided, select all
|
||||
$fields = (isset($options['fields']) && is_array($options['fields']) ? implode(',', $options['fields']) : '*');
|
||||
$limit = isset($options['limit']) ? 'LIMIT ' . intval($options['limit']) : '';
|
||||
|
||||
// Apply the filter. If none provided, don't condition it
|
||||
$where = $this->filter($filter);
|
||||
|
||||
// If a JOIN is provided, create the statement
|
||||
if (isset($options['join']))
|
||||
{
|
||||
$joinType = (isset($options['join']['joinType']) ? strtoupper($options['join']['joinType']) : 'LEFT');
|
||||
$targetTable = (isset($options['join']['targetTable']) ? $options['join']['targetTable'] : null);
|
||||
$targetField = (isset($options['join']['targetField']) ? $options['join']['targetField'] : null);
|
||||
$sourceField = (isset($options['join']['sourceField']) ? $options['join']['sourceField'] : null);
|
||||
if (is_null($targetTable) || is_null($targetField) || is_null($sourceField))
|
||||
throw new DatabaseException("Could not read from '" . $table . "'. Missing fields in join options.");
|
||||
|
||||
$join = "{$joinType} JOIN {$targetTable} ON {$table}.{$sourceField} = {$targetTable}.{$targetField}";
|
||||
}
|
||||
else
|
||||
$join = '';
|
||||
|
||||
// Generate the sql and create a PDOStatement
|
||||
$sql = "SELECT " . $fields . " FROM {$table} {$join} " . $where;
|
||||
$sql = "SELECT " . $fields . " FROM {$this->tableName} " . $where . " " . $limit;
|
||||
|
||||
/** @var PDOStatement $statement */
|
||||
$this->lastStatement = $this->dbEngine->prepare($sql);
|
||||
|
||||
// Return prepared statement, if requested to do so
|
||||
if (isset($options['returnPreparedStatement']) && $options['returnPreparedStatement'] == true)
|
||||
return [];
|
||||
|
||||
// And execute the query
|
||||
$this->lastStatement->execute($filter);
|
||||
foreach ($filter as $key => $val)
|
||||
{
|
||||
if (is_null($val))
|
||||
$this->lastStatement->bindValue(':' . $key, $val, PDO::PARAM_NULL);
|
||||
else
|
||||
$this->lastStatement->bindValue(':' . $key, $val);
|
||||
}
|
||||
|
||||
// And return the result
|
||||
$fetchMode = (isset($options['fetchMode']) ? $options['fetchMode'] : PDO::FETCH_ASSOC);
|
||||
if (is_array($fetchMode))
|
||||
return $this->lastStatement->fetchAll(...$fetchMode);
|
||||
$this->lastStatement->execute();
|
||||
|
||||
return $this->lastStatement->fetchAll($fetchMode);
|
||||
// Fetch PDO Iterable
|
||||
return new TableModelResult($this->lastStatement->getStatement());
|
||||
}
|
||||
|
||||
public function update(array $data, array $filter, array $options = [], string $table = 'default'): int
|
||||
public function update(array $data, array $filter, array $options = []): int
|
||||
{
|
||||
// If no data is provided, stop now
|
||||
if (empty($data))
|
||||
throw new DatabaseException("Could not update data. No data provided.");
|
||||
|
||||
// Select table
|
||||
if ($table == 'default')
|
||||
$table = $this->tableName;
|
||||
|
||||
// Apply the filter
|
||||
$where = $this->filter($filter);
|
||||
|
||||
// Determine fields and values
|
||||
$fields = [];
|
||||
foreach ($data as $key => $val)
|
||||
$fields[] = $key."=:".$key;
|
||||
|
||||
$fields = implode(', ', $fields);
|
||||
|
||||
// Generate the sql and create a PDOStatement
|
||||
$sql = "UPDATE {$table} SET {$fields} {$where}";
|
||||
$sql = "UPDATE {$this->tableName} SET {$fields} {$where}";
|
||||
|
||||
/** @var PDOStatement $statement */
|
||||
$this->lastStatement = $this->dbEngine->prepare($sql);
|
||||
|
@ -250,17 +237,14 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
return $this->lastStatement->rowCount();
|
||||
}
|
||||
|
||||
public function delete(array $filter, array $options = [], string $table = 'default'): int
|
||||
public function delete(array $filter, array $options = []): int
|
||||
{
|
||||
// Select table
|
||||
if ($table == 'default')
|
||||
$table = $this->tableName;
|
||||
|
||||
// Apply the filter
|
||||
$where = $this->filter($filter);
|
||||
$limit = isset($options['limit']) ? 'LIMIT ' . intval($options['limit']) : '';
|
||||
|
||||
// Generate the sql and create a PDOStatement
|
||||
$sql = "DELETE FROM {$table} " . $where;
|
||||
$sql = "DELETE FROM {$this->tableName} " . $where . " " . $limit;
|
||||
|
||||
/** @var PDOStatement $statement */
|
||||
$this->lastStatement = $this->dbEngine->prepare($sql);
|
||||
|
@ -272,11 +256,6 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
return $this->lastStatement->rowCount();
|
||||
}
|
||||
|
||||
public function getLastStatement(): PDOStatementWrapper
|
||||
{
|
||||
return $this->lastStatement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* @throws TransactionException
|
||||
|
@ -367,6 +346,8 @@ class PDOTableModel implements iDatabaseTableModel
|
|||
$record = $record[0];
|
||||
|
||||
// Determine the fields and values
|
||||
$fields = [];
|
||||
$values = [];
|
||||
foreach ($record as $key => $val)
|
||||
{
|
||||
$fields[] = $key;
|
||||
|
|
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
/**
|
||||
* FuzeWorks Component.
|
||||
*
|
||||
* The FuzeWorks PHP FrameWork
|
||||
*
|
||||
* Copyright (C) 2013-2019 TechFuze
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* @author TechFuze
|
||||
* @copyright Copyright (c) 2013 - 2019, TechFuze. (http://techfuze.net)
|
||||
* @license https://opensource.org/licenses/MIT MIT License
|
||||
*
|
||||
* @link http://techfuze.net/fuzeworks
|
||||
* @since Version 1.2.0
|
||||
*
|
||||
* @version Version 1.2.0
|
||||
*/
|
||||
|
||||
namespace FuzeWorks\Model;
|
||||
use ArrayObject;
|
||||
use IteratorAggregate;
|
||||
use Traversable;
|
||||
|
||||
class TableModelResult implements IteratorAggregate
|
||||
{
|
||||
|
||||
/**
|
||||
* Raw result from the TableModel
|
||||
*
|
||||
* @var Traversable
|
||||
*/
|
||||
private iterable $raw;
|
||||
|
||||
/**
|
||||
* Result from the TableModel, possibly altered by TableModelResult methods.
|
||||
*
|
||||
* @var ArrayObject
|
||||
*/
|
||||
private ArrayObject $result;
|
||||
|
||||
/**
|
||||
* @var Traversable
|
||||
*/
|
||||
private iterable $traversable;
|
||||
|
||||
/**
|
||||
* Whether the raw input has already been fully fetched
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private bool $fullyFetched = false;
|
||||
|
||||
public function __construct(iterable $results)
|
||||
{
|
||||
$this->raw = $results;
|
||||
$this->traversable = $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Group the results by a certain field.
|
||||
*
|
||||
* @param string $field
|
||||
* @return TableModelResult
|
||||
*/
|
||||
public function group(string $field): self
|
||||
{
|
||||
// First make sure all data is fetched
|
||||
$this->allToArray();
|
||||
|
||||
// Afterwards build a grouped array
|
||||
$grouped = [];
|
||||
foreach ($this->result->getIterator() as $key => $val)
|
||||
{
|
||||
// Check if this group exists within the results
|
||||
if (isset($val[$field]))
|
||||
{
|
||||
// Name of the group
|
||||
$fieldSelector = $val[$field];
|
||||
|
||||
// If the group has never been found before, add the array
|
||||
if (!isset($grouped[$fieldSelector]))
|
||||
$grouped[$fieldSelector] = [];
|
||||
|
||||
unset($val[$field]);
|
||||
$grouped[$fieldSelector][] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
$this->result->exchangeArray($grouped);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the result into an array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
// First make sure all data is fetched
|
||||
$this->allToArray();
|
||||
|
||||
// And return a copy
|
||||
return $this->result->getArrayCopy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an external iterator
|
||||
* @link https://php.net/manual/en/iteratoraggregate.getiterator.php
|
||||
* @return Traversable An instance of an object implementing <b>Iterator</b> or
|
||||
* <b>Traversable</b>
|
||||
* @since 5.0.0
|
||||
*/
|
||||
public function getIterator(): Traversable
|
||||
{
|
||||
return $this->traversable;
|
||||
}
|
||||
|
||||
private function allToArray(): void
|
||||
{
|
||||
// If the input has already been fetched, ignore it
|
||||
if ($this->fullyFetched)
|
||||
return;
|
||||
|
||||
$result = [];
|
||||
foreach ($this->raw as $key => $val)
|
||||
{
|
||||
// Clear out all numeric keys
|
||||
foreach ($val as $recKey => $recVal)
|
||||
if (is_numeric($recKey))
|
||||
unset($val[$recKey]);
|
||||
|
||||
$result[$key] = $val;
|
||||
}
|
||||
|
||||
// Set the variable
|
||||
$this->result = new ArrayObject($result);
|
||||
|
||||
// Afterwards modify the traversable
|
||||
$this->traversable = $this->result->getIterator();
|
||||
|
||||
// Set fullyFetched to true so it doesn't get fetched again
|
||||
$this->fullyFetched = true;
|
||||
}
|
||||
|
||||
}
|
|
@ -35,80 +35,121 @@
|
|||
*/
|
||||
|
||||
namespace FuzeWorks\Model;
|
||||
|
||||
|
||||
use FuzeWorks\DatabaseEngine\iDatabaseEngine;
|
||||
use FuzeWorks\Exception\DatabaseException;
|
||||
|
||||
interface iDatabaseTableModel
|
||||
{
|
||||
/**
|
||||
* Returns the name of the TableModel.
|
||||
*
|
||||
* Usually 'pdo' or 'mongo'.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string;
|
||||
|
||||
/**
|
||||
* Return the name of the engine used by this TableModel.
|
||||
*
|
||||
* Usually 'pdo' or 'mongo'
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getEngineName(): string;
|
||||
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName);
|
||||
/**
|
||||
* Return the engine used by this TableModel
|
||||
*
|
||||
* @return iDatabaseEngine
|
||||
*/
|
||||
public function getEngine(): iDatabaseEngine;
|
||||
|
||||
/**
|
||||
* Method invoked by FuzeWorks\Database to setup this tableModel.
|
||||
*
|
||||
* Provides the TableModel with the appropriate iDatabaseEngine and the name of the table.
|
||||
*
|
||||
* @param iDatabaseEngine $engine
|
||||
* @param string $tableName
|
||||
* @return void
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function setUp(iDatabaseEngine $engine, string $tableName): void;
|
||||
|
||||
/**
|
||||
* Returns whether the TableModel has been setup yet
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isSetup(): bool;
|
||||
|
||||
/**
|
||||
* Creates data in the model.
|
||||
*
|
||||
* @param array $data
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return int
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function create(array $data, array $options = [], string $table = 'default'): int;
|
||||
public function create(array $data, array $options = []): int;
|
||||
|
||||
/**
|
||||
* Returns data from the model in the form of a TableModelResult
|
||||
*
|
||||
* @param array $filter
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return array
|
||||
* @return TableModelResult
|
||||
* @throws DatabaseException
|
||||
* @see TableModelResult
|
||||
*/
|
||||
public function read(array $filter = [], array $options = [], string $table = 'default'): array;
|
||||
public function read(array $filter = [], array $options = []): TableModelResult;
|
||||
|
||||
/**
|
||||
* Updates data in the model
|
||||
*
|
||||
* @param array $data
|
||||
* @param array $filter
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return int
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function update(array $data, array $filter, array $options = [], string $table = 'default'): int;
|
||||
public function update(array $data, array $filter, array $options = []): int;
|
||||
|
||||
/**
|
||||
* Deletes data from the model
|
||||
*
|
||||
* @param array $filter
|
||||
* @param array $options
|
||||
* @param string $table
|
||||
* @return int
|
||||
* @throws DatabaseException
|
||||
*/
|
||||
public function delete(array $filter, array $options = [], string $table = 'default'): int;
|
||||
public function delete(array $filter, array $options = []): int;
|
||||
|
||||
/**
|
||||
* Starts a transaction in the model when supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function transactionStart(): bool;
|
||||
|
||||
/**
|
||||
* Ends a transaction in the model when supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function transactionEnd(): bool;
|
||||
|
||||
/**
|
||||
* Commits changes in the model when supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function transactionCommit(): bool;
|
||||
|
||||
/**
|
||||
* Rolls back changes in the modle when supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function transactionRollback(): bool;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<tr>
|
||||
<td>
|
||||
<?php if (!empty($query['errors'])): ?>
|
||||
<span title="<?= htmlSpecialChars((isset($query['errors']['message']) ? $query['errors']['message'] : ''), ENT_IGNORE | ENT_QUOTES, 'UTF-8') ?>">ERROR</span>
|
||||
<span title="<?= htmlSpecialChars(($query['errors']['message'] ?? ''), ENT_IGNORE | ENT_QUOTES, 'UTF-8') ?>">ERROR</span>
|
||||
<br /><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^tr .nette-DbConnectionPanel-explain">explain</a>
|
||||
<?php elseif ($query['timings'] !== 0): echo sprintf('%0.3f', $query['timings'] * 1000); endif ?>
|
||||
</td>
|
||||
|
@ -37,7 +37,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td><?= htmlSpecialChars($query['errors']['code'], ENT_NOQUOTES, 'UTF-8') ?></td>
|
||||
<td><?= htmlSpecialChars((isset($query['errors']['message']) ? $query['errors']['message'] : ''), ENT_NOQUOTES, 'UTF-8') ?></td>
|
||||
<td><?= htmlSpecialChars(($query['errors']['message'] ?? ''), ENT_NOQUOTES, 'UTF-8') ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif ?>
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
* @link http://techfuze.net/fuzeworks
|
||||
* @since Version 1.1.4
|
||||
*
|
||||
* @version Version 1.1.4
|
||||
* @version Version 1.3.0
|
||||
*/
|
||||
|
||||
use FuzeWorks\Logger;
|
||||
|
@ -41,18 +41,11 @@ chdir(dirname(__DIR__));
|
|||
|
||||
// Load the FuzeWorks container
|
||||
$container = require('bootstrap.php');
|
||||
Logger::disableHandlers();
|
||||
|
||||
// Load the test abstract
|
||||
require_once 'database/DatabaseTestAbstract.php';
|
||||
|
||||
// Reset error and exception handlers
|
||||
ob_start();
|
||||
restore_error_handler();
|
||||
restore_exception_handler();
|
||||
|
||||
// Set logger template for output in CLI
|
||||
Logger::setLoggerTemplate('logger_cli');
|
||||
|
||||
// Display all errors
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL | E_STRICT);
|
||||
|
@ -60,4 +53,5 @@ error_reporting(E_ALL | E_STRICT);
|
|||
// Set localhost "remote" IP
|
||||
isset($_SERVER['REMOTE_ADDR']) OR $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
|
||||
|
||||
|
||||
// Set logger template for output in CLI
|
||||
Logger::setLoggerTemplate('logger_cli');
|
|
@ -47,15 +47,12 @@ $configurator->setLogDirectory(dirname(__FILE__) . '/temp');
|
|||
|
||||
// Other values
|
||||
$configurator->setTimeZone('Europe/Amsterdam');
|
||||
$configurator->enableDebugMode(true)->setDebugAddress('ALL');
|
||||
$configurator->enableDebugMode()->setDebugAddress('ALL');
|
||||
|
||||
// Implement the Layout Component
|
||||
$configurator->addComponent(new DatabaseComponent());
|
||||
$configurator->addComponent(new TracyComponent());
|
||||
|
||||
// Create container
|
||||
$container = $configurator->createContainer();
|
||||
|
||||
// And return the result
|
||||
return $container;
|
||||
return $configurator->createContainer();
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
|
||||
use FuzeWorks\Factory;
|
||||
use FuzeWorks\Database;
|
||||
use FuzeWorks\Exception\DatabaseException;
|
||||
|
||||
/**
|
||||
* Class databaseTest.
|
||||
|
@ -49,9 +48,9 @@ class DatabaseTest extends DatabaseTestAbstract
|
|||
/**
|
||||
* @var Database
|
||||
*/
|
||||
protected $database;
|
||||
protected Database $database;
|
||||
|
||||
public function setUp()
|
||||
public function setUp(): void
|
||||
{
|
||||
$this->database = Factory::getInstance()->database;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
* @version Version 1.1.4
|
||||
*/
|
||||
|
||||
use FuzeWorks\Config;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use FuzeWorks\Events;
|
||||
use FuzeWorks\Factory;
|
||||
|
@ -51,15 +52,21 @@ abstract class DatabaseTestAbstract extends TestCase
|
|||
*
|
||||
* Reset the layout manager
|
||||
*/
|
||||
public function tearDown()
|
||||
public function tearDown(): void
|
||||
{
|
||||
// Clear all events created by tests
|
||||
Events::$listeners = array();
|
||||
Events::$listeners = [];
|
||||
|
||||
// Reset all config files
|
||||
Factory::getInstance()->config->discardConfigFiles();
|
||||
Factory::getInstance('config')->discardConfigFiles();
|
||||
|
||||
// Re-enable events, in case they have been disabled
|
||||
Events::enable();
|
||||
|
||||
// Remove Config overrides
|
||||
Config::$configOverrides = [];
|
||||
|
||||
// Remove autoloader
|
||||
Core::clearAutoloader();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,34 +1,19 @@
|
|||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"
|
||||
bootstrap="autoload.php"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
stopOnError="false"
|
||||
stopOnFailure="false"
|
||||
stopOnIncomplete="false"
|
||||
stopOnSkipped="false"
|
||||
colors="false">
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" bootstrap="autoload.php" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" stopOnError="false" stopOnFailure="false" stopOnIncomplete="false" stopOnSkipped="false" colors="false">
|
||||
<coverage processUncoveredFiles="false">
|
||||
<include>
|
||||
<directory suffix=".php">../</directory>
|
||||
</include>
|
||||
<exclude>
|
||||
<directory suffix=".php">../vendor/</directory>
|
||||
<directory suffix=".php">../test/</directory>
|
||||
<directory suffix=".php">../src/Layout/</directory>
|
||||
<directory suffix=".php">../src/Config/</directory>
|
||||
</exclude>
|
||||
</coverage>
|
||||
<testsuites>
|
||||
<testsuite name="FuzeWorks Database Suite">
|
||||
<testsuite name="Core Suite">
|
||||
<directory>./</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<logging>
|
||||
<log type="json" target="../build/phpunit/logfile.json"/>
|
||||
<log type="junit" target="../build/phpunit/logfile.xml"/>
|
||||
<log type="testdox-html" target="../build/phpunit/testdox.html"/>
|
||||
<log type="testdox-text" target="../build/phpunit/testdox.txt"/>
|
||||
</logging>
|
||||
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="false">
|
||||
<directory suffix=".php">../</directory>
|
||||
<exclude>
|
||||
<directory suffix=".php">../vendor/</directory>
|
||||
<directory suffix=".php">../tests/</directory>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
Loading…
Reference in New Issue