From 65a9356fe91fab0489325b7f3a5662b8bbf0b110 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Fri, 16 May 2014 23:26:09 +0200 Subject: [PATCH] Continued on file-based stack: - renamed path file_stack -> file - added (stubs) seek() and size() - some improvements on format "documentation" MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- contrib/file_stack/format.txt | 2 +- .../class_SeekableWritableFileIterator.php | 9 ++- .../stacker/file}/.htaccess | 0 .../stacker/file/class_StackableFile.php | 42 +++++++++++++ .../main/iterator/io/class_FileIoIterator.php | 17 +++++- .../{file_stack/fifo => file}/.htaccess | 0 .../main/stacker/{file_stack => file}/class_ | 21 ++++++- .../class_BaseFileStack.php | 61 ++++++++++++++++++- inc/classes/main/stacker/file/fifo/.htaccess | 1 + .../fifo/class_FiFoFileStack.php | 21 ++++++- 10 files changed, 167 insertions(+), 7 deletions(-) rename inc/classes/{main/stacker/file_stack => interfaces/stacker/file}/.htaccess (100%) create mode 100644 inc/classes/interfaces/stacker/file/class_StackableFile.php rename inc/classes/main/stacker/{file_stack/fifo => file}/.htaccess (100%) rename inc/classes/main/stacker/{file_stack => file}/class_ (86%) rename inc/classes/main/stacker/{file_stack => file}/class_BaseFileStack.php (83%) create mode 100644 inc/classes/main/stacker/file/fifo/.htaccess rename inc/classes/main/stacker/{file_stack => file}/fifo/class_FiFoFileStack.php (86%) diff --git a/contrib/file_stack/format.txt b/contrib/file_stack/format.txt index 2a646c82..40044386 100644 --- a/contrib/file_stack/format.txt +++ b/contrib/file_stack/format.txt @@ -9,7 +9,7 @@ Purpose: | "magic" | separator | count | position | separator | ---------+-----------+-----------+----------+---------------+-----------+ Bytes: | 9 | 1 | 20 (hex) | 2 - n^2 (hex) | 1 | ---------+-----------+-----------+----------+---------------+-----------+ -Example: | STACKv1.0 | 00 | 00...ff | 01 | ff | +Example: | STACKv1.0 | 00 | 00...ff | 05 | ff | Continued: diff --git a/inc/classes/interfaces/iterator/class_SeekableWritableFileIterator.php b/inc/classes/interfaces/iterator/class_SeekableWritableFileIterator.php index 48dd8db4..33147d98 100644 --- a/inc/classes/interfaces/iterator/class_SeekableWritableFileIterator.php +++ b/inc/classes/interfaces/iterator/class_SeekableWritableFileIterator.php @@ -29,7 +29,14 @@ interface SeekableWritableFileIterator extends SeekableIterator { * @param $seekPosition Seek position in file * @return void */ - function seek ($seedPosition); + function seek ($seekPosition); + + /** + * Size of file stack + * + * @return $size Size (in bytes) of file + */ + function size (); } // [EOF] diff --git a/inc/classes/main/stacker/file_stack/.htaccess b/inc/classes/interfaces/stacker/file/.htaccess similarity index 100% rename from inc/classes/main/stacker/file_stack/.htaccess rename to inc/classes/interfaces/stacker/file/.htaccess diff --git a/inc/classes/interfaces/stacker/file/class_StackableFile.php b/inc/classes/interfaces/stacker/file/class_StackableFile.php new file mode 100644 index 00000000..01537288 --- /dev/null +++ b/inc/classes/interfaces/stacker/file/class_StackableFile.php @@ -0,0 +1,42 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +interface StackableFile extends Stackable { + /** + * Seeks to given position + * + * @param $seekPosition Seek position in file + * @return void + */ + function seek ($seekPosition); + + /** + * Size of file stack + * + * @return $size Size (in bytes) of file + */ + function size (); +} + +// [EOF] +?> diff --git a/inc/classes/main/iterator/io/class_FileIoIterator.php b/inc/classes/main/iterator/io/class_FileIoIterator.php index 1d546922..61045519 100644 --- a/inc/classes/main/iterator/io/class_FileIoIterator.php +++ b/inc/classes/main/iterator/io/class_FileIoIterator.php @@ -25,12 +25,12 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato /** * Current absolute seek position (returned by key()) */ - private $seekPosition = -1; + private $seekPosition = FALSE; /** * Total entries (read from file) */ - private $totalEntriesFile = -1; + private $totalEntriesFile = FALSE; /** * Protected constructor @@ -117,6 +117,19 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato $this->partialStub('Please implement this method. seekPosition=' . $seekPosition); } + /** + * Size of file stack + * + * @return $size Size (in bytes) of file + */ + public function size () { + // Call the pointer object + $size = $this->getPointerInstance()->size(); + + // Return result + return $size; + } + /** * Checks wether the current entry is valid (not at the end of the file). * This method will return TRUE if an emptied (nulled) entry has been found. diff --git a/inc/classes/main/stacker/file_stack/fifo/.htaccess b/inc/classes/main/stacker/file/.htaccess similarity index 100% rename from inc/classes/main/stacker/file_stack/fifo/.htaccess rename to inc/classes/main/stacker/file/.htaccess diff --git a/inc/classes/main/stacker/file_stack/class_ b/inc/classes/main/stacker/file/class_ similarity index 86% rename from inc/classes/main/stacker/file_stack/class_ rename to inc/classes/main/stacker/file/class_ index 217eacfe..8e8510a0 100644 --- a/inc/classes/main/stacker/file_stack/class_ +++ b/inc/classes/main/stacker/file/class_ @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class ???FileStack extends BaseFileStack implements Stackable { +class ???FileStack extends BaseFileStack implements StackableFile { /** * Protected constructor * @@ -84,6 +84,25 @@ class ???FileStack extends BaseFileStack implements Stackable { public function getNamed ($stackerName) { $this->partialStub('stackerName=' . $stackerName); } + + /** + * Seeks to given position + * + * @param $seekPosition Seek position in file + * @return void + */ + public function seek ($seekPosition) { + $this->partialStub('seekPosition=' . $seekPosition); + } + + /** + * Size of file stack + * + * @return $size Size (in bytes) of file + */ + public function size () { + $this->partialStub(); + } } // [EOF] diff --git a/inc/classes/main/stacker/file_stack/class_BaseFileStack.php b/inc/classes/main/stacker/file/class_BaseFileStack.php similarity index 83% rename from inc/classes/main/stacker/file_stack/class_BaseFileStack.php rename to inc/classes/main/stacker/file/class_BaseFileStack.php index 56590510..f0539e10 100644 --- a/inc/classes/main/stacker/file_stack/class_BaseFileStack.php +++ b/inc/classes/main/stacker/file/class_BaseFileStack.php @@ -40,7 +40,7 @@ class BaseFileStack extends BaseStacker { /** * Separator hash->name */ - const SEPARATOR_HASH_NAME = 0x01; + const SEPARATOR_HASH_NAME = 0x05; /** * Protected constructor @@ -53,6 +53,56 @@ class BaseFileStack extends BaseStacker { parent::__construct($className); } + /** + * Checks whether the file header is initialized + * + * @return $isInitialized Whether the file header is initialized + */ + private function isFileHeaderInitialized () { + // Default is not initialized + $isInitialized = FALSE; + + // Is the file initialized? + if ($this->isFileInitialized()) { + // Some bytes has been written, so rewind to start of it. + $this->getIteratorInstance()->rewind(); + + // Read file header + $this->readFileHeader(); + } // END - if + + // Return result + return $isInitialized; + } + + /** + * Checks whether the file-based stack has been initialized + * + * @return $isInitialized Whether the file's size is zero + */ + private function isFileInitialized () { + // Default is not initialized + $isInitialized = FALSE; + + // Get it from iterator which holds the pointer instance. If FALSE is returned + $fileSize = $this->getIteratorInstance()->size(); + + /* + * The returned file size should not be FALSE or NULL as this means + * that the pointer class does not work correctly. + */ + assert(is_int($fileSize)); + + // Is more than 0 returned? + if ($fileSize > 0) { + // So is the header written? + $isInitialized = $this->getIteratorInstance()->isHeaderInitialized(); + } // END - if + + // Return result + return $isInitialized; + } + /** * Initializes this file-based stack. * @@ -71,6 +121,15 @@ class BaseFileStack extends BaseStacker { // Set iterator here $this->setIteratorInstance($iteratorInstance); + + // Is the file's header initialized? + if ($this->isFileHeaderInitialized()) { + // Then load it + $this->loadFileHeader(); + } else { + // No, then create it (which may pre-allocate the stack) + $this->createFileHeader(); + } } /** diff --git a/inc/classes/main/stacker/file/fifo/.htaccess b/inc/classes/main/stacker/file/fifo/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/stacker/file/fifo/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/stacker/file_stack/fifo/class_FiFoFileStack.php b/inc/classes/main/stacker/file/fifo/class_FiFoFileStack.php similarity index 86% rename from inc/classes/main/stacker/file_stack/fifo/class_FiFoFileStack.php rename to inc/classes/main/stacker/file/fifo/class_FiFoFileStack.php index 201bb84e..e7774a0f 100644 --- a/inc/classes/main/stacker/file_stack/fifo/class_FiFoFileStack.php +++ b/inc/classes/main/stacker/file/fifo/class_FiFoFileStack.php @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class FiFoFileStack extends BaseFileStack implements Stackable { +class FiFoFileStack extends BaseFileStack implements StackableFile { /** * Protected constructor * @@ -84,6 +84,25 @@ class FiFoFileStack extends BaseFileStack implements Stackable { public function getNamed ($stackerName) { $this->partialStub('stackerName=' . $stackerName); } + + /** + * Seeks to given position + * + * @param $seekPosition Seek position in file + * @return void + */ + public function seek ($seekPosition) { + $this->partialStub('seekPosition=' . $seekPosition); + } + + /** + * Size of file stack + * + * @return $size Size (in bytes) of file + */ + public function size () { + $this->partialStub(); + } } // [EOF] -- 2.39.5