Files
2008-04-01 15:57:17 +00:00

430 lines
9.2 KiB
XML

<?xml version="1.0" ?>
<extension name="uuid" version="1.0.0">
<summary>UUID extension</summary>
<description>
A wrapper around libuuid from the ext2utils project.
</description>
<license>LGPL</license>
<maintainers>
<maintainer>
<user>hholzgra</user>
<name>Hartmut Holzgraefe</name>
<email>hartmut@php.net</email>
<role>lead</role>
</maintainer>
</maintainers>
<release>
<version>1.0.2</version>
<date>2008-04-01</date>
<state>stable</state>
<notes>
- should now work on Solaris, too (although missing two functions)
- added uuid_parse() and uuid_unparse()
- now generated using PEAR::CodeGen_PECL
</notes>
</release>
<deps language="c" platform="unix">
<with>
<header name="uuid/uuid.h"/>
<lib name="uuid"/>
</with>
<configm4>
PHP_CHECK_FUNC_LIB(uuid_type, uuid)
PHP_CHECK_FUNC_LIB(uuid_variant, uuid)
</configm4>
</deps>
<constant name="UUID_VARIANT_NCS" if="UUID_VARIANT_NCS"/>
<constant name="UUID_VARIANT_DCE" if="UUID_VARIANT_DCE"/>
<constant name="UUID_VARIANT_MICROSOFT" if="UUID_VARIANT_MICROSOFT"/>
<constant name="UUID_VARIANT_OTHER" if="UUID_VARIANT_OTHER"/>
<constant name="UUID_TYPE_DEFAULT" define="yes" type="int" value="0"/>
<constant name="UUID_TYPE_TIME" define="yes" type="int" value="UUID_TYPE_DCE_TIME"/>
<constant name="UUID_TYPE_DCE" define="yes" type="int" value="UUID_TYPE_DCE_RANDOM"/>
<constant name="UUID_TYPE_NAME" define="yes" type="int" value="UUID_TYPE_DCE_TIME"/>
<constant name="UUID_TYPE_RANDOM" define="yes" type="int" value="UUID_TYPE_DCE_RANDOM"/>
<constant name="UUID_TYPE_NULL" define="yes" type="int" value="-1"/>
<constant name="UUID_TYPE_INVALID" define="yes" type="int" value="-42"/>
<function name="uuid_create">
<proto>string uuid_create([int uuid_type])</proto>
<summary>Generate a new UUID</summary>
<description>
...
</description>
<code>
uuid_t uuid;
char uuid_str[37];
switch(uuid_type) {
case UUID_TYPE_DCE_TIME:
uuid_generate_time(uuid);
break;
case UUID_TYPE_DCE_RANDOM:
uuid_generate_random(uuid);
break;
case UUID_TYPE_DEFAULT:
uuid_generate(uuid);
break;
default:
php_error_docref(NULL TSRMLS_CC,
E_WARNING,
"Unknown/invalid UUID type '%d' requested, using default type instead",
uuid_type);
uuid_generate(uuid);
break;
}
uuid_unparse(uuid, uuid_str);
RETURN_STRING(uuid_str, 1);
</code>
<test>
<code>
<![CDATA[
// check basic format of generated UUIDs
$uuid = uuid_create();
if (ereg("[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}", $uuid)) {
echo "basic format ok\n";
} else {
echo "basic UUID format check failed, generated UUID was $uuid\n";
}
]]>
</code>
<result>
basic format ok
</result>
</test>
</function>
<function name="uuid_is_valid">
<proto>bool uuid_is_valid(string uuid)</proto>
<summary>Check whether a given UUID string is a valid UUID</summary>
<description>
add some text here
</description>
<code>
uuid_t u;
RETURN_BOOL(0 == uuid_parse(uuid, u));
</code>
<test>
<code>
var_dump(uuid_is_valid("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb"));
var_dump(uuid_is_valid("ffffffff-ffff-ffff-ffff-ffffffffffff"));
var_dump(uuid_is_valid("61616161-6161-6161-6161-616161616161"));
var_dump(uuid_is_valid("foobar"));
</code>
<result>
bool(true)
bool(true)
bool(true)
bool(false)
</result>
</test>
</function>
<function name="uuid_compare">
<proto>int uuid_compare(string uuid1, string uuid2)</proto>
<summary>Compare two UUIDs</summary>
<code>
uuid_t u1, u2;
if(uuid_parse(uuid1, u1)) RETURN_FALSE;
if(uuid_parse(uuid2, u2)) RETURN_FALSE;
RETURN_LONG(uuid_compare(u1, u2));
</code>
<test>
<code>
<?data
$uuids = array();
$uuids[0] = "00000000-0000-0000-0000-000000000000";
$uuids[1] = "878b258c-a9f1-467c-8e1d-47d79ca2c01b";
$uuids[2] = "b691c99c-7fc5-11d8-9fa8-00065b896488";
foreach ($uuids as $key1 => $uuid1) {
foreach ($uuids as $key2 => $uuid2) {
echo "uuid$key1";
switch (uuid_compare($uuid1, $uuid2)) {
case -1: echo " < "; break;
case 0: echo " = "; break;
case 1: echo " > "; break;
}
echo "uuid$key2\n";
}
echo "\n";
}
?>
</code>
<result>
<?data
uuid0 = uuid0
uuid0 < uuid1
uuid0 < uuid2
uuid1 > uuid0
uuid1 = uuid1
uuid1 < uuid2
uuid2 > uuid0
uuid2 > uuid1
uuid2 = uuid2
?>
</result>
</test>
</function>
<function name="uuid_is_null">
<proto>bool uuid_is_null(string uuid)</proto>
<summary>Check wheter an UUID is the NULL UUID 00000000-0000-0000-0000-000000000000</summary>
<description>
...
</description>
<code>
uuid_t u;
if(uuid_parse(uuid, u)) RETURN_FALSE;
RETURN_BOOL(uuid_is_null(u));
</code>
<test>
<code>
var_dump(uuid_is_null("00000000-0000-0000-0000-000000000000"));
var_dump(uuid_is_null("b691c99c-7fc5-11d8-9fa8-00065b896488"));
var_dump(uuid_is_null("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"));
</code>
<result>
bool(true)
bool(false)
bool(false)
</result>
</test>
</function>
<function name="uuid_type" if="HAVE_UUID_TYPE">
<proto>int uuid_type(string uuid)</proto>
<summary>Return the UUIDs type</summary>
<description>
...
</description>
<code>
uuid_t u;
if(uuid_parse(uuid, u)) RETURN_FALSE;
if (uuid_is_null(u)) RETURN_LONG(UUID_TYPE_NULL);
RETURN_LONG(uuid_type(u));
</code>
<test>
<code>
echo uuid_type("b691c99c-7fc5-11d8-9fa8-00065b896488") == UUID_TYPE_TIME ? "OK\n" : "Failure\n";
echo uuid_type("878b258c-a9f1-467c-8e1d-47d79ca2c01b") == UUID_TYPE_RANDOM ? "OK\n" : "Failure\n";
echo uuid_type("00000000-0000-0000-0000-000000000000") == UUID_TYPE_NULL ? "OK\n" : "Failure\n";
</code>
<result>
OK
OK
OK
</result>
</test>
</function>
<function name="uuid_variant" if="HAVE_UUID_VARIANT">
<proto>int uuid_variant(string uuid)</proto>
<summary>Return the UUIDs variant</summary>
<description>
...
</description>
<code>
uuid_t u;
if(uuid_parse(uuid, u)) RETURN_FALSE;
if (uuid_is_null(u)) RETURN_LONG(UUID_TYPE_NULL);
RETURN_LONG(uuid_variant(u));
</code>
<test>
<code>
echo uuid_variant("b691c99c-7fc5-11d8-9fa8-00065b896488")."\n";
echo uuid_variant("878b258c-a9f1-467c-8e1d-47d79ca2c01b")."\n";
echo uuid_variant("00000000-0000-0000-0000-000000000000")."\n";
</code>
<result>
1
1
-1
</result>
</test>
</function>
<function name="uuid_time">
<proto>int uuid_time(string uuid)</proto>
<summary>Extract creation time from a time based UUID as UNIX timestamp</summary>
<description>
...
</description>
<code>
uuid_t u;
if(uuid_parse(uuid, u)) RETURN_FALSE;
#if HAVE_UUID_VARIANT
if(uuid_variant(u) != 1) RETURN_FALSE;
#endif
#if HAVE_UUID_TYPE
if(uuid_type(u) != 1) RETURN_FALSE;
#endif
RETURN_LONG(uuid_time(u, NULL));
</code>
<test>
<code>
var_dump(uuid_time("b691c99c-7fc5-11d8-9fa8-00065b896488"));
var_dump(uuid_time("878b258c-a9f1-467c-8e1d-47d79ca2c01b"));
</code>
<result>
int(1080374815)
bool(false)
</result>
</test>
</function>
<function name="uuid_mac">
<proto>string uuid_mac(string uuid)</proto>
<summary>Get UUID creator network MAC address</summary>
<description>
...
</description>
<code>
<?data
uuid_t u;
char uuid_str[37];
if(uuid_parse(uuid, u)) RETURN_FALSE;
#if HAVE_UUID_VARIANT
if(uuid_variant(u) != 1) RETURN_FALSE;
#endif
#if HAVE_UUID_TYPE
if(uuid_type(u) != 1) RETURN_FALSE;
#endif
if(uuid[10] & 0x80) RETURN_FALSE; // invalid MAC
uuid_unparse(u, uuid_str);
RETURN_STRING((char *)(uuid_str + 24), 1);
?>
</code>
<test>
<code>
var_dump(uuid_mac("b691c99c-7fc5-11d8-9fa8-00065b896488"));
var_dump(uuid_mac("878b258c-a9f1-467c-8e1d-47d79ca2c01b"));
</code>
<result>
string(12) "00065b896488"
bool(false)
</result>
</test>
</function>
<function name="uuid_parse">
<proto>string uuid_parse(string uuid)</proto>
<code>
<?data
uuid_t uuid_bin;
if (uuid_parse(uuid, uuid_bin)) {
RETURN_FALSE;
}
RETURN_STRINGL((char *)uuid_bin, sizeof(uuid_t), 1);
?>
</code>
<test>
<code>
var_dump(uuid_parse("61616161-6161-6161-6161-616161616161"));
</code>
<result>
string(16) "aaaaaaaaaaaaaaaa"
</result>
</test>
</function>
<function name="uuid_unparse">
<proto>string uuid_unparse(string uuid)</proto>
<code>
<?data
char uuid_txt[37];
if (uuid_len != sizeof(uuid_t)) {
RETURN_FALSE;
}
uuid_unparse((unsigned char *)uuid, uuid_txt);
RETURN_STRINGL(uuid_txt, 36, 1);
?>
</code>
<test>
<code>
var_dump(uuid_unparse("aaaaaaaaaaaaaaaa"));
</code>
<result>
string(36) "61616161-6161-6161-6161-616161616161"
</result>
</test>
</function>
</extension>