X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=214f2a9f68be77cbdb664148c6109567daa9f68e;hp=6c9dad6fad00f90653590482eda7f91cd4de341c;hb=f40bcdcb63cb7aa74f5d75c50a5316810944b8eb;hpb=aafcd2e5f59f75d8f82f03fd0acc7461bc7f448d diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 6c9dad6f..214f2a9f 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -23,6 +23,26 @@ * along with this program. If not, see . */ 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 */ @@ -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; } @@ -2979,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; @@ -3018,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)); /* @@ -3043,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__)); } @@ -3057,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 @@ -3068,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__)); } @@ -3085,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 @@ -3097,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 @@ -3111,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]