From cce7dd2293cdb1a4b424d931cc66a88a3a84005d Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Tue, 20 May 2014 22:12:14 +0200 Subject: [PATCH] Introduced rewineUpdateSeekPosition() which needs to be called after pre-allocation is done, else the seek position (pointer) shows to the end of the file which is what you don't want. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- .../main/class_BaseFrameworkSystem.php | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 033718d9..b8bca943 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -2961,16 +2961,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ protected function updateSeekPosition () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); // Get key (= seek position) $seekPosition = $this->getIteratorInstance()->key(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Setting seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Setting seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); // And set it here $this->setSeekPosition($seekPosition); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); } /** @@ -2979,7 +2979,7 @@ 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__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); // Is the method there? assert(is_callable(array($this, 'readFileHeader'))); @@ -2991,7 +2991,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { if ($this->isFileInitialized()) { // Some bytes has been written, so rewind to start of it. $rewindStatus = $this->getIteratorInstance()->rewind(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] rewindStatus=%s', __METHOD__, __LINE__, $rewindStatus)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] rewindStatus=%s', __METHOD__, __LINE__, $rewindStatus)); // Is the rewind() call successfull? if ($rewindStatus != 1) { @@ -3007,7 +3007,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // END - if // Return result - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); return $isInitialized; } @@ -3017,11 +3017,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return $isInitialized Whether the file's size is zero */ protected function isFileInitialized () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); // Get it from iterator which holds the pointer instance. If FALSE is returned $fileSize = $this->getIteratorInstance()->size(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] fileSize=%s', __METHOD__, __LINE__, $fileSize)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] fileSize=%s', __METHOD__, __LINE__, $fileSize)); /* * The returned file size should not be FALSE or NULL as this means @@ -3033,7 +3033,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $isInitialized = ($fileSize > 0); // Return result - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); return $isInitialized; } @@ -3043,7 +3043,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ protected function createFileHeader () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); // The method flushFileHeader() must be callable assert(is_callable(array($this, 'flushFileHeader'))); @@ -3054,6 +3054,21 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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(); @@ -3063,7 +3078,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // ... to write it back into the file $this->flushFileHeader(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__)); } /** @@ -3072,8 +3087,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @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__)); } /** @@ -3085,7 +3104,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ 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))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s,data()=%s - CALLED!', __METHOD__, __LINE__, $seekPosition, strlen($data))); // Write data at given position $this->getIteratorInstance()->writeAtPosition($seekPosition, $data); @@ -3102,7 +3121,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->seekToOldPosition(); } // END - if - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); } /** @@ -3112,7 +3131,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ protected function preAllocateFile ($type) { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); // caluclateMinimumFileEntryLength() must be callable assert(is_callable(array($this, 'caluclateMinimumFileEntryLength'))); @@ -3131,16 +3150,19 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Calculate minimum length for one entry $minLengthEntry = $this->caluclateMinimumFileEntryLength(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry)); // Calulcate seek position $seekPosition = $minLengthEntry * $this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_count'); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); // Now simply write a NUL there. This will pre-allocate the file. $this->writeData($seekPosition, chr(0)); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + // 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__)); } } -- 2.39.5