* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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
*/
*/
const LENGTH_POSITION = 20;
+ /**
+ * Length of name
+ */
+ const LENGTH_NAME = 10;
+
/**
* The real class name
*/
private $pointerInstance = NULL;
/**
- * An instance of an index
+ * An instance of an Indexable class
*/
private $indexInstance = NULL;
+ /**
+ * An instance of a Block class
+ */
+ private $blockInstance = NULL;
+
/**
* Thousands separator
*/
return $this->indexInstance;
}
+ /**
+ * Setter for Block instance
+ *
+ * @param $blockInstance An instance of an Block class
+ * @return void
+ */
+ protected final function setBlockInstance (Block $blockInstance) {
+ $this->blockInstance = $blockInstance;
+ }
+
+ /**
+ * Getter for Block instance
+ *
+ * @return $blockInstance An instance of an Block 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
*
* @return $totalEntries Size of file header
*/
- protected final function getHeaderSize () {
+ public final function getHeaderSize () {
// Get it
return $this->headerSize;
}
}
/**
- * Checks whether the file header is initialized
+ * Seeks to beginning of file, updates seek position in this object and
+ * flushes the header.
*
- * @return $isInitialized Whether the file header is initialized
+ * @return void
*/
- protected function isFileHeaderInitialized () {
- // Is the method there?
- assert(is_callable(array($this, 'readFileHeader')));
-
+ protected function rewineUpdateSeekPosition () {
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
- // Default is not initialized
- $isInitialized = FALSE;
-
- // Is the file initialized?
- 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));
-
- // Is the rewind() call successfull?
- if ($rewindStatus != 1) {
- // Something bad happened
- self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Could not rewind().', __METHOD__, __LINE__));
- } // END - if
-
- // Read file header
- $this->readFileHeader();
-
- // The above method does already check the header
- $isInitialized = TRUE;
- } // END - if
- // Return result
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized)));
- return $isInitialized;
- }
+ // flushFileHeader must be callable
+ assert(is_callable(array($this, 'flushFileHeader')));
- /**
- * Checks whether the assigned file has been initialized
- *
- * @return $isInitialized Whether the file's size is zero
- */
- protected function isFileInitialized () {
- //* 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));
+ // Seek to beginning of file
+ $this->getIteratorInstance()->rewind();
- /*
- * 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));
+ // And update seek position ...
+ $this->updateSeekPosition();
- // Is more than 0 returned?
- $isInitialized = ($fileSize > 0);
+ // ... to write it back into the file
+ $this->flushFileHeader();
- // Return result
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized)));
- return $isInitialized;
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
}
/**
- * Creates the assigned file
+ * Seeks to old position
*
* @return void
*/
- protected function createFileHeader () {
+ protected function seekToOldPosition () {
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
- // The file's header should not be initialized here
- assert(!$this->isFileHeaderInitialized());
- // Simple flush file header which will create it.
- $this->flushFileHeader();
+ // Seek to currently ("old") saved position
+ $this->getIteratorInstance()->seek($this->getSeekPosition());
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
}
/**
- * Writes data at given position
+ * Checks whether the block separator has been found
*
- * @param $seekPosition Seek position
- * @param $data Data to be written
- * @return void
+ * @param $str String to look in
+ * @return $isFound Whether the block separator has been found
*/
- protected function writeData ($seekPosition, $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);
-
- // Update seek position
- $this->updateSeekPosition();
-
- // Flush header
- $this->flushHeader();
+ public function isBlockSeparatorFound ($str) {
+ // Determine it
+ $isFound = (strpos($str, self::getBlockSeparator()) !== FALSE);
- // Seek to old position
- $this->seekToOldPosition();
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+ // Return result
+ return $isFound;
}
/**
- * Pre-allocates file (if enabled) with some space for later faster write access.
+ * Getter for block separator character(s)
*
- * @param $type Type of the file
- * @return void
+ * @return $blockSeparator A separator for blocks
*/
- protected function preAllocateFile ($type) {
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
-
- // Is it enabled?
- if ($this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_enabled') != 'Y') {
- // Not enabled
- self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Not pre-allocating file.', __METHOD__, __LINE__));
-
- // Don't continue here.
- return;
- } // END - if
-
- // 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;
- //* 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));
-
- // 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__));
+ protected static final function getBlockSeparator () {
+ return chr(self::SEPARATOR_ENTRIES);
}
}