X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=framework%2Fmain%2Fclasses%2Fstacker%2Ffile%2Fclass_BaseFileStack.php;h=5ddc1ca0d77371d4ea997cd5da8f21702faa3820;hb=3b182d1633e936618e118773da67fa41b24a6109;hp=43ac9cca75d20987518285e72e99c767b2ae031b;hpb=7e6c7982d988772a7310c082a7b5a73b5b3ca629;p=core.git diff --git a/framework/main/classes/stacker/file/class_BaseFileStack.php b/framework/main/classes/stacker/file/class_BaseFileStack.php index 43ac9cca..5ddc1ca0 100644 --- a/framework/main/classes/stacker/file/class_BaseFileStack.php +++ b/framework/main/classes/stacker/file/class_BaseFileStack.php @@ -1,17 +1,25 @@ * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2020 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -28,7 +36,7 @@ use CoreFramework\Filesystem\File\BaseBinaryFile; * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class BaseFileStack extends BaseStacker { +abstract class BaseFileStack extends BaseStacker { /** * Magic for this stack */ @@ -49,17 +57,41 @@ class BaseFileStack extends BaseStacker { */ const ARRAY_INDEX_DATA_LENGTH = 'length'; + /** + * An instance of an Indexable class + */ + private $indexInstance = NULL; + /** * Protected constructor * * @param $className Name of the class * @return void */ - protected function __construct ($className) { + protected function __construct (string $className) { // Call parent constructor parent::__construct($className); } + /** + * Setter for Indexable instance + * + * @param $indexInstance An instance of an Indexable class + * @return void + */ + protected final function setIndexInstance (Indexable $indexInstance) { + $this->indexInstance = $indexInstance; + } + + /** + * Getter for Indexable instance + * + * @return $indexInstance An instance of an Indexable class + */ + public final function getIndexInstance () { + return $this->indexInstance; + } + /** * Reads the file header * @@ -67,23 +99,23 @@ class BaseFileStack extends BaseStacker { * @todo To hard assertions here, better rewrite them to exceptions */ public function readFileHeader () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: CALLED!', __METHOD__, __LINE__)); // First rewind to beginning as the header sits at the beginning ... $this->getIteratorInstance()->rewind(); // Then read it (see constructor for calculation) $data = $this->getIteratorInstance()->read($this->getIteratorInstance()->getHeaderSize()); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Read %d bytes (%d wanted).', __METHOD__, __LINE__, strlen($data), $this->getIteratorInstance()->getHeaderSize())); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Read %d bytes (%d wanted).', strlen($data), $this->getIteratorInstance()->getHeaderSize())); // Have all requested bytes been read? assert(strlen($data) == $this->getIteratorInstance()->getHeaderSize()); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); // Last character must be the separator - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] data(-1)=%s', __METHOD__, __LINE__, dechex(ord(substr($data, -1, 1))))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: data(-1)=%s', dechex(ord(substr($data, -1, 1))))); assert(substr($data, -1, 1) == chr(BaseBinaryFile::SEPARATOR_HEADER_ENTRIES)); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); // Okay, then remove it $data = substr($data, 0, -1); @@ -104,25 +136,25 @@ class BaseFileStack extends BaseStacker { $this->getIteratorInstance()->setHeader($header); // Check if the array has only 3 elements - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] header(%d)=%s', __METHOD__, __LINE__, count($header), print_r($header, TRUE))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: header(%d)=%s', count($header), print_r($header, true))); assert(count($header) == 3); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); // Check magic assert($header[0] == self::STACK_MAGIC); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); // Check length of count and seek position assert(strlen($header[1]) == BaseBinaryFile::LENGTH_COUNT); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); assert(strlen($header[2]) == BaseBinaryFile::LENGTH_POSITION); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: Passed assert().', __METHOD__, __LINE__)); // Decode count and seek position $header[1] = hex2bin($header[1]); $header[2] = hex2bin($header[2]); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: EXIT!', __METHOD__, __LINE__)); } /** @@ -131,7 +163,7 @@ class BaseFileStack extends BaseStacker { * @return void */ public function flushFileHeader () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: CALLED!', __METHOD__, __LINE__)); // Put all informations together $header = sprintf('%s%s%s%s%s%s', @@ -155,22 +187,22 @@ class BaseFileStack extends BaseStacker { ); // Write it to disk (header is always at seek position 0) - $this->getIteratorInstance()->writeData(0, $header, FALSE); + $this->getIteratorInstance()->writeData(0, $header, false); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: EXIT!', __METHOD__, __LINE__)); } /** * Initializes this file-based stack. * - * @param $fileName File name of this stack + * @param $fileInfoInstance An instance of a SplFileInfo class * @param $type Type of this stack (e.g. url_source for URL sources) * @return void * @todo Currently the stack file is not cached, please implement a memory-handling class and if enough RAM is found, cache the whole stack file. */ - protected function initFileStack ($fileName, $type) { + protected function initFileStack (SplFileInfo $fileInfoInstance, string $type) { // Get a stack file instance - $fileInstance = ObjectFactory::createObjectByConfiguredName('stack_file_class', array($fileName, $this)); + $fileInstance = ObjectFactory::createObjectByConfiguredName('stack_file_class', array($fileInfoInstance, $this)); // Get iterator instance $iteratorInstance = ObjectFactory::createObjectByConfiguredName('file_iterator_class', array($fileInstance)); @@ -213,7 +245,7 @@ class BaseFileStack extends BaseStacker { * Get stack index instance. This can be used for faster * "defragmentation" and startup. */ - $indexInstance = FileStackIndexFactory::createFileStackIndexInstance($fileName, $type); + $indexInstance = FileStackIndexFactory::createFileStackIndexInstance($fileInfoInstance, $type); // And set it here $this->setIndexInstance($indexInstance); @@ -227,17 +259,15 @@ class BaseFileStack extends BaseStacker { * @return void * @throws FullStackerException If the stack is full */ - protected function addValue ($stackerName, $value) { + protected function addValue (string $stackerName, $value) { // Do some tests if ($this->isStackFull($stackerName)) { // Stacker is full throw new FullStackerException(array($this, $stackerName, $value), self::EXCEPTION_STACKER_IS_FULL); } // END - if - // Debug message - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName . ',value[' . gettype($value) . ']=' . print_r($value, TRUE)); - // No objects/resources are allowed as their serialization takes to long + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] stackerName=' . $stackerName . ',value[' . gettype($value) . ']=' . print_r($value, true)); assert(!is_object($value)); assert(!is_resource($value)); @@ -258,7 +288,7 @@ class BaseFileStack extends BaseStacker { * @return $value Value of last added value * @throws EmptyStackerException If the stack is empty */ - protected function getLastValue ($stackerName) { + protected function getLastValue (string $stackerName) { // Is the stack not yet initialized or full? if ($this->isStackEmpty($stackerName)) { // Throw an exception @@ -280,7 +310,7 @@ class BaseFileStack extends BaseStacker { * @return $value Value of last added value * @throws EmptyStackerException If the stack is empty */ - protected function getFirstValue ($stackerName) { + protected function getFirstValue (string $stackerName) { // Is the stack not yet initialized or full? if ($this->isStackEmpty($stackerName)) { // Throw an exception @@ -302,7 +332,7 @@ class BaseFileStack extends BaseStacker { * @return $value Value "poped" from array * @throws EmptyStackerException If the stack is empty */ - protected function popLast ($stackerName) { + protected function popLast (string $stackerName) { // Is the stack not yet initialized or full? if ($this->isStackEmpty($stackerName)) { // Throw an exception @@ -321,7 +351,7 @@ class BaseFileStack extends BaseStacker { * @return $value Value "shifted" from array * @throws EmptyStackerException If the named stacker is empty */ - protected function popFirst ($stackerName) { + protected function popFirst (string $stackerName) { // Is the stack not yet initialized or full? if ($this->isStackEmpty($stackerName)) { // Throw an exception @@ -339,10 +369,10 @@ class BaseFileStack extends BaseStacker { * @param $stackerName Name of the stack * @return $isFull Whether the stack is full */ - protected function isStackFull ($stackerName) { + protected function isStackFull (string $stackerName) { // File-based stacks will only run full if the disk space is low. - // @TODO Please implement this, returning FALSE - $isFull = FALSE; + // @TODO Please implement this, returning false + $isFull = false; // Return result return $isFull; @@ -355,7 +385,7 @@ class BaseFileStack extends BaseStacker { * @return $isEmpty Whether the stack is empty * @throws NoStackerException If given stack is missing */ - public function isStackEmpty ($stackerName) { + public function isStackEmpty (string $stackerName) { // So, is the stack empty? $isEmpty = (($this->getStackCount($stackerName)) == 0); @@ -371,7 +401,7 @@ class BaseFileStack extends BaseStacker { * @return void * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public function initStack ($stackerName, $forceReInit = FALSE) { + public function initStack (string $stackerName, bool $forceReInit = false) { throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -381,7 +411,7 @@ class BaseFileStack extends BaseStacker { * @return void * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public function initStacks (array $stacks, $forceReInit = FALSE) { + public function initStacks (array $stacks, bool $forceReInit = false) { throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -392,7 +422,7 @@ class BaseFileStack extends BaseStacker { * @return $isInitialized Whether the stack is initialized * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public function isStackInitialized ($stackerName) { + public function isStackInitialized (string $stackerName) { throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -406,23 +436,13 @@ class BaseFileStack extends BaseStacker { throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } - /** - * Getter for file name - * - * @return $fileName The current file name - * @throws UnsupportedOperationException This method is not (and maybe never will be) supported - */ - public function getFileName () { - throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); - } - /** * Getter for size of given stack (array count) * * @param $stackerName Name of the stack * @return $count Size of stack (array count) */ - public function getStackCount ($stackerName) { + public function getStackCount (string $stackerName) { // Now, simply return the found count value, this must be up-to-date then! return $this->getIteratorInstance()->getCounter(); } @@ -476,7 +496,7 @@ class BaseFileStack extends BaseStacker { * @return void * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public final function setHeaderSize ($headerSize) { + public final function setHeaderSize (int $headerSize) { throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -530,8 +550,8 @@ class BaseFileStack extends BaseStacker { * @return void * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public function writeData ($seekPosition, $data, $flushHeader = TRUE) { - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s,data[]=%s,flushHeader=%d', __METHOD__, __LINE__, $seekPosition, gettype($data), intval($flushHeader))); + public function writeData ($seekPosition, $data, bool $flushHeader = true) { + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: seekPosition=%s,data[]=%s,flushHeader=%d', $seekPosition, gettype($data), intval($flushHeader))); throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -544,7 +564,7 @@ class BaseFileStack extends BaseStacker { * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ public function writeValueToFile ($groupId, $value) { - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] groupId=%s,value[%s]=%s', __METHOD__, __LINE__, $groupId, gettype($value), print_r($value, TRUE))); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: groupId=%s,value[%s]=%s', $groupId, gettype($value), print_r($value, true))); throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -556,8 +576,8 @@ class BaseFileStack extends BaseStacker { * @return $seekPosition Found next gap's seek position * @throws UnsupportedOperationException This method is not (and maybe never will be) supported */ - public function searchNextGap ($length) { - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] length=%s', __METHOD__, __LINE__, $length)); + public function searchNextGap (int $length) { + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: length=%s', $length)); throw new UnsupportedOperationException(array($this, __FUNCTION__, $this->getIteratorInstance()->getPointerInstance()), self::EXCEPTION_UNSPPORTED_OPERATION); } @@ -579,11 +599,9 @@ class BaseFileStack extends BaseStacker { * @param $encoded Encoded value to be written to the file * @return $data Gap position and length of the raw data */ - public function writeDataToFreeGap ($groupId, $hash, $encoded) { - // Debug message - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] groupId=%s,hash=%s,encoded()=%d - CALLED!', __METHOD__, __LINE__, $groupId, $hash, strlen($encoded))); - + public function writeDataToFreeGap ($groupId, string $hash, $encoded) { // Raw data been written to the file + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: groupId=%s,hash=%s,encoded()=%d - CALLED!', $groupId, $hash, strlen($encoded))); $rawData = sprintf('%s%s%s%s%s', $groupId, BaseBinaryFile::SEPARATOR_GROUP_HASH, @@ -592,30 +610,24 @@ class BaseFileStack extends BaseStacker { $encoded ); - // Debug message - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] groupId=%s,hash=%s,rawData()=%d', __METHOD__, __LINE__, $groupId, $hash, strlen($rawData))); - // Search for next free gap + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: groupId=%s,hash=%s,rawData()=%d', $groupId, $hash, strlen($rawData))); $gapPosition = $this->getIteratorInstance()->searchNextGap(strlen($rawData)); // Gap position cannot be smaller than header length + 1 assert($gapPosition > $this->getIteratorInstance()->getHeaderSize()); - // Debug message - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] groupId=%s,hash=%s,gapPosition=%s', __METHOD__, __LINE__, $groupId, $hash, $gapPosition)); - // Then write the data at that gap + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: groupId=%s,hash=%s,gapPosition=%s', $groupId, $hash, $gapPosition)); $this->getIteratorInstance()->writeData($gapPosition, $rawData); - // Debug message - /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:%d:] groupId=%s,hash=%s,rawData()=%d - EXIT!', __METHOD__, __LINE__, $groupId, $hash, strlen($rawData))); - // Return gap position, hash and length of raw data - return array( + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('BASE-FILE-STACK: groupId=%s,hash=%s,rawData()=%d - EXIT!', $groupId, $hash, strlen($rawData))); + return [ self::ARRAY_INDEX_GAP_POSITION => $gapPosition, self::ARRAY_INDEX_HASH => $hash, - self::ARRAY_INDEX_DATA_LENGTH => strlen($rawData) - ); + self::ARRAY_INDEX_DATA_LENGTH => strlen($rawData), + ]; } }