mirror of https://github.com/postgres/postgres
library. New configure option --with-ossp-uuid to activate.REL8_3_STABLE
parent
71495f296e
commit
74496bc298
@ -0,0 +1,19 @@ |
|||||||
|
# $PostgreSQL: pgsql/contrib/uuid-ossp/Makefile,v 1.1 2007/04/21 17:26:17 petere Exp $
|
||||||
|
|
||||||
|
MODULE_big = uuid-ossp
|
||||||
|
OBJS = uuid-ossp.o
|
||||||
|
DATA_built = uuid-ossp.sql
|
||||||
|
DATA = uninstall_uuid-ossp.sql
|
||||||
|
DOCS = README.uuid-ossp
|
||||||
|
|
||||||
|
SHLIB_LINK += -lossp-uuid
|
||||||
|
|
||||||
|
ifdef USE_PGXS |
||||||
|
PGXS := $(shell pg_config --pgxs)
|
||||||
|
include $(PGXS) |
||||||
|
else |
||||||
|
subdir = contrib/uuid-ossp
|
||||||
|
top_builddir = ../..
|
||||||
|
include $(top_builddir)/src/Makefile.global |
||||||
|
include $(top_srcdir)/contrib/contrib-global.mk |
||||||
|
endif |
@ -0,0 +1,97 @@ |
|||||||
|
UUID Generation Functions |
||||||
|
========================= |
||||||
|
Peter Eisentraut <peter_e@gmx.net> |
||||||
|
|
||||||
|
This module provides functions to generate universally unique |
||||||
|
identifiers (UUIDs) using one of the several standard algorithms, as |
||||||
|
well as functions to produce certain special UUID constants. |
||||||
|
|
||||||
|
|
||||||
|
Installation |
||||||
|
------------ |
||||||
|
|
||||||
|
The extra library required can be found at |
||||||
|
<http://www.ossp.org/pkg/lib/uuid/>. |
||||||
|
|
||||||
|
|
||||||
|
UUID Generation |
||||||
|
--------------- |
||||||
|
|
||||||
|
The relevant standards ITU-T Rec. X.667, ISO/IEC 9834-8:2005, and RFC |
||||||
|
4122 specify four algorithms for generating UUIDs, identified by the |
||||||
|
version numbers 1, 3, 4, and 5. (There is no version 2 algorithm.) |
||||||
|
Each of these algorithms could be suitable for a different set of |
||||||
|
applications. |
||||||
|
|
||||||
|
uuid_generate_v1() |
||||||
|
~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
This function generates a version 1 UUID. This involves the MAC |
||||||
|
address of the computer and a time stamp. Note that UUIDs of this |
||||||
|
kind reveal the identity of the computer that created the identifier |
||||||
|
and the time at which it did so, which might make it unsuitable for |
||||||
|
certain security-sensitive applications. |
||||||
|
|
||||||
|
uuid_generate_v1mc() |
||||||
|
~~~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
This function generates a version 1 UUID but uses a random multicast |
||||||
|
MAC address instead of the real MAC address of the computer. |
||||||
|
|
||||||
|
uuid_generate_v3(namespace uuid, name text) |
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
This function generates a version 3 UUID in the given namespace using |
||||||
|
the specified input name. The namespace should be one of the special |
||||||
|
constants produced by the uuid_ns_*() functions shown below. (It |
||||||
|
should be any UUID in theory.) The name is an identifier in the |
||||||
|
selected namespace. For example: |
||||||
|
|
||||||
|
uuid_generate_v3(uuid_ns_url(), 'http://www.postgresql.org') |
||||||
|
|
||||||
|
The name parameter will be MD5-hashed, so the cleartext cannot be |
||||||
|
derived from the generated UUID. |
||||||
|
|
||||||
|
The generation of UUIDs by this method has no random or |
||||||
|
environment-dependent element and is therefore reproducible. |
||||||
|
|
||||||
|
uuid_generate_v4() |
||||||
|
~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
This function generates a version 4 UUID, which is derived entirely |
||||||
|
from random numbers. |
||||||
|
|
||||||
|
uuid_generate_v5(namespace uuid, name text) |
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
This function generates a version 5 UUID, which works like a version 3 |
||||||
|
UUID except that SHA-1 is used as a hashing method. Version 5 should |
||||||
|
be preferred over version 3 because SHA-1 is thought to be more secure |
||||||
|
than MD5. |
||||||
|
|
||||||
|
|
||||||
|
UUID Constants |
||||||
|
-------------- |
||||||
|
|
||||||
|
uuid_nil() |
||||||
|
|
||||||
|
A "nil" UUID constant, which does not occur as a real UUID. |
||||||
|
|
||||||
|
uuid_ns_dns() |
||||||
|
|
||||||
|
Constant designating the DNS namespace for UUIDs. |
||||||
|
|
||||||
|
uuid_ns_url() |
||||||
|
|
||||||
|
Constant designating the URL namespace for UUIDs. |
||||||
|
|
||||||
|
uuid_ns_oid() |
||||||
|
|
||||||
|
Constant designating the ISO object identifier (OID) namespace for |
||||||
|
UUIDs. (This pertains to ASN.1 OIDs, unrelated to the OIDs used in |
||||||
|
PostgreSQL.) |
||||||
|
|
||||||
|
uuid_ns_x500() |
||||||
|
|
||||||
|
Constant designating the X.500 distinguished name (DN) namespace for |
||||||
|
UUIDs. |
@ -0,0 +1,15 @@ |
|||||||
|
/* $PostgreSQL: pgsql/contrib/uuid-ossp/uninstall_uuid-ossp.sql,v 1.1 2007/04/21 17:26:17 petere Exp $ */ |
||||||
|
|
||||||
|
SET search_path = public; |
||||||
|
|
||||||
|
DROP FUNCTION uuid_nil(); |
||||||
|
DROP FUNCTION uuid_ns_dns(); |
||||||
|
DROP FUNCTION uuid_ns_url(); |
||||||
|
DROP FUNCTION uuid_ns_oid(); |
||||||
|
DROP FUNCTION uuid_ns_x500(); |
||||||
|
|
||||||
|
DROP FUNCTION uuid_generate_v1(); |
||||||
|
DROP FUNCTION uuid_generate_v1mc(); |
||||||
|
DROP FUNCTION uuid_generate_v3(namespace uuid, name text); |
||||||
|
DROP FUNCTION uuid_generate_v4(); |
||||||
|
DROP FUNCTION uuid_generate_v5(namespace uuid, name text); |
@ -0,0 +1,198 @@ |
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* |
||||||
|
* UUID generation functions using the OSSP UUID library |
||||||
|
* |
||||||
|
* Copyright (c) 2007 PostgreSQL Global Development Group |
||||||
|
* |
||||||
|
* $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.c,v 1.1 2007/04/21 17:26:17 petere Exp $ |
||||||
|
* |
||||||
|
*------------------------------------------------------------------------- |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "postgres.h" |
||||||
|
#include "fmgr.h" |
||||||
|
#include "utils/builtins.h" |
||||||
|
#include "utils/uuid.h" |
||||||
|
|
||||||
|
#include <ossp/uuid.h> |
||||||
|
|
||||||
|
|
||||||
|
/* better both be 16 */ |
||||||
|
#if (UUID_LEN != UUID_LEN_BIN) |
||||||
|
#error UUID length mismatch |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
PG_MODULE_MAGIC; |
||||||
|
|
||||||
|
|
||||||
|
Datum uuid_nil(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_ns_dns(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_ns_url(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_ns_oid(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_ns_x500(PG_FUNCTION_ARGS); |
||||||
|
|
||||||
|
Datum uuid_generate_v1(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_generate_v1mc(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_generate_v3(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_generate_v4(PG_FUNCTION_ARGS); |
||||||
|
Datum uuid_generate_v5(PG_FUNCTION_ARGS); |
||||||
|
|
||||||
|
|
||||||
|
PG_FUNCTION_INFO_V1(uuid_nil); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_ns_dns); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_ns_url); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_ns_oid); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_ns_x500); |
||||||
|
|
||||||
|
PG_FUNCTION_INFO_V1(uuid_generate_v1); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_generate_v1mc); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_generate_v3); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_generate_v4); |
||||||
|
PG_FUNCTION_INFO_V1(uuid_generate_v5); |
||||||
|
|
||||||
|
|
||||||
|
static char * |
||||||
|
uuid_to_string(const uuid_t *uuid) |
||||||
|
{ |
||||||
|
char *buf = palloc(UUID_LEN_STR + 1); |
||||||
|
void *ptr = buf; |
||||||
|
size_t len = UUID_LEN_STR + 1; |
||||||
|
|
||||||
|
uuid_export(uuid, UUID_FMT_STR, &ptr, &len); |
||||||
|
|
||||||
|
return buf; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void |
||||||
|
string_to_uuid(const char *str, uuid_t *uuid) |
||||||
|
{ |
||||||
|
uuid_import(uuid, UUID_FMT_STR, str, UUID_LEN_STR + 1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static Datum |
||||||
|
special_uuid_value(const char *name) |
||||||
|
{ |
||||||
|
uuid_t *uuid; |
||||||
|
char *str; |
||||||
|
|
||||||
|
uuid_create(&uuid); |
||||||
|
uuid_load(uuid, name); |
||||||
|
str = uuid_to_string(uuid); |
||||||
|
uuid_destroy(uuid); |
||||||
|
|
||||||
|
return DirectFunctionCall1(uuid_in, CStringGetDatum(str)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_nil(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return special_uuid_value("nil"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_ns_dns(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return special_uuid_value("ns:DNS"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_ns_url(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return special_uuid_value("ns:URL"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_ns_oid(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return special_uuid_value("ns:OID"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_ns_x500(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return special_uuid_value("ns:X500"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static Datum |
||||||
|
uuid_generate_internal(int mode, const uuid_t *ns, const char *name) |
||||||
|
{ |
||||||
|
uuid_t *uuid; |
||||||
|
char *str; |
||||||
|
|
||||||
|
uuid_create(&uuid); |
||||||
|
uuid_make(uuid, mode, ns, name); |
||||||
|
str = uuid_to_string(uuid); |
||||||
|
uuid_destroy(uuid); |
||||||
|
|
||||||
|
return DirectFunctionCall1(uuid_in, CStringGetDatum(str)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_generate_v1(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return uuid_generate_internal(UUID_MAKE_V1, NULL, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_generate_v1mc(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return uuid_generate_internal(UUID_MAKE_V1 | UUID_MAKE_MC, NULL, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static Datum |
||||||
|
uuid_generate_v35_internal(int mode, pg_uuid_t *ns, text *name) |
||||||
|
{ |
||||||
|
uuid_t *ns_uuid; |
||||||
|
Datum result; |
||||||
|
|
||||||
|
uuid_create(&ns_uuid); |
||||||
|
string_to_uuid(DatumGetCString(DirectFunctionCall1(uuid_out, UUIDPGetDatum(ns))), |
||||||
|
ns_uuid); |
||||||
|
|
||||||
|
result = uuid_generate_internal(mode, |
||||||
|
ns_uuid, |
||||||
|
DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(name)))); |
||||||
|
|
||||||
|
uuid_destroy(ns_uuid); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_generate_v3(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
pg_uuid_t *ns = PG_GETARG_UUID_P(0); |
||||||
|
text *name = PG_GETARG_TEXT_P(1); |
||||||
|
|
||||||
|
return uuid_generate_v35_internal(UUID_MAKE_V3, ns, name); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_generate_v4(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return uuid_generate_internal(UUID_MAKE_V4, NULL, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Datum |
||||||
|
uuid_generate_v5(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
pg_uuid_t *ns = PG_GETARG_UUID_P(0); |
||||||
|
text *name = PG_GETARG_TEXT_P(1); |
||||||
|
|
||||||
|
return uuid_generate_v35_internal(UUID_MAKE_V5, ns, name); |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
/* $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.sql.in,v 1.1 2007/04/21 17:26:17 petere Exp $ */ |
||||||
|
|
||||||
|
SET search_path = public; |
||||||
|
|
||||||
|
CREATE FUNCTION uuid_nil() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_nil'; |
||||||
|
CREATE FUNCTION uuid_ns_dns() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_ns_dns'; |
||||||
|
CREATE FUNCTION uuid_ns_url() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_ns_url'; |
||||||
|
CREATE FUNCTION uuid_ns_oid() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_ns_oid'; |
||||||
|
CREATE FUNCTION uuid_ns_x500() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_ns_x500'; |
||||||
|
|
||||||
|
CREATE FUNCTION uuid_generate_v1() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_generate_v1'; |
||||||
|
CREATE FUNCTION uuid_generate_v1mc() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_generate_v1mc'; |
||||||
|
CREATE FUNCTION uuid_generate_v3(namespace uuid, name text) RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_generate_v3'; |
||||||
|
CREATE FUNCTION uuid_generate_v4() RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_generate_v4'; |
||||||
|
CREATE FUNCTION uuid_generate_v5(namespace uuid, name text) RETURNS uuid IMMUTABLE STRICT LANGUAGE C AS 'MODULE_PATHNAME', 'uuid_generate_v5'; |
Loading…
Reference in new issue