]> git.mxchange.org Git - core.git/blobdiff - framework/main/middleware/database/class_DatabaseConnection.php
Continued:
[core.git] / framework / main / middleware / database / class_DatabaseConnection.php
index 29e8c7c25714906d6ec6bc6d97e9099546ace7bd..b64d518926b7b0114747e2bd8ad26901e0143575 100644 (file)
@@ -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 <webmaster@shipsimu.org>
  * @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;
        }