X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=framework%2Fmain%2Fmiddleware%2Fdatabase%2Fclass_DatabaseConnection.php;h=b64d518926b7b0114747e2bd8ad26901e0143575;hp=29e8c7c25714906d6ec6bc6d97e9099546ace7bd;hb=HEAD;hpb=027c5659e968546a21be37e70d700c7e14cba993 diff --git a/framework/main/middleware/database/class_DatabaseConnection.php b/framework/main/middleware/database/class_DatabaseConnection.php index 29e8c7c2..b64d5189 100644 --- a/framework/main/middleware/database/class_DatabaseConnection.php +++ b/framework/main/middleware/database/class_DatabaseConnection.php @@ -8,15 +8,17 @@ use Org\Mxchange\CoreFramework\Criteria\Criteria; use Org\Mxchange\CoreFramework\Criteria\Storing\StoreableCriteria; use Org\Mxchange\CoreFramework\Database\Backend\DatabaseBackend; use Org\Mxchange\CoreFramework\Generic\FrameworkInterface; -use Org\Mxchange\CoreFramework\Registry\Registerable; use Org\Mxchange\CoreFramework\Middleware\BaseMiddleware; -use Org\Mxchange\CoreFramework\Middleware\Debug\DebugMiddleware; +use Org\Mxchange\CoreFramework\Registry\Registerable; +use Org\Mxchange\CoreFramework\Result\Database\BaseDatabaseResult; // Import SPL stuff use \InvalidArgumentException; +use \OutOfBoundsException; +use \UnexpectedValueException; /** - * Database selector class + * Database connectivity class * * @author Roland Haeder * @version 0.0.0 @@ -41,12 +43,12 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re /** * Array for connection data */ - private $connectData = array( + private $connectData = [ 'login' => '', 'pass' => '', 'dbase' => '', - 'host' => '' - ); + 'host' => '', + ]; /** * The real database layer @@ -69,21 +71,22 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re /** * Creates a new database connection layer * - * @param $debugInstance An instance of a DebugMiddleware class * @param $backendInstance An instance of a DatabaseBackend class * @todo $debugInstance is currently not used */ - public static final function createDatabaseConnection (DebugMiddleware $debugInstance, DatabaseBackend $backendInstance) { + public static final function createDatabaseConnection (DatabaseBackend $backendInstance) { // Get instance + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: backendInstance=%s - CALLED!', $backendInstance->__toString())); $databaseInstance = new DatabaseConnection(); // Set database layer - $databaseInstance->setDatabaseLayer($backendInstance); + $databaseInstance->setBackendInstance($backendInstance); // Set db instance self::$selfInstance = $databaseInstance; // Return instance + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: databaseInstance=%s - EXIT!', $databaseInstance->__toString())); return $databaseInstance; } @@ -96,6 +99,15 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re return self::$selfInstance; } + /** + * Setter for the real database layer + * @param $backendInstance An instance of a DatabaseBackend class + * @return void + */ + private final function setBackendInstance (DatabaseBackend $backendInstance) { + $this->backendInstance = $backendInstance; + } + /** * Setter for all database connection data. All these parameters may be * supported by the underlaying backend. @@ -105,13 +117,31 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re * @param $dbase Name of used database * @param $host Host to connect to (default: 127.0.0.1) * @return void + * @throws InvalidArgumentException If a parameter is empty */ - public final function setConnectionData (string $login, string $pass, string $dbase, string $host = '127.0.0.1') { + public final function setConnectionData (string $login, string $pass, string $dbase, string $host = 'localhost') { + // Check parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: login=%s,pass=%s,dbase=%s,host=%s CALLED!', $login, $pass, $dbase, $host)); + if (empty($login)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "login" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } elseif (empty($dbase)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "dbase" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } elseif (empty($host)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "host" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } + // Transfer connection data + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('DATABASE-CONNECTION: Setting data ...'); $this->connectData['login'] = $login; $this->connectData['pass'] = $pass; $this->connectData['dbase'] = $dbase; $this->connectData['host'] = $host; + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: EXIT!'); } /** @@ -123,15 +153,6 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re return $this->connectData; } - /** - * Setter for the real database layer - * @param $backendInstance An instance of a DatabaseBackend class - * @return void - */ - public final function setDatabaseLayer (DatabaseBackend $backendInstance) { - $this->backendInstance = $backendInstance; - } - /** * Getter for index key * @@ -149,21 +170,42 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re * @param $criteriaInstance An instance of a Criteria class * @return $result The result as an array * @throws InvalidArgumentException If a parameter is empty + * @throws OutOfBoundsException If important array elements are not present + * @throws UnexpectedValueException If $result['status'] is not 'ok' */ public function doSelectByTableCriteria (string $tableName, Criteria $criteriaInstance) { // Validate parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: tableName=%s,criteriaInstance=%s - CALLED!', $tableName, $criteriaInstance->__toString())); if (empty($tableName)) { // Throw IAE throw new InvalidArgumentException('Parameter "tableName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: Invoking this->backendInstance->connectToDatabase() ...'); $this->backendInstance->connectToDatabase(); // Get result from query + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: Invoking this->backendInstance->querySelect(%s,%s) ...', $tableName, $criteriaInstance->__toString())); $result = $this->backendInstance->querySelect($tableName, $criteriaInstance); + // Is a valid array returned? + if (!isset($result[BaseDatabaseResult::RESULT_NAME_STATUS])) { + // Missing element + throw new OutOfBoundsException(sprintf('result()=%d does not have element "%s"', count($result), BaseDatabaseResult::RESULT_NAME_STATUS), FrameworkInterface::EXCEPTION_OUT_OF_BOUNDS); + } elseif ($result[BaseDatabaseResult::RESULT_NAME_STATUS] != 'ok') { + // Is exception given? + if (isset($result[BaseDatabaseResult::RESULT_NAME_EXCEPTION])) { + // Attach it + throw new UnexpectedValueException(sprintf('result[%s]=%s is not "ok" with cause', BaseDatabaseResult::RESULT_NAME_STATUS), FrameworkInterface::EXCEPTION_INVALID_ARGUMENT, BaseDatabaseResult::RESULT_NAME_EXCEPTION); + } else { + // No exception attached + throw new UnexpectedValueException(sprintf('result[%s]=%s is not "ok"', BaseDatabaseResult::RESULT_NAME_STATUS, $result[BaseDatabaseResult::RESULT_NAME_STATUS]), FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } + } + // Return the result + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: result[]=%s - EXIT!', gettype($result))); return $result; } @@ -173,7 +215,12 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re * @return $exceptionInstance Last thrown exception */ public final function getLastException () { + // Get instance + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: CALLED!'); $exceptionInstance = $this->backendInstance->getLastException(); + + // Return it + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: exceptionInstance=%s - EXIT!', $exceptionInstance->__toString())); return $exceptionInstance; } @@ -185,10 +232,15 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re */ public function queryInsertDataSet (StoreableCriteria $dataSetInstance) { // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: dataSetInstance=%s - CALLED!', $dataSetInstance->__toString())); $this->backendInstance->connectToDatabase(); // Ask the database layer + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: Invoking this->backendInstance->queryInsertDataSet(%s) ...', $dataSetInstance->__toString())); $this->backendInstance->queryInsertDataSet($dataSetInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: EXIT!'); } /** @@ -199,10 +251,15 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re */ public function queryUpdateDataSet (StoreableCriteria $dataSetInstance) { // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: dataSetInstance=%s - CALLED!', $dataSetInstance->__toString())); $this->backendInstance->connectToDatabase(); // Ask the database layer + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: Invoking this->backendInstance->queryUpdateDataSet(%s) ...', $dataSetInstance->__toString())); $this->backendInstance->queryUpdateDataSet($dataSetInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: EXIT!'); } /** @@ -214,18 +271,22 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re */ public function getPrimaryKeyOfTable (string $tableName) { // Validate parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: tableName=%s - CALLED!', $tableName)); if (empty($tableName)) { // Throw IAE throw new InvalidArgumentException('Parameter "tableName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: Invoking this->backendInstance->connectToDatabase() ...'); $this->backendInstance->connectToDatabase(); // Ask the database layer + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: Invoking this->backendInstance->getPrimaryKeyOfTable(%s) ...', $tableName)); $primaryKey = $this->backendInstance->getPrimaryKeyOfTable($tableName); // Return the value + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: primaryKey=%s - CALLED!', $primaryKey)); return $primaryKey; } @@ -234,16 +295,26 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re * * @param $data An array with possible non-public data that needs to be removed. * @return $data A cleaned up array with only public data. + * @throws InvalidArgumentException If a parameter has an invalid value */ public function removeNonPublicDataFromArray (array $data) { + // Check parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: data()=%d - CALLED!', count($data))); + if (count($data) == 0) { + // Throw IAE + throw new InvalidArgumentException('Parameter "data" is an empty array', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } + // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: Invoking this->backendInstance->connectToDatabase() ...'); $this->backendInstance->connectToDatabase(); // Call database backend - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: Invoking this->backendInstance->removeNonPublicDataFromArray(data) ...'); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: Invoking this->backendInstance->removeNonPublicDataFromArray(data()=%d) ...', count($data))); $data = $this->backendInstance->removeNonPublicDataFromArray($data); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: data[]=' . gettype($data)); + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: data()=%d - EXIT!', count($data))); return $data; } @@ -256,18 +327,21 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re */ public function countTotalRows (string $tableName) { // Validate parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: tableName=%s - CALLED!', $tableName)); if (empty($tableName)) { // Throw IAE throw new InvalidArgumentException('Parameter "tableName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // Connect to the database + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('DATABASE-CONNECTION: Invoking this->backendInstance->connectToDatabase() ...'); $this->backendInstance->connectToDatabase(); // Ask the database layer $count = $this->backendInstance->countTotalRows($tableName); // Return the value + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('DATABASE-CONNECTION: count=%d - CALLED!', $count)); return $count; }