MDL-61038 setuplib: Fixed PECL UUID extension support

This commit is contained in:
Matteo Scaramuccia
2019-06-08 23:13:40 +02:00
parent 4f64c3f57c
commit b7d9f9e827
2 changed files with 34 additions and 8 deletions
+8 -8
View File
@@ -610,25 +610,25 @@ function get_exception_info($ex) {
}
/**
* Generate a uuid.
* Generate a V4 UUID.
*
* Unique is hard. Very hard. Attempt to use the PECL UUID functions if available, and if not then revert to
* Unique is hard. Very hard. Attempt to use the PECL UUID function if available, and if not then revert to
* constructing the uuid using mt_rand.
*
* It is important that this token is not solely based on time as this could lead
* to duplicates in a clustered environment (especially on VMs due to poor time precision).
*
* @see https://tools.ietf.org/html/rfc4122
*
* @return string The uuid.
*/
function generate_uuid() {
$uuid = '';
if (function_exists("uuid_create")) {
$context = null;
uuid_create($context);
uuid_make($context, UUID_MAKE_V4);
uuid_export($context, UUID_FMT_STR, $uuid);
// Check if PECL UUID extension is available.
if (function_exists('uuid_time')) {
// Create a V4 UUID.
$uuid = uuid_create(UUID_TYPE_RANDOM);
} else {
// Fallback uuid generation based on:
// "http://www.php.net/manual/en/function.uniqid.php#94959".
+26
View File
@@ -476,4 +476,30 @@ class core_setuplib_testcase extends advanced_testcase {
public function test_get_real_size($input, $expectedbytes) {
$this->assertEquals($expectedbytes, get_real_size($input));
}
/**
* Validate the given V4 UUID.
*
* @param string $value The candidate V4 UUID
* @return bool True if valid; otherwise, false.
*/
protected static function is_valid_uuid_v4($value) {
// Version 4 UUIDs have the form xxxxxxxx-xxxx-4xxx-Yxxx-xxxxxxxxxxxx
// where x is any hexadecimal digit and Y is one of 8, 9, aA, or bB.
// First, the size is 36 (32 + 4 dashes).
if (strlen($value) != 36) {
return false;
}
// Finally, check the format.
$uuidv4pattern = '/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i';
return (preg_match($uuidv4pattern, $value) === 1);
}
/**
* Test the generate_uuid() function.
*/
public function test_generate_uuid() {
$uuid = generate_uuid();
$this->assertTrue(self::is_valid_uuid_v4($uuid), "Invalid v4 UUID: '$uuid'");
}
}