%PDF- %PDF-
Direktori : /home/lightco1/www/lightingrepublic.com.au/libraries/koowa/database/behavior/ |
Current File : /home/lightco1/www/lightingrepublic.com.au/libraries/koowa/database/behavior/identifiable.php |
<?php /** * @version $Id$ * @package Koowa_Database * @subpackage Behavior * @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved. * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> */ /** * Database Identifiable Behavior * * @author Johan Janssens <johan@nooku.org> * @package Koowa_Database * @subpackage Behavior */ class KDatabaseBehaviorIdentifiable extends KDatabaseBehaviorAbstract { /** * Get the methods that are available for mixin based * * This function conditionaly mixes of the behavior. Only if the mixer * has a 'uuid' property the behavior will be mixed in. * * @param object The mixer requesting the mixable methods. * @return array An array of methods */ public function getMixableMethods(KObject $mixer = null) { $methods = array(); if(isset($mixer->uuid)) { $methods = parent::getMixableMethods($mixer); } return $methods; } /** * Set uuid information * * Requires an 'uuid' column, if the column type is char the uuid will be * a string, if the column type is binary a hex value will be returned. * * @return void */ protected function _beforeTableInsert(KCommandContext $context) { if(isset($this->uuid)) { $hex = $this->getTable()->getColumn('uuid')->type == 'char' ? false : true; $this->uuid = $this->_uuid($hex); } } /** * Generates a Universally Unique IDentifier, version 4. * * This function generates a truly random UUID. * * @param boolean If TRUE return the uuid in hex format, otherwise as a string * @see http://tools.ietf.org/html/rfc4122#section-4.4 * @see http://en.wikipedia.org/wiki/UUID * @return string A UUID, made up of 36 characters or 16 hex digits. */ protected function _uuid($hex = false) { $pr_bits = false; $fp = @fopen ( '/dev/urandom', 'rb' ); if ($fp !== false) { $pr_bits = @fread ( $fp, 16 ); @fclose ( $fp ); } // If /dev/urandom isn't available (eg: in non-unix systems), use mt_rand(). if(empty($pr_bits)) { $pr_bits = ""; for($cnt = 0; $cnt < 16; $cnt ++) { $pr_bits .= chr ( mt_rand ( 0, 255 ) ); } } $time_low = bin2hex ( substr ( $pr_bits, 0, 4 ) ); $time_mid = bin2hex ( substr ( $pr_bits, 4, 2 ) ); $time_hi_and_version = bin2hex ( substr ( $pr_bits, 6, 2 ) ); $clock_seq_hi_and_reserved = bin2hex ( substr ( $pr_bits, 8, 2 ) ); $node = bin2hex ( substr ( $pr_bits, 10, 6 ) ); /** * Set the four most significant bits (bits 12 through 15) of the * time_hi_and_version field to the 4-bit version number from * Section 4.1.3. * @see http://tools.ietf.org/html/rfc4122#section-4.1.3 */ $time_hi_and_version = hexdec ( $time_hi_and_version ); $time_hi_and_version = $time_hi_and_version >> 4; $time_hi_and_version = $time_hi_and_version | 0x4000; /** * Set the two most significant bits (bits 6 and 7) of the * clock_seq_hi_and_reserved to zero and one, respectively. */ $clock_seq_hi_and_reserved = hexdec ( $clock_seq_hi_and_reserved ); $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved >> 2; $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved | 0x8000; //Either return as hex or as string $format = $hex ? '%08s%04s%04x%04x%012s' : '%08s-%04s-%04x-%04x-%012s'; return sprintf ( $format, $time_low, $time_mid, $time_hi_and_version, $clock_seq_hi_and_reserved, $node ); } }