X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=framework%2Fmain%2Fclasses%2Ffile_directories%2Fbinary%2Findex%2Fclass_IndexFile.php;h=23e7b40046adffde17c654e48fc0bf46ebb6afeb;hp=3fa46515e300fb679cb38f0a52c819d1d44e7730;hb=c13b7b610f3bce35ba1efbb395f202b111616611;hpb=146c8b3c929a1b0ab17d6605e5ae949ac44899c1 diff --git a/framework/main/classes/file_directories/binary/index/class_IndexFile.php b/framework/main/classes/file_directories/binary/index/class_IndexFile.php index 3fa46515..23e7b400 100644 --- a/framework/main/classes/file_directories/binary/index/class_IndexFile.php +++ b/framework/main/classes/file_directories/binary/index/class_IndexFile.php @@ -1,17 +1,22 @@ * @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 +33,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 IndexFile extends BaseBinaryFile implements Block { +class IndexFile extends BaseBinaryFile implements IndexableFile { /** * Protected constructor * @@ -42,48 +47,75 @@ class IndexFile extends BaseBinaryFile implements Block { /** * Creates an instance of this File class and prepares it for usage * - * @param $fileName Name of the index file - * @param $blockInstance An instance of a Block class - * @return $fileInstance An instance of this File class + * @param $fileInfoInstance An instance of a SplFileInfo class + * @param $indexInstance An instance of a Indexable class + * @return $indexFileInstance An instance of an IndexableFile class */ - public final static function createIndexFile ($fileName, Block $blockInstance) { + public final static function createIndexFile (SplFileInfo $fileInfoInstance, Indexable $indexInstance) { // Get a new instance - $fileInstance = new IndexFile(); + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: fileInfoInstance[%s]=%s,indexInstance=%s - CALLED!', get_class($fileInfoInstance), $fileInfoInstance, $indexInstance->__toString())); + $indexFileInstance = new IndexFile(); + + // Set file instance here for callbacks + $indexFileInstance->setIndexInstance($indexInstance); - // Set block instance here for callbacks - $fileInstance->setBlockInstance($blockInstance); + // Expand file name with .idx + $indexInfoInstance = new SplFileInfo(sprintf('%s.idx', $fileInfoInstance->__toString())); // Init this abstract file - $fileInstance->initFile($fileName); + $indexFileInstance->initFile($indexInfoInstance); // Return the prepared instance - return $fileInstance; + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: indexFileInstance=%s - EXIT!', $indexFileInstance->__toString())); + return $indexFileInstance; } /** * Writes given value to the file and returns a hash and gap position for it * - * @param $groupId Group identifier + * @param $stackName Group identifier * @param $value Value to be added to the stack * @return $data Hash and gap position - * @throws UnsupportedOperationException If this method is called + * @throws InvalidArgumentException If a parameter is not valid */ - public function writeValueToFile ($groupId, $value) { - self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] groupId=' . $groupId . ',value[' . gettype($value) . ']=' . print_r($value, true)); - throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + public function writeValueToFile (string $stackName, $value) { + // Validate parameter + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: stackName=%s,value[]=%s - CALLED!', $stackName, gettype($value))); + if (empty($stackName)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "stackName" is empty'); + } elseif (is_object($value) || is_resource($value)) { + // Not wanted here + throw new InvalidArgumentException(sprintf('value[]=%s is not stackable in files', gettype($value))); + } + + // Encode/convert the value into a "binary format" + $encoded = StringUtils::encodeData($value); + + // Get a strong hash for the "encoded" data + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: encoded=%s', $encoded)); + $hash = self::hash($encoded); + + // Then write it to the next free gap + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: hash=%s', $hash)); + $data = $this->getIndexInstance()->writeDataToFreeGap($stackName, $hash, $encoded); + + // Return info + /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('INDEX-FILE: data[]=%s - EXIT!', gettype($data))); + return $data; } /** * Writes given raw data to the file and returns a gap position and length * - * @param $groupId Group identifier + * @param $stackName Group identifier * @param $hash Hash from encoded value * @param $encoded Encoded value to be written to the file * @return $data Gap position and length of the raw data * @throws UnsupportedOperationException If this method is called */ - public function writeDataToFreeGap ($groupId, $hash, $encoded) { - self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] groupId=' . $groupId . ',encoded()=' . strlen($encoded)); + public function writeDataToFreeGap (string $stackName, string $hash, string $encoded) { + self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('INDEX-FILE: stackName=' . $stackName . ',hash=' . $hash . ',encoded()=' . strlen($encoded)); throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); }