]> git.mxchange.org Git - core.git/blobdiff - inc/classes/main/class_BaseFrameworkSystem.php
No iterator call here + added assertion.
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index 1710381fbb82e5707fadb1bf90b82d3fa7b2ee3e..214f2a9f68be77cbdb664148c6109567daa9f68e 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
+       /**
+        * Separator for header data
+        */
+       const SEPARATOR_HEADER_DATA = 0x01;
+
+       /**
+        * Separator header->entries
+        */
+       const SEPARATOR_HEADER_ENTRIES = 0x02;
+
+       /**
+        * Separator hash->name
+        */
+       const SEPARATOR_HASH_NAME = 0x03;
+
+       /**
+        * Separator entry->entry
+        */
+       const SEPARATOR_ENTRIES = 0x04;
+
        /**
         * Length of count
         */
@@ -33,6 +53,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        const LENGTH_POSITION = 20;
 
+       /**
+        * Length of name
+        */
+       const LENGTH_NAME = 10;
+
        /**
         * The real class name
         */
@@ -189,10 +214,15 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $pointerInstance = NULL;
 
        /**
-        * An instance of an index
+        * An instance of an Indexable class
         */
        private $indexInstance = NULL;
 
+       /**
+        * An instance of a CalculatableBlock class
+        */
+       private $blockInstance = NULL;
+
        /**
         * Thousands separator
         */
@@ -512,7 +542,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                $this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
                        $name,
                        gettype($value),
-                       $value
+                       print_r($value, TRUE)
                ));
        }
 
@@ -1311,6 +1341,25 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                return $this->indexInstance;
        }
 
+       /**
+        * Setter for CalculatableBlock instance
+        *
+        * @param       $blockInstance  An instance of an CalculatableBlock class
+        * @return      void
+        */
+       protected final function setBlockInstance (CalculatableBlock $blockInstance) {
+               $this->blockInstance = $blockInstance;
+       }
+
+       /**
+        * Getter for CalculatableBlock instance
+        *
+        * @return      $blockInstance  An instance of an CalculatableBlock class
+        */
+       public final function getBlockInstance () {
+               return $this->blockInstance;
+       }
+
        /**
         * Checks whether an object equals this object. You should overwrite this
         * method to implement own equality checks
@@ -2897,7 +2946,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         *
         * @return      $totalEntries   Size of file header
         */
-       protected final function getHeaderSize () {
+       public final function getHeaderSize () {
                // Get it
                return $this->headerSize;
        }
@@ -2913,6 +2962,27 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                $this->headerSize = $headerSize;
        }
 
+       /**
+        * Getter for header array
+        *
+        * @return      $totalEntries   Size of file header
+        */
+       protected final function getHeade () {
+               // Get it
+               return $this->header;
+       }
+
+       /**
+        * Setter for header
+        *
+        * @param       $header         Array for a file header
+        * @return      void
+        */
+       protected final function setHeader (array $header) {
+               // Set it
+               $this->header = $header;
+       }
+
        /**
         * Getter for seek position
         *
@@ -2958,10 +3028,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $isInitialized  Whether the file header is initialized
         */
        protected function isFileHeaderInitialized () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
                // Is the method there?
                assert(is_callable(array($this, 'readFileHeader')));
 
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
                // Default is not initialized
                $isInitialized = FALSE;
 
@@ -2997,8 +3068,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        protected function isFileInitialized () {
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
 
+               // size() must be callable
+               assert(is_callable(array($this, 'size')));
+
                // Get it from iterator which holds the pointer instance. If FALSE is returned
-               $fileSize = $this->getIteratorInstance()->size();
+               $fileSize = $this->size();
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] fileSize=%s', __METHOD__, __LINE__, $fileSize));
 
                /*
@@ -3022,12 +3096,54 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected function createFileHeader () {
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // The method flushFileHeader() must be callable
+               assert(is_callable(array($this, 'flushFileHeader')));
+
                // The file's header should not be initialized here
                assert(!$this->isFileHeaderInitialized());
 
                // Simple flush file header which will create it.
                $this->flushFileHeader();
 
+               // Rewind seek position (to beginning of file) and update/flush file header
+               $this->rewineUpdateSeekPosition();
+
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
+       }
+
+       /**
+        * Seeks to beginning of file, updates seek position in this object and
+        * flushes the header.
+        *
+        * @return      void
+        */
+       protected function rewineUpdateSeekPosition () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Seek to beginning of file
+               $this->getIteratorInstance()->rewind();
+
+               // And update seek position ...
+               $this->updateSeekPosition();
+
+               // ... to write it back into the file
+               $this->flushFileHeader();
+
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
+       }
+
+       /**
+        * Seeks to old position
+        *
+        * @return      void
+        */
+       protected function seekToOldPosition () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Seek to currently ("old") saved position
+               $this->getIteratorInstance()->seek($this->getSeekPosition());
+
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
        }
 
@@ -3036,9 +3152,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         *
         * @param       $seekPosition   Seek position
         * @param       $data                   Data to be written
+        * @param       $flushHeader    Whether to flush the header (default: flush)
         * @return      void
         */
-       protected function writeData ($seekPosition, $data) {
+       protected function writeData ($seekPosition, $data, $flushHeader = TRUE) {
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s,data()=%s - CALLED!', __METHOD__, __LINE__, $seekPosition, strlen($data)));
 
                // Write data at given position
@@ -3047,11 +3164,15 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Update seek position
                $this->updateSeekPosition();
 
-               // Flush header
-               $this->flushHeader();
+               // Flush the header?
+               if ($flushHeader === TRUE) {
+                       // Flush header
+                       $this->flushFileHeader();
+
+                       // Seek to old position
+                       $this->seekToOldPosition();
+               } // END - if
 
-               // Seek to old position
-               $this->seekToOldPosition();
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
        }
 
@@ -3064,6 +3185,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        protected function preAllocateFile ($type) {
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
 
+               // caluclateMinimumBlockLength() must be callable
+               assert(is_callable(array($this, 'caluclateMinimumBlockLength')));
+
                // Is it enabled?
                if ($this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_enabled') != 'Y') {
                        // Not enabled
@@ -3076,11 +3200,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Message to user
                self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Pre-allocating file ...', __METHOD__, __LINE__));
 
-               /*
-                * Calculate minimum length for one entry:
-                * minimum length = hash length + separator + name + minimum entry size = ?? + 1 + 10 + 1 = ??
-                */
-               $minLengthEntry = self::getHashLength() + strlen(self::SEPARATOR_HASH_NAME) + self::LENGTH_NAME + 1;
+               // Calculate minimum length for one entry
+               $minLengthEntry = $this->caluclateMinimumBlockLength();
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry));
 
                // Calulcate seek position
@@ -3090,8 +3211,34 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Now simply write a NUL there. This will pre-allocate the file.
                $this->writeData($seekPosition, chr(0));
 
+               // Rewind seek position (to beginning of file) and update/flush file header
+               $this->rewineUpdateSeekPosition();
+
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
        }
+
+       /**
+        * Checks whether the block separator has been found
+        *
+        * @param       $str            String to look in
+        * @return      $isFound        Whether the block separator has been found
+        */
+       public function isBlockSeparatorFound ($str) {
+               // Determine it
+               $isFound = (strpos($str, self::getBlockSeparator()) !== FALSE);
+
+               // Return result
+               return $isFound;
+       }
+
+       /**
+        * Getter for block separator character(s)
+        *
+        * @return      $blockSeparator         A separator for blocks
+        */
+       protected static final function getBlockSeparator () {
+               return chr(self::SEPARATOR_ENTRIES);
+       }
 }
 
 // [EOF]