* 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
*/
$this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
$name,
gettype($value),
- $value
+ print_r($value, TRUE)
));
}
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;
}
$this->headerSize = $headerSize;
}
+ /**
+ * Getter for header array
+ *
+ * @return $totalEntries Size of file header
+ */
+ protected final function getHeade () {
+ // Get it
+ return $this->header;
+ }
+
+ /**
+ * Setter for header
+ *
+ * @param $header Array for a file header
+ * @return void
+ */
+ protected final function setHeader (array $header) {
+ // Set it
+ $this->header = $header;
+ }
+
/**
* Getter for seek position
*
}
/**
- * Checks whether the file header is initialized
- *
- * @return $isInitialized Whether the file header is initialized
- */
- protected function isFileHeaderInitialized () {
- //* 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;
- }
-
- /**
- * Checks whether the assigned file has been initialized
+ * Seeks to beginning of file, updates seek position in this object and
+ * flushes the header.
*
- * @return $isInitialized Whether the file's size is zero
+ * @return void
*/
- protected function isFileInitialized () {
+ protected function rewineUpdateSeekPosition () {
//* 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));
+ // flushFileHeader must be callable
+ assert(is_callable(array($this, 'flushFileHeader')));
- /*
- * 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?
- $isInitialized = ($fileSize > 0);
-
- // Return result
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized)));
- return $isInitialized;
- }
+ // Seek to beginning of file
+ $this->getIteratorInstance()->rewind();
- /**
- * Creates the assigned file
- *
- * @return void
- */
- protected function createFileHeader () {
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
- // The file's header should not be initialized here
- assert(!$this->isFileHeaderInitialized());
+ // And update seek position ...
+ $this->updateSeekPosition();
- // Simple flush file header which will create it.
+ // ... to write it back into the file
$this->flushFileHeader();
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
}
/**
- * Flushes the file header
+ * Seeks to old position
*
* @return void
*/
- protected function flushFileHeader () {
+ protected function seekToOldPosition () {
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
- // Put all informations together
- $header = sprintf('%s%s%s%s%s%s',
- // Magic
- self::STACK_MAGIC,
-
- // Separator magic<->count
- chr(self::SEPARATOR_HEADER_DATA),
-
- // Total entries (will be zero) and pad it to 20 chars
- str_pad($this->dec2hex($this->getCounter()), self::LENGTH_COUNT, '0', STR_PAD_LEFT),
-
- // Separator count<->seek position
- chr(self::SEPARATOR_HEADER_DATA),
-
- // Position (will be zero)
- str_pad($this->dec2hex($this->getSeekPosition(), 2), self::LENGTH_POSITION, '0', STR_PAD_LEFT),
-
- // Separator position<->entries
- chr(self::SEPARATOR_HEADER_ENTRIES)
- );
+ // Seek to currently ("old") saved position
+ $this->getIteratorInstance()->seek($this->getSeekPosition());
- // Write it to disk (header is always at seek position 0)
- $this->writeData(0, $header);
-
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+ //* 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);
}
}