*/
private $genericArray = array();
+ /**
+ * Length of output from hash()
+ */
+ private static $hashLength = NULL;
+
/***********************
* Exception codes.... *
***********************/
}
/**
- * Hashes a given string with a simple but stronger hash function (no salts)
+ * Hashes a given string with a simple but stronger hash function (no salt)
+ * and hex-encode it.
*
* @param $str The string to be hashed
* @return $hash The hash from string $str
*/
- public function hashString ($str) {
+ public static final function hash ($str) {
// Hash given string with (better secure) hasher
- $hash = mhash(MHASH_SHA256, $str);
+ $hash = bin2hex(mhash(MHASH_SHA256, $str));
// Return it
return $hash;
}
+ /**
+ * "Getter" for length of hash() output. This will be "cached" to speed up
+ * things.
+ *
+ * @return $length Length of hash() output
+ */
+ public static final function getHashLength () {
+ // Is it cashed?
+ if (is_null(self::$hashLength)) {
+ // No, then hash a string and save its length.
+ self::$hashLength = strlen(self::hash('abc123'));
+ } // END - if
+
+ // Return it
+ return self::$hashLength;
+ }
+
/**
* Checks whether the given number is really a number (only chars 0-9).
*
*/
const SEPARATOR_HASH_NAME = 0x05;
+ /**
+ * Length of name
+ */
+ const COUNT_NAME = 10;
+
/**
* Length of count
*/
* @return void
*/
private function updateSeekPosition () {
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
// Get key (= seek position)
$seekPosition = $this->getIteratorInstance()->key();
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Setting seekPosition=%s', __METHOD__, __LINE__, $seekPosition));
// And set it here
$this->setSeekPosition($seekPosition);
+
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
}
/**
$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();
} // END - if
* @return $isInitialized Whether the file's size is zero
*/
private 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));
* @return void
*/
private 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());
// Flush file header
$this->flushFileHeader();
+
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
}
/**
* @return void
*/
private function flushFileHeader () {
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
// Put all informations together
$header = sprintf('%s%s%s%s%s',
// Magic
// Update seek position
$this->updateSeekPosition();
+
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+ }
+
+ /**
+ * Pre-allocates file (if enabled) with some space for later faster write access.
+ *
+ * @return void
+ */
+ private function preAllocateFile () {
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+ // Is it enabled?
+ if ($this->getConfigInstance()->getConfigEntry('file_stack_pre_allocate_enabled') != 'Y') {
+ // Not enabled
+ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Not pre-allocating stack file.', __METHOD__, __LINE__));
+
+ // Don't continue here.
+ return;
+ } // END - if
+
+ // Message to user
+ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Pre-allocating stack 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::COUNT_NAME + 1;
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry));
+
+ // Calulcate seek position
+ $seekPosition = $minLengthEntry * $this->getConfigInstanstance()->getConfigEntry('file_stack_pre_allocate_count');
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s', __METHOD__, __LINE__, $seekPosition));
+
+ // Now seek to the position
+ $this->getIteratorInstance()->seek($seekPosition);
+
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
}
/**