X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=7824280733a44f057ac5c0d746ffd3a06e503da1;hp=d092ccbf78e1c0842a00d6c0028a220c6d0d320f;hb=5be04aa21c5338880208dd02b87122e8291aecec;hpb=af9b5445ff3944c0be0be1dcc66e9fa1e640e01c diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index d092ccbf..78242807 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -26,117 +26,137 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Instance of a request class */ - private $requestInstance = null; + private $requestInstance = NULL; /** * Instance of a response class */ - private $responseInstance = null; + private $responseInstance = NULL; /** * Search criteria instance */ - private $searchInstance = null; + private $searchInstance = NULL; /** * Update criteria instance */ - private $updateInstance = null; + private $updateInstance = NULL; /** * The file I/O instance for the template loader */ - private $fileIoInstance = null; + private $fileIoInstance = NULL; /** * Resolver instance */ - private $resolverInstance = null; + private $resolverInstance = NULL; /** * Template engine instance */ - private $templateInstance = null; + private $templateInstance = NULL; /** * Database result instance */ - private $resultInstance = null; + private $resultInstance = NULL; /** * Instance for user class */ - private $userInstance = null; + private $userInstance = NULL; /** * A controller instance */ - private $controllerInstance = null; + private $controllerInstance = NULL; /** * Instance of a RNG */ - private $rngInstance = null; + private $rngInstance = NULL; /** * Instance of a crypto helper */ - private $cryptoInstance = null; + private $cryptoInstance = NULL; /** * Instance of an Iterator class */ - private $iteratorInstance = null; + private $iteratorInstance = NULL; /** * Instance of the list */ - private $listInstance = null; + private $listInstance = NULL; /** * Instance of a menu */ - private $menuInstance = null; + private $menuInstance = NULL; /** * Instance of the image */ - private $imageInstance = null; + private $imageInstance = NULL; /** * Instance of the stacker */ - private $stackerInstance = null; + private $stackerInstance = NULL; /** * A Compressor instance */ - private $compressorInstance = null; + private $compressorInstance = NULL; /** * A Parseable instance */ - private $parserInstance = null; + private $parserInstance = NULL; /** * A ProtocolHandler instance */ - private $protocolInstance = null; + private $protocolInstance = NULL; /** * A database wrapper instance */ - private $databaseInstance = null; + private $databaseInstance = NULL; /** * A helper instance for the form */ - private $helperInstance = null; + private $helperInstance = NULL; /** - * An instance of a source + * An instance of a Sourceable class */ - private $sourceInstance = null; + private $sourceInstance = NULL; + + /** + * An instance of a InputStreamable class + */ + private $inputStreamInstance = NULL; + + /** + * An instance of a OutputStreamable class + */ + private $outputStreamInstance = NULL; + + /** + * Networkable handler instance + */ + private $handlerInstance = NULL; + + /** + * Visitor handler instance + */ + private $visitorInstance = NULL; /** * The real class name @@ -144,12 +164,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { private $realClass = 'BaseFrameworkSystem'; /** - * Thousands seperator + * An instance of a database wrapper class + */ + private $wrapperInstance = NULL; + + /** + * Thousands separator */ private $thousands = '.'; // German /** - * Decimal seperator + * Decimal separator */ private $decimals = ','; // German @@ -166,6 +191,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /*********************** * Exception codes.... * ***********************/ + // @todo Try to clean these constants up const EXCEPTION_IS_NULL_POINTER = 0x001; const EXCEPTION_IS_NO_OBJECT = 0x002; @@ -225,6 +251,55 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039; const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040; + /** + * Hexadecimal->Decimal translation array + */ + private static $hexdec = array( + '0' => 0, + '1' => 1, + '2' => 2, + '3' => 3, + '4' => 4, + '5' => 5, + '6' => 6, + '7' => 7, + '8' => 8, + '9' => 9, + 'a' => 10, + 'b' => 11, + 'c' => 12, + 'd' => 13, + 'e' => 14, + 'f' => 15 + ); + + /** + * Decimal->hexadecimal translation array + */ + private static $dechex = array( + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + 4 => '4', + 5 => '5', + 6 => '6', + 7 => '7', + 8 => '8', + 9 => '9', + 10 => 'a', + 11 => 'b', + 12 => 'c', + 13 => 'd', + 14 => 'e', + 15 => 'f' + ); + + /** + * Startup time in miliseconds + */ + private static $startupTime = 0; + /** * Protected super constructor * @@ -238,12 +313,18 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Set configuration instance if no registry ... if (!$this instanceof Register) { // ... because registries doesn't need to be configured - $this->setConfigInstance(FrameworkConfiguration::getInstance()); + $this->setConfigInstance(FrameworkConfiguration::getSelfInstance()); + } // END - if + + // Is the startup time set? (0 cannot be true anymore) + if (self::$startupTime == 0) { + // Then set it + self::$startupTime = microtime(true); } // END - if } /** - * Destructor reached... + * Destructor for all classes * * @return void */ @@ -280,13 +361,29 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } elseif (is_array($args)) { // Some arguments are there foreach ($args as $arg) { - // Add the type - $argsString .= $this->replaceControlCharacters($arg) . ' (' . gettype($arg); + // Add the value itself if not array. This prevents 'array to string conversion' message + if (is_array($arg)) { + $argsString .= 'Array'; + } else { + $argsString .= $arg; + } + + // Add data about the argument + $argsString .= ' (' . gettype($arg); - // Add length if type is string if (is_string($arg)) { + // Add length for strings $argsString .= ', '.strlen($arg); - } // END - if + } elseif (is_array($arg)) { + // .. or size if array + $argsString .= ', '.count($arg); + } elseif ($arg === true) { + // ... is boolean 'true' + $argsString .= ', true'; + } elseif ($arg === false) { + // ... is boolean 'true' + $argsString .= ', false'; + } // Closing bracket $argsString .= '), '; @@ -309,7 +406,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { )); // Return nothing - return null; + return NULL; } /** @@ -523,24 +620,24 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for database instance * - * @param $dbInstance The instance for the database connection (forced DatabaseConnection) + * @param $databaseInstance The instance for the database connection (forced DatabaseConnection) * @return void */ - public final function setDatabaseInstance (DatabaseConnection $dbInstance) { - Registry::getRegistry()->addInstance('db_instance', $dbInstance); + public final function setDatabaseInstance (DatabaseConnection $databaseInstance) { + Registry::getRegistry()->addInstance('db_instance', $databaseInstance); } /** * Getter for database layer * - * @return $dbInstance The database layer instance + * @return $databaseInstance The database layer instance */ public final function getDatabaseInstance () { // Get instance - $dbInstance = Registry::getRegistry()->getInstance('db_instance'); + $databaseInstance = Registry::getRegistry()->getInstance('db_instance'); // Return instance - return $dbInstance; + return $databaseInstance; } /** @@ -624,7 +721,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for the real class name * - * @param $realClass Class name (string) + * @param $realClass Class name (string) * @return void */ public final function setRealClass ($realClass) { @@ -636,11 +733,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Checks wether an object equals this object. You should overwrite this + * Checks whether an object equals this object. You should overwrite this * method to implement own equality checks * * @param $objectInstance An instance of a FrameworkInterface object - * @return $equals Wether both objects equals + * @return $equals Whether both objects equals */ public function equals (FrameworkInterface $objectInstance) { // Now test it @@ -667,21 +764,21 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Formats computer generated price values into human-understandable formats - * with thousand and decimal seperators. + * with thousand and decimal separators. * * @param $value The in computer format value for a price * @param $currency The currency symbol (use HTML-valid characters!) * @param $decNum Number of decimals after commata * @return $price The for the current language formated price string - * @throws MissingDecimalsThousandsSeperatorException If decimals or - * thousands seperator + * @throws MissingDecimalsThousandsSeparatorException If decimals or + * thousands separator * is missing */ public function formatCurrency ($value, $currency = '€', $decNum = 2) { // Are all required attriutes set? if ((!isset($this->decimals)) || (!isset($this->thousands))) { // Throw an exception - throw new MissingDecimalsThousandsSeperatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); + throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); } // END - if // Cast the number @@ -718,8 +815,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Appends a trailing slash to a string * - * @param $str A string (maybe) without trailing slash - * @return $str A string with an auto-appended trailing slash + * @param $str A string (maybe) without trailing slash + * @return $str A string with an auto-appended trailing slash */ public final function addMissingTrailingSlash ($str) { // Is there a trailing slash? @@ -734,7 +831,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Private getter for file IO instance * - * @return $fileIoInstance An instance to the file I/O sub-system + * @return $fileIoInstance An instance to the file I/O sub-system */ protected final function getFileIoInstance () { return $this->fileIoInstance; @@ -743,7 +840,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for file I/O instance * - * @param $fileIoInstance An instance to the file I/O sub-system + * @param $fileIoInstance An instance to the file I/O sub-system * @return void */ public final function setFileIoInstance (FileIoHandler $fileIoInstance) { @@ -760,7 +857,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @throws NullPointerException If the discovered application * instance is still null */ - protected function prepareTemplateInstance (ManageableApplication $applicationInstance = null) { + protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) { // Is the application instance set? if (is_null($applicationInstance)) { // Get the current instance @@ -812,7 +909,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { ApplicationEntryPoint::app_die(sprintf("
%s debug output:
%s
\nLoaded includes:
%s
", $this->__toString(), $content, - ClassLoader::getInstance()->getPrintableIncludeList() + ClassLoader::getSelfInstance()->getPrintableIncludeList() )); } @@ -825,9 +922,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { protected function replaceControlCharacters ($str) { // Replace them $str = str_replace( - "\r", '[r]', str_replace( - "\n", '[n]', str_replace( - "\t", '[t]', + chr(13), '[r]', str_replace( + chr(10), '[n]', str_replace( + chr(9) , '[t]', $str ))); @@ -859,7 +956,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Is the extra message given? if (!empty($message)) { // Then add it as well - $stubMessage .= sprintf(" Message: %s", $message); + $stubMessage .= sprintf(' Message: %s', $message); } // END - if // Debug instance is there? @@ -868,7 +965,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->debugOutput($stubMessage); } else { // Trigger an error - trigger_error($stubMessage . "
\n"); + trigger_error($stubMessage . '
' + chr(10)); } } @@ -876,26 +973,31 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * Outputs a debug backtrace and stops further script execution * * @param $message An optional message to output + * @param $doExit Whether exit the program (true is default) * @return void */ - public function debugBackTrace ($message = '') { + public function debugBackTrace ($message = '', $doExit = true) { // Sorry, there is no other way getting this nice backtrace if (!empty($message)) { // Output message printf("Message: %s
\n", $message); } // END - if - print("
\n");
+		print('
');
 		debug_print_backtrace();
-		print("
"); - exit(); + print('
'); + + // Exit program? + if ($doExit === true) { + exit(); + } // END - if } /** - * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message + * Outputs a debug message whether to debug instance (should be set!) or dies with or pints the message * * @param $message Message we shall send out... - * @param $doPrint Wether we shall print or die here which first is the default + * @param $doPrint Whether we shall print or die here which first is the default * @return void */ public function debugOutput ($message, $doPrint = true) { @@ -914,7 +1016,14 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } else { // Put directly out if ($doPrint === true) { - print($message); + // Are debug times enabled? + if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') { + // Output it first + print($this->getPrintableExecutionTime()); + } // END - if + + // Print message + print($message . chr(10)); } else { // DO NOT REWRITE THIS TO app_die() !!! die($message); @@ -975,7 +1084,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Init the code with error message if (is_array($errorArray)) { // Get error infos - $markedCode = sprintf("
File: %s, Line: %s, Message: %s, Type: %s
", + $markedCode = sprintf('
File: %s, Line: %s, Message: %s, Type: %s
', basename($errorArray['file']), $errorArray['line'], $errorArray['message'], @@ -984,9 +1093,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // END - if // Add line number to the code - foreach (explode("\n", $phpCode) as $lineNo => $code) { + foreach (explode(chr(10), $phpCode) as $lineNo => $code) { // Add line numbers - $markedCode .= sprintf("%s: %s\n", + $markedCode .= sprintf('%s: %s' + chr(10), ($lineNo + 1), htmlentities($code, ENT_QUOTES) ); @@ -1104,7 +1213,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ public final function getField ($fieldName) { // Default field value - $fieldValue = null; + $fieldValue = NULL; // Get result instance $resultInstance = $this->getResultInstance(); @@ -1214,10 +1323,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Checks wether the given PHP extension is loaded + * Checks whether the given PHP extension is loaded * * @param $phpExtension The PHP extension we shall check - * @return $isLoaded Wether the PHP extension is loaded + * @return $isLoaded Whether the PHP extension is loaded */ public final function isPhpExtensionLoaded ($phpExtension) { // Is it loaded? @@ -1301,7 +1410,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Idles (sleeps) for given milliseconds * - * @return $hasSlept Wether it goes fine + * @return $hasSlept Whether it goes fine */ public function idle ($milliSeconds) { // Sleep is fine by default @@ -1312,11 +1421,13 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Get current time and add idle time $sleepUntil = $this->getMilliTime() + abs($milliSeconds) / 1000; - // New PHP 5.1.0 function found - $hasSlept = time_sleep_until($sleepUntil); + // New PHP 5.1.0 function found, ignore errors + $hasSlept = @time_sleep_until($sleepUntil); } else { - // My Sun Station doesn't have that function even with latest PHP - // package. :( + /* + * My Sun station doesn't have that function even with latest PHP + * package. :( + */ usleep($milliSeconds * 1000); } @@ -1444,7 +1555,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @param $protocolInstance An instance of an ProtocolHandler * @return void */ - public final function setProtocolInstance (ProtocolHandler $protocolInstance) { + public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) { $this->protocolInstance = $protocolInstance; } @@ -1527,12 +1638,88 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Getter for a Sourceable instance * - * @param $sourceInstance The Sourceable instance + * @return $sourceInstance The Sourceable instance */ protected final function getSourceInstance () { return $this->sourceInstance; } + /** + * Getter for a InputStreamable instance + * + * @param $inputStreamInstance The InputStreamable instance + */ + protected final function getInputStreamInstance () { + return $this->inputStreamInstance; + } + + /** + * Setter for a InputStreamable instance + * + * @param $inputStreamInstance The InputStreamable instance + * @return void + */ + protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) { + $this->inputStreamInstance = $inputStreamInstance; + } + + /** + * Getter for a OutputStreamable instance + * + * @param $outputStreamInstance The OutputStreamable instance + */ + protected final function getOutputStreamInstance () { + return $this->outputStreamInstance; + } + + /** + * Setter for a OutputStreamable instance + * + * @param $outputStreamInstance The OutputStreamable instance + * @return void + */ + protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) { + $this->outputStreamInstance = $outputStreamInstance; + } + + /** + * Setter for handler instance + * + * @param $handlerInstance An instance of a Handleable class + * @return void + */ + protected final function setHandlerInstance (Handleable $handlerInstance) { + $this->handlerInstance = $handlerInstance; + } + + /** + * Getter for handler instance + * + * @return $handlerInstance A Networkable instance + */ + protected final function getHandlerInstance () { + return $this->handlerInstance; + } + + /** + * Setter for visitor instance + * + * @param $visitorInstance A Visitor instance + * @return void + */ + protected final function setVisitorInstance (Visitor $visitorInstance) { + $this->visitorInstance = $visitorInstance; + } + + /** + * Getter for visitor instance + * + * @return $visitorInstance A Visitor instance + */ + protected final function getVisitorInstance () { + return $this->visitorInstance; + } + /** * Setter for raw package Data * @@ -1551,6 +1738,296 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { public function getPackageData () { return $this->packageData; } + + /** + * Converts a hexadecimal string, even with negative sign as first string to + * a decimal number using BC functions. + * + * This work is based on comment #86673 on php.net documentation page at: + * + * + * @param $hex Hexadecimal string + * @return $dec Decimal number + */ + protected function hex2dec ($hex) { + // Convert to all lower-case + $hex = strtolower($hex); + + // Detect sign (negative/positive numbers) + $sign = ''; + if (substr($hex, 0, 1) == '-') { + $sign = '-'; + $hex = substr($hex, 1); + } // END - if + + // Decode the hexadecimal string into a decimal number + $dec = 0; + for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) { + $factor = self::$hexdec[substr($hex, $i, 1)]; + $dec = bcadd($dec, bcmul($factor, $e)); + } // END - for + + // Return the decimal number + return $sign . $dec; + } + + /** + * Converts even very large decimal numbers, also with negative sign, to a + * hexadecimal string. + * + * This work is based on comment #97756 on php.net documentation page at: + * + * + * @param $dec Decimal number, even with negative sign + * @param $maxLength Optional maximum length of the string + * @return $hex Hexadecimal string + */ + protected function dec2hex ($dec, $maxLength = 0) { + // maxLength can be zero or devideable by 2 + assert(($maxLength == 0) || (($maxLength % 2) == 0)); + + // Detect sign (negative/positive numbers) + $sign = ''; + if ($dec < 0) { + $sign = '-'; + $dec = abs($dec); + } // END - if + + // Encode the decimal number into a hexadecimal string + $hex = ''; + do { + $hex = self::$dechex[($dec % 16)] . $hex; + $dec /= 16; + } while ($dec >= 1); + + /* + * We need hexadecimal strings with leading zeros if the length cannot + * be divided by 2 + */ + if ($maxLength > 0) { + // Prepend more zeros + $hex = $this->prependStringToString($hex, '0', $maxLength); + } elseif ((strlen($hex) % 2) != 0) { + $hex = '0' . $hex; + } + + // Return the hexadecimal string + return $sign . $hex; + } + + /** + * Converts a ASCII string (0 to 255) into a decimal number. + * + * @param $asc The ASCII string to be converted + * @return $dec Decimal number + */ + protected function asc2dec ($asc) { + // Convert it into a hexadecimal number + $hex = bin2hex($asc); + + // And back into a decimal number + $dec = $this->hex2dec($hex); + + // Return it + return $dec; + } + + /** + * Converts a decimal number into an ASCII string. + * + * @param $dec Decimal number + * @return $asc An ASCII string + */ + protected function dec2asc ($dec) { + // First convert the number into a hexadecimal string + $hex = $this->dec2hex($dec); + + // Then convert it into the ASCII string + $asc = $this->hex2asc($hex); + + // Return it + return $asc; + } + + /** + * Converts a hexadecimal number into an ASCII string. Negative numbers + * are not allowed. + * + * @param $hex Hexadecimal string + * @return $asc An ASCII string + */ + protected function hex2asc ($hex) { + // Check for length, it must be devideable by 2 + //* DEBUG: */ $this->debugOutput('hex='.$hex); + assert((strlen($hex) % 2) == 0); + + // Walk the string + $asc = ''; + for ($idx = 0; $idx < strlen($hex); $idx+=2) { + // Get the decimal number of the chunk + $part = hexdec(substr($hex, $idx, 2)); + + // Add it to the final string + $asc .= chr($part); + } // END - for + + // Return the final string + return $asc; + } + + /** + * Prepends a given string $prepend to $str with a given total length + * + * @param $str Given original string which should be prepended + * @param $prepend The string to prepend + * @param $length Total length of the final string + * @return $strFinal Final prepended string + */ + protected function prependStringToString ($str, $prepend, $length) { + // Set final string to original string by default + $strFinal = $str; + + // Can it devided + if (strlen($str) < $length) { + // Difference between total length and length of original string + $diff = $length - strlen($str); + + // Prepend the string + $prepend = str_repeat($prepend, ($diff / strlen($prepend) + 1)); + + // Make sure it will definedly fit + assert(strlen($prepend) >= $diff); + + // Cut it a little down + $prepend = substr($prepend, 0, $diff); + //* DEBUG: */ $this->debugOutput('prepend('.strlen($prepend).')='.$prepend.',diff='.$diff.',length='.$length); + + // Construct the final prepended string + $strFinal = $prepend . $str; + } // END - if + + // Return it + return $strFinal; + } + + /** + * Checks whether the given encoded data was encoded with Base64 + * + * @param $encodedData Encoded data we shall check + * @return $isBase64 Whether the encoded data is Base64 + */ + protected function isBase64Encoded ($encodedData) { + // Determine it + $isBase64 = (@base64_decode($encodedData, true) !== false); + + // Return it + return $isBase64; + } + + /** + * "Getter" to get response/request type from analysis of the system. + * + * @return $responseType Analyzed response type + */ + protected function getResponseTypeFromSystem () { + // Default is console + $responseType = 'console'; + + // Is 'HTTP_HOST' set? + if (isset($_SERVER['HTTP_HOST'])) { + // Then it is a HTTP response/request + $responseType = 'http'; + } // END - if + + // Return it + return $responseType; + } + + /** + * Gets a cache key from Criteria instance + * + * @param $criteriaInstance An instance of a Criteria class + * @param $onlyKeys Only use these keys for a cache key + * @return $cacheKey A cache key suitable for lookup/storage purposes + */ + protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) { + // Generate it + $cacheKey = sprintf("%s@%s", + $this->__toString(), + $criteriaInstance->getCacheKey($onlyKeys) + ); + + // And return it + //* NOISY-DEBUG: */ $this->debugOutput($this->__toString() . ': cacheKey=' . $cacheKey); + return $cacheKey; + } + + /** + * Getter for startup time in miliseconds + * + * @return $startupTime Startup time in miliseconds + */ + protected function getStartupTime () { + return self::$startupTime; + } + + /** + * "Getter" for a printable currently execution time in nice braces + * + * @return $executionTime Current execution time in nice braces + */ + protected function getPrintableExecutionTime () { + // Caculate the execution time + $executionTime = microtime(true) - $this->getStartupTime(); + + // Pack it in nice braces + $executionTime = sprintf('[ %01.5f ] ', $executionTime); + + // And return it + return $executionTime; + } + + /** + * Hashes a given string with a simple but stronger hash function (no salts) + * + * @param $str The string to be hashed + * @return $hash The hash from string $str + */ + public function hashString ($str) { + // Hash given string with (better secure) hasher + $hash = mhash(MHASH_SHA256, $str); + + // Return it + return $hash; + } + + /** + * Checks whether the given number is really a number (only chars 0-9). + * + * @param $num A string consisting only chars between 0 and 9 + * @param $castValue Whether to cast the value to double. Do only use this to secure numbers from Requestable classes. + * @param $assertMismatch Whether to assert mismatches + * @return $ret The (hopefully) secured numbered value + */ + public function bigintval ($num, $castValue = true, $assertMismatch = false) { + // Filter all numbers out + $ret = preg_replace('/[^0123456789]/', '', $num); + + // Shall we cast? + if ($castValue === true) { + // Cast to biggest numeric type + $ret = (double) $ret; + } // END - if + + // Assert only if requested + if ($assertMismatch === true) { + // Has the whole value changed? + assert(('' . $ret . '' != '' . $num . '') && (!is_null($num))); + } // END - if + + // Return result + return $ret; + } } // [EOF]