Added some new stuff.
authorRoland Haeder <roland@mxchange.org>
Sat, 18 Apr 2015 00:40:33 +0000 (02:40 +0200)
committerRoland Haeder <roland@mxchange.org>
Sat, 18 Apr 2015 00:40:44 +0000 (02:40 +0200)
Signed-off-by: Roland H├Ąder <roland@mxchange.org>
inc/classes/interfaces/database/backend/class_DatabaseBackend.php
inc/classes/interfaces/database/class_DatabaseWrapper.php
inc/classes/interfaces/database/middleware/class_DatabaseConnector.php
inc/classes/main/database/backend/class_CachedLocalFileDatabase.php
inc/classes/main/database/class_BaseDatabaseWrapper.php
inc/classes/main/file_directories/directory/class_FrameworkDirectoryPointer.php
inc/classes/middleware/database/class_DatabaseConnection.php

index 835815e..e040e8c 100644 (file)
  */
 interface DatabaseBackend extends FrameworkDatabase {
        /**
-        * Makes sure that the database connection is up and alive
+        * Getter for last read file
+        *
+        * @return      $lastFile       The last read file's name with full path
+        */
+       function getLastFile ();
+
+       /**
+        * Getter for last read file's content as an array
+        *
+        * @return      $lastContent    The array with elements 'header' and 'data'.
+        */
+       function getLastContents ();
+
+       /**
+        * Getter for file extension
+        *
+        * @return      $fileExtension  The array with elements 'header' and 'data'.
+        */
+       function getFileExtension ();
+
+       /**
+        * Getter for index key
+        *
+        * @return      $indexKey       Index key
+        */
+       function getIndexKey ();
+
+       /**
+        * Makes sure that the database connection is alive
         *
         * @return      void
+        * @todo        Do some checks on the database directory and files here
         */
        function connectToDatabase ();
 
@@ -37,16 +66,16 @@ interface DatabaseBackend extends FrameworkDatabase {
         * Starts a SELECT query on the database by given return type, table name
         * and search criteria
         *
-        * @param       $tableName              Name of the database table
-        * @param       $criteria               Search criteria class
-        * @return      $resultData             Result data of the query
+        * @param       $tableName                      Name of the database table
+        * @param       $searchInstance         Local search criteria class
+        * @return      $resultData                     Result data of the query
         * @throws      UnsupportedCriteriaException    If the criteria is unsupported
-        * @throws      SqlException                                    If an SQL error occurs
+        * @throws      SqlException                                    If an 'SQL error' occurs
         */
-       function querySelect ($tableName, LocalSearchCriteria $criteriaInstance);
+       function querySelect ($tableName, LocalSearchCriteria $searchInstance);
 
        /**
-        * 'Inserts' a data set instance into a local file database folder
+        * "Inserts" a data set instance into a local file database folder
         *
         * @param       $dataSetInstance        A storeable data set
         * @return      void
@@ -55,7 +84,7 @@ interface DatabaseBackend extends FrameworkDatabase {
        function queryInsertDataSet (StoreableCriteria $dataSetInstance);
 
        /**
-        * 'Updates' a data set instance with a database layer
+        * "Updates" a data set instance with a database layer
         *
         * @param       $dataSetInstance        A storeable data set
         * @return      void
@@ -64,12 +93,30 @@ interface DatabaseBackend extends FrameworkDatabase {
        function queryUpdateDataSet (StoreableCriteria $dataSetInstance);
 
        /**
-        * Removes non-public data from given array.
+        * Getter for primary key of specified table or if not found null will be
+        * returned. This must be database-specific.
+        *
+        * @param       $tableName              Name of the table we need the primary key from
+        * @return      $primaryKey             Primary key column of the given table
+        */
+       function getPrimaryKeyOfTable ($tableName);
+
+       /**
+        * Removes non-data from given array.
         *
-        * @param       $data   An array with possible non-public data that needs to be removed.
-        * @return      $data   A cleaned up array with only public data.
+        * @param       $data   An array with possible non-data that needs to be removed.
+        * @return      $data   A cleaned up array with only data.
+        * @todo        Add more generic non-data for removal
         */
        function removeNonPublicDataFromArray (array $data);
+
+       /**
+        * Counts total rows of given table
+        *
+        * @param       $tableName      Table name
+        * @return      $count          Total rows of given table
+        */
+       function countTotalRows($tableName);
 }
 
 // [EOF]
index ce2941c..0396225 100644 (file)
@@ -61,6 +61,13 @@ interface DatabaseWrapper extends FrameworkInterface {
         * @return      $primaryKey             Primary key used in wrapped table
         */
        function getPrimaryKeyValue();
+
+       /**
+        * Counts total rows of this table
+        *
+        * @return      $count  Total rows of this table
+        */
+       function countTotalRows();
 }
 
 // [EOF]
index 0763d68..86acb92 100644 (file)
@@ -109,6 +109,14 @@ interface DatabaseConnector extends FrameworkDatabase {
         * @return      $data   A cleaned up array with only public data.
         */
        function removeNonPublicDataFromArray (array $data);
+
+       /**
+        * Counts total rows of given table
+        *
+        * @param       $tableName      Table name
+        * @return      $count          Total rows of given table
+        */
+       function countTotalRows($tableName);
 }
 
 // [EOF]
index 1b25719..4e1a6a6 100644 (file)
@@ -583,7 +583,7 @@ class CachedLocalFileDatabase extends BaseDatabaseBackend implements DatabaseBac
                        $this->setLastException($e);
 
                        // Throw an SQL exception
-                       throw new SqlException(array($this, sprintf("Cannot write data to table &#39;%s&#39;, is the table created?", $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);
+                       throw new SqlException(array($this, sprintf('Cannot write data to table &#39;%s&#39;, is the table created?', $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);
                }
        }
 
@@ -623,6 +623,53 @@ class CachedLocalFileDatabase extends BaseDatabaseBackend implements DatabaseBac
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: data[' . gettype($data) . ']='.print_r($data, TRUE));
                return $data;
        }
+
+       /**
+        * Counts total rows of given table
+        *
+        * @param       $tableName      Table name
+        * @return      $count          Total rows of given table
+        */
+       public function countTotalRows($tableName) {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: tableName=' . $tableName . ' - CALLED!');
+
+               // Create full path name
+               $pathName = $this->getConfigInstance()->getConfigEntry('local_db_path') . $tableName . '/';
+
+               // Try all the requests
+               try {
+                       // Get a file pointer instance
+                       $directoryInstance = ObjectFactory::createObjectByConfiguredName('directory_class', array($pathName));
+
+                       // Initialize counter
+                       $count = 0;
+
+                       // Read the directory with some exceptions
+                       while ($dataFile = $directoryInstance->readDirectoryExcept(array('.htaccess', 'info.' . $this->getFileExtension()))) {
+                               // Does the extension match?
+                               if (substr($dataFile, -(strlen($this->getFileExtension()))) !== $this->getFileExtension()) {
+                                       // Debug message
+                                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension() . ' - SKIPPED!');
+                                       // Skip this file!
+                                       continue;
+                               } // END - if
+
+                               // Count this row up
+                               /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension() . ' - COUNTED!');
+                               $count++;
+                       } // END - while
+               } catch (FrameworkException $e) {
+                       // Catch all exceptions and store them in last error
+                       $this->setLastException($e);
+
+                       // Throw an SQL exception
+                       throw new SqlException(array($this, sprintf('Cannot count on table &#39;%s&#39;, is the table created?', $dataSetInstance->getTableName()), self::DB_CODE_TABLE_NOT_FOUND), self::EXCEPTION_SQL_QUERY);
+               }
+
+               // Return count
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: tableName=' . $tableName . ',count=' . $count . ' - EXIT!');
+               return $count;
+       }
 }
 
 // [EOF]
index fde30c9..c2a18b8 100644 (file)
@@ -51,8 +51,11 @@ class BaseDatabaseWrapper extends BaseFrameworkSystem {
         * @return      void
         */
        private final function initCacheInstance () {
-               // Set the new instance
-               $this->cacheInstance = CacheFactory::getFactory()->createConfiguredCache();
+               // Is the cache enabled?
+               if ($this->getConfigInstance()->getConfigEntry('database_cache_enabled') === TRUE) {
+                       // Set the new instance
+                       $this->cacheInstance = CacheFactory::getFactory()->createConfiguredCache();
+               } // END - if
        }
 
        /**
@@ -183,8 +186,11 @@ class BaseDatabaseWrapper extends BaseFrameworkSystem {
 
                        // Cache the result if not null
                        if (!is_null($result)) {
-                               // A valid result has returned from the database layer
-                               $this->cacheInstance->offsetSet($cacheKey, $result);
+                               // Is cache enabled?
+                               if ($this->getConfigInstance()->getConfigEntry('database_cache_enabled') === TRUE) {
+                                       // A valid result has returned from the database layer
+                                       $this->cacheInstance->offsetSet($cacheKey, $result);
+                               } // END - if
                        } else {
                                // This invalid result must be wrapped
                                $result = array(
@@ -242,6 +248,19 @@ class BaseDatabaseWrapper extends BaseFrameworkSystem {
                return $primaryKey;
        }
 
+       /**
+        * Count rows of this table
+        *
+        * @return      $count  Count of total rows in this table
+        */
+       public final function countTotalRows () {
+               // Get the table name and a database instance and ask for it
+               $count = $this->getDatabaseInstance()->countTotalRows($this->getTableName());
+
+               // Return value
+               return $count;
+       }
+
        /**
         * Removes non-public data from given array.
         *
index 1cc296c..b855a62 100644 (file)
@@ -128,9 +128,6 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem implements Framework
                // Can the next entry be read?
                assert($this->getDirectoryIteratorInstance()->valid());
 
-               // Default is FALSE
-               $currentEntry = FALSE;
-
                // Read data from the directory pointer and return it
                $currentEntry = $this->getDirectoryIteratorInstance()->current();
 
@@ -153,6 +150,7 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem implements Framework
                        return $this->readRawDirectory();
                } elseif (!$this->getDirectoryIteratorInstance()->valid()) {
                        // No more left to read
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: EOD reached.');
                        return NULL;
                }
 
@@ -167,10 +165,10 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem implements Framework
                if (is_object($currentEntry)) {
                        // Get file name
                        $rawLine = $currentEntry->getFilename();
-                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine);
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine . ',isDot=' . intval($this->getDirectoryIteratorInstance()->isDot()));
 
-                       // Is it not excluded?
-                       if (in_array($rawLine, $except)) {
+                       // Is it a dot-directory or excluded?
+                       if (($this->getDirectoryIteratorInstance()->isDot()) || (in_array($rawLine, $except))) {
                                // To next entry
                                $this->getDirectoryIteratorInstance()->next();
 
index 484575a..d3225c4 100644 (file)
@@ -185,6 +185,9 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re
         * @return      $data   A cleaned up array with only public data.
         */
        public function removeNonPublicDataFromArray (array $data) {
+               // Connect to the database
+               $this->dbLayer->connectToDatabase();
+
                // Call database backend
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: Calling this->dbLayer->removeNonPublicDataFromArray(data) ...');
                $data = $this->dbLayer->removeNonPublicDataFromArray($data);
@@ -192,6 +195,23 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: data[]=' . gettype($data));
                return $data;
        }
+
+       /**
+        * Count total table rows
+        *
+        * @param       $tableName      Table name
+        * @return      $count          Total row count
+        */
+       public function countTotalRows ($tableName) {
+               // Connect to the database
+               $this->dbLayer->connectToDatabase();
+
+               // Ask the database layer
+               $count = $this->dbLayer->countTotalRows($tableName);
+
+               // Return the value
+               return $count;
+       }
 }
 
 // [EOF]