PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
uuid-ossp.c File Reference
#include "postgres.h"
#include "common/cryptohash.h"
#include "common/sha1.h"
#include "fmgr.h"
#include "port/pg_bswap.h"
#include "utils/builtins.h"
#include "utils/uuid.h"
#include "varatt.h"
Include dependency graph for uuid-ossp.c:

Go to the source code of this file.

Macros

#define uuid_hash   bsd_uuid_hash
 
#define UUID_MAKE_MC   0
 
#define UUID_MAKE_V1   1
 
#define UUID_MAKE_V2   2
 
#define UUID_MAKE_V3   3
 
#define UUID_MAKE_V4   4
 
#define UUID_MAKE_V5   5
 
#define dce_uuid_t   uuid_t
 
#define UUID_TO_NETWORK(uu)
 
#define UUID_TO_LOCAL(uu)
 
#define UUID_V3_OR_V5(uu, v)
 

Functions

 PG_MODULE_MAGIC_EXT (.name="uuid-ossp",.version=PG_VERSION)
 
 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 Datum uuid_generate_internal (int v, unsigned char *ns, const char *ptr, int len)
 
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)
 

Macro Definition Documentation

◆ dce_uuid_t

#define dce_uuid_t   uuid_t

Definition at line 75 of file uuid-ossp.c.

◆ uuid_hash

#define uuid_hash   bsd_uuid_hash

Definition at line 31 of file uuid-ossp.c.

◆ UUID_MAKE_MC

#define UUID_MAKE_MC   0

Definition at line 52 of file uuid-ossp.c.

◆ UUID_MAKE_V1

#define UUID_MAKE_V1   1

Definition at line 53 of file uuid-ossp.c.

◆ UUID_MAKE_V2

#define UUID_MAKE_V2   2

Definition at line 54 of file uuid-ossp.c.

◆ UUID_MAKE_V3

#define UUID_MAKE_V3   3

Definition at line 55 of file uuid-ossp.c.

◆ UUID_MAKE_V4

#define UUID_MAKE_V4   4

Definition at line 56 of file uuid-ossp.c.

◆ UUID_MAKE_V5

#define UUID_MAKE_V5   5

Definition at line 57 of file uuid-ossp.c.

◆ UUID_TO_LOCAL

#define UUID_TO_LOCAL (   uu)
Value:
do { \
uu.time_low = pg_ntoh32(uu.time_low); \
uu.time_mid = pg_ntoh16(uu.time_mid); \
uu.time_hi_and_version = pg_ntoh16(uu.time_hi_and_version); \
} while (0)
#define pg_ntoh32(x)
Definition: pg_bswap.h:125
#define pg_ntoh16(x)
Definition: pg_bswap.h:124

Definition at line 88 of file uuid-ossp.c.

◆ UUID_TO_NETWORK

#define UUID_TO_NETWORK (   uu)
Value:
do { \
uu.time_low = pg_hton32(uu.time_low); \
uu.time_mid = pg_hton16(uu.time_mid); \
uu.time_hi_and_version = pg_hton16(uu.time_hi_and_version); \
} while (0)
#define pg_hton32(x)
Definition: pg_bswap.h:121
#define pg_hton16(x)
Definition: pg_bswap.h:120

Definition at line 81 of file uuid-ossp.c.

◆ UUID_V3_OR_V5

#define UUID_V3_OR_V5 (   uu,
 
)
Value:
do { \
uu.time_hi_and_version &= 0x0FFF; \
uu.time_hi_and_version |= (v << 12); \
uu.clock_seq_hi_and_reserved &= 0x3F; \
uu.clock_seq_hi_and_reserved |= 0x80; \
} while(0)

Definition at line 95 of file uuid-ossp.c.

Function Documentation

◆ PG_FUNCTION_INFO_V1() [1/10]

PG_FUNCTION_INFO_V1 ( uuid_generate_v1  )

◆ PG_FUNCTION_INFO_V1() [2/10]

PG_FUNCTION_INFO_V1 ( uuid_generate_v1mc  )

◆ PG_FUNCTION_INFO_V1() [3/10]

PG_FUNCTION_INFO_V1 ( uuid_generate_v3  )

◆ PG_FUNCTION_INFO_V1() [4/10]

PG_FUNCTION_INFO_V1 ( uuid_generate_v4  )

◆ PG_FUNCTION_INFO_V1() [5/10]

PG_FUNCTION_INFO_V1 ( uuid_generate_v5  )

◆ PG_FUNCTION_INFO_V1() [6/10]

PG_FUNCTION_INFO_V1 ( uuid_nil  )

◆ PG_FUNCTION_INFO_V1() [7/10]

PG_FUNCTION_INFO_V1 ( uuid_ns_dns  )

◆ PG_FUNCTION_INFO_V1() [8/10]

PG_FUNCTION_INFO_V1 ( uuid_ns_oid  )

◆ PG_FUNCTION_INFO_V1() [9/10]

PG_FUNCTION_INFO_V1 ( uuid_ns_url  )

◆ PG_FUNCTION_INFO_V1() [10/10]

PG_FUNCTION_INFO_V1 ( uuid_ns_x500  )

◆ PG_MODULE_MAGIC_EXT()

PG_MODULE_MAGIC_EXT ( name = "uuid-ossp",
version = PG_VERSION 
)

◆ uuid_generate_internal()

static Datum uuid_generate_internal ( int  v,
unsigned char *  ns,
const char *  ptr,
int  len 
)
static

Definition at line 252 of file uuid-ossp.c.

253{
254 char strbuf[40];
255
256 switch (v)
257 {
258 case 0: /* constant-value uuids */
259 strlcpy(strbuf, ptr, 37);
260 break;
261
262 case 1: /* time/node-based uuids */
263 {
264#ifdef HAVE_UUID_E2FS
265 uuid_t uu;
266
267 uuid_generate_time(uu);
268 uuid_unparse(uu, strbuf);
269
270 /*
271 * PTR, if set, replaces the trailing characters of the uuid;
272 * this is to support v1mc, where a random multicast MAC is
273 * used instead of the physical one
274 */
275 if (ptr && len <= 36)
276 strcpy(strbuf + (36 - len), ptr);
277#else /* BSD */
278 uuid_t uu;
279 uint32_t status = uuid_s_ok;
280 char *str = NULL;
281
282 uuid_create(&uu, &status);
283
284 if (status == uuid_s_ok)
285 {
286 uuid_to_string(&uu, &str, &status);
287 if (status == uuid_s_ok)
288 {
289 strlcpy(strbuf, str, 37);
290
291 /*
292 * In recent NetBSD, uuid_create() has started
293 * producing v4 instead of v1 UUIDs. Check the
294 * version field and complain if it's not v1.
295 */
296 if (strbuf[14] != '1')
298 (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
299 /* translator: %c will be a hex digit */
300 errmsg("uuid_create() produced a version %c UUID instead of the expected version 1",
301 strbuf[14])));
302
303 /*
304 * PTR, if set, replaces the trailing characters of
305 * the uuid; this is to support v1mc, where a random
306 * multicast MAC is used instead of the physical one
307 */
308 if (ptr && len <= 36)
309 strcpy(strbuf + (36 - len), ptr);
310 }
311 free(str);
312 }
313
314 if (status != uuid_s_ok)
316 (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
317 errmsg("uuid library failure: %d",
318 (int) status)));
319#endif
320 break;
321 }
322
323 case 3: /* namespace-based MD5 uuids */
324 case 5: /* namespace-based SHA1 uuids */
325 {
326 dce_uuid_t uu;
327#ifdef HAVE_UUID_BSD
328 uint32_t status = uuid_s_ok;
329 char *str = NULL;
330#endif
331
332 if (v == 3)
333 {
335
336 if (pg_cryptohash_init(ctx) < 0)
337 elog(ERROR, "could not initialize %s context: %s", "MD5",
339 if (pg_cryptohash_update(ctx, ns, sizeof(uu)) < 0 ||
340 pg_cryptohash_update(ctx, (unsigned char *) ptr, len) < 0)
341 elog(ERROR, "could not update %s context: %s", "MD5",
343 /* we assume sizeof MD5 result is 16, same as UUID size */
344 if (pg_cryptohash_final(ctx, (unsigned char *) &uu,
345 sizeof(uu)) < 0)
346 elog(ERROR, "could not finalize %s context: %s", "MD5",
349 }
350 else
351 {
353 unsigned char sha1result[SHA1_DIGEST_LENGTH];
354
355 if (pg_cryptohash_init(ctx) < 0)
356 elog(ERROR, "could not initialize %s context: %s", "SHA1",
358 if (pg_cryptohash_update(ctx, ns, sizeof(uu)) < 0 ||
359 pg_cryptohash_update(ctx, (unsigned char *) ptr, len) < 0)
360 elog(ERROR, "could not update %s context: %s", "SHA1",
362 if (pg_cryptohash_final(ctx, sha1result, sizeof(sha1result)) < 0)
363 elog(ERROR, "could not finalize %s context: %s", "SHA1",
366
367 memcpy(&uu, sha1result, sizeof(uu));
368 }
369
370 /* the calculated hash is using local order */
371 UUID_TO_NETWORK(uu);
372 UUID_V3_OR_V5(uu, v);
373
374#ifdef HAVE_UUID_E2FS
375 /* uuid_unparse expects local order */
376 UUID_TO_LOCAL(uu);
377 uuid_unparse((unsigned char *) &uu, strbuf);
378#else /* BSD */
379 uuid_to_string(&uu, &str, &status);
380
381 if (status == uuid_s_ok)
382 strlcpy(strbuf, str, 37);
383
384 free(str);
385
386 if (status != uuid_s_ok)
388 (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
389 errmsg("uuid library failure: %d",
390 (int) status)));
391#endif
392 break;
393 }
394
395 case 4: /* random uuid */
396 default:
397 {
398#ifdef HAVE_UUID_E2FS
399 uuid_t uu;
400
401 uuid_generate_random(uu);
402 uuid_unparse(uu, strbuf);
403#else /* BSD */
404 snprintf(strbuf, sizeof(strbuf),
405 "%08lx-%04x-%04x-%04x-%04x%08lx",
406 (unsigned long) arc4random(),
407 (unsigned) (arc4random() & 0xffff),
408 (unsigned) ((arc4random() & 0xfff) | 0x4000),
409 (unsigned) ((arc4random() & 0x3fff) | 0x8000),
410 (unsigned) (arc4random() & 0xffff),
411 (unsigned long) arc4random());
412#endif
413 break;
414 }
415 }
416
418}
const char * pg_cryptohash_error(pg_cryptohash_ctx *ctx)
Definition: cryptohash.c:254
int pg_cryptohash_update(pg_cryptohash_ctx *ctx, const uint8 *data, size_t len)
Definition: cryptohash.c:136
pg_cryptohash_ctx * pg_cryptohash_create(pg_cryptohash_type type)
Definition: cryptohash.c:74
int pg_cryptohash_init(pg_cryptohash_ctx *ctx)
Definition: cryptohash.c:100
void pg_cryptohash_free(pg_cryptohash_ctx *ctx)
Definition: cryptohash.c:238
int pg_cryptohash_final(pg_cryptohash_ctx *ctx, uint8 *dest, size_t len)
Definition: cryptohash.c:172
@ PG_SHA1
Definition: cryptohash.h:22
@ PG_MD5
Definition: cryptohash.h:21
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define ereport(elevel,...)
Definition: elog.h:149
#define DirectFunctionCall1(func, arg1)
Definition: fmgr.h:682
const char * str
#define free(a)
Definition: header.h:65
const void size_t len
#define snprintf
Definition: port.h:239
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
static Datum CStringGetDatum(const char *X)
Definition: postgres.h:355
#define SHA1_DIGEST_LENGTH
Definition: sha1.h:17
#define dce_uuid_t
Definition: uuid-ossp.c:75
#define UUID_V3_OR_V5(uu, v)
Definition: uuid-ossp.c:95
#define UUID_TO_LOCAL(uu)
Definition: uuid-ossp.c:88
#define UUID_TO_NETWORK(uu)
Definition: uuid-ossp.c:81
Datum uuid_in(PG_FUNCTION_ARGS)
Definition: uuid.c:78

References CStringGetDatum(), dce_uuid_t, DirectFunctionCall1, elog, ereport, errcode(), errmsg(), ERROR, free, len, pg_cryptohash_create(), pg_cryptohash_error(), pg_cryptohash_final(), pg_cryptohash_free(), pg_cryptohash_init(), pg_cryptohash_update(), PG_MD5, PG_SHA1, SHA1_DIGEST_LENGTH, snprintf, str, strlcpy(), uuid_in(), UUID_TO_LOCAL, UUID_TO_NETWORK, and UUID_V3_OR_V5.

Referenced by uuid_generate_v1(), uuid_generate_v1mc(), uuid_generate_v3(), uuid_generate_v4(), uuid_generate_v5(), uuid_nil(), uuid_ns_dns(), uuid_ns_oid(), uuid_ns_url(), and uuid_ns_x500().

◆ uuid_generate_v1()

Datum uuid_generate_v1 ( PG_FUNCTION_ARGS  )

Definition at line 484 of file uuid-ossp.c.

485{
486 return uuid_generate_internal(UUID_MAKE_V1, NULL, NULL, 0);
487}
#define UUID_MAKE_V1
Definition: uuid-ossp.c:53
static Datum uuid_generate_internal(int v, unsigned char *ns, const char *ptr, int len)
Definition: uuid-ossp.c:252

References uuid_generate_internal(), and UUID_MAKE_V1.

◆ uuid_generate_v1mc()

Datum uuid_generate_v1mc ( PG_FUNCTION_ARGS  )

Definition at line 491 of file uuid-ossp.c.

492{
493#ifdef HAVE_UUID_OSSP
494 char *buf = NULL;
495#elif defined(HAVE_UUID_E2FS)
496 char strbuf[40];
497 char *buf;
498 uuid_t uu;
499
500 uuid_generate_random(uu);
501
502 /* set IEEE802 multicast and local-admin bits */
503 ((dce_uuid_t *) &uu)->node[0] |= 0x03;
504
505 uuid_unparse(uu, strbuf);
506 buf = strbuf + 24;
507#else /* BSD */
508 char buf[16];
509
510 /* set IEEE802 multicast and local-admin bits */
511 snprintf(buf, sizeof(buf), "-%04x%08lx",
512 (unsigned) ((arc4random() & 0xffff) | 0x0300),
513 (unsigned long) arc4random());
514#endif
515
517 buf, 13);
518}
static char * buf
Definition: pg_test_fsync.c:72
#define UUID_MAKE_MC
Definition: uuid-ossp.c:52

References buf, dce_uuid_t, snprintf, uuid_generate_internal(), UUID_MAKE_MC, and UUID_MAKE_V1.

◆ uuid_generate_v3()

Datum uuid_generate_v3 ( PG_FUNCTION_ARGS  )

Definition at line 522 of file uuid-ossp.c.

523{
526
527#ifdef HAVE_UUID_OSSP
528 return uuid_generate_v35_internal(UUID_MAKE_V3, ns, name);
529#else
530 return uuid_generate_internal(UUID_MAKE_V3, (unsigned char *) ns,
532#endif
533}
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
Definition: uuid.h:21
Definition: c.h:658
#define UUID_MAKE_V3
Definition: uuid-ossp.c:55
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:40
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317
const char * name

References name, PG_GETARG_TEXT_PP, PG_GETARG_UUID_P, uuid_generate_internal(), UUID_MAKE_V3, VARDATA_ANY, and VARSIZE_ANY_EXHDR.

◆ uuid_generate_v4()

Datum uuid_generate_v4 ( PG_FUNCTION_ARGS  )

Definition at line 537 of file uuid-ossp.c.

538{
539 return uuid_generate_internal(UUID_MAKE_V4, NULL, NULL, 0);
540}
#define UUID_MAKE_V4
Definition: uuid-ossp.c:56

References uuid_generate_internal(), and UUID_MAKE_V4.

◆ uuid_generate_v5()

Datum uuid_generate_v5 ( PG_FUNCTION_ARGS  )

Definition at line 544 of file uuid-ossp.c.

545{
548
549#ifdef HAVE_UUID_OSSP
550 return uuid_generate_v35_internal(UUID_MAKE_V5, ns, name);
551#else
552 return uuid_generate_internal(UUID_MAKE_V5, (unsigned char *) ns,
554#endif
555}
#define UUID_MAKE_V5
Definition: uuid-ossp.c:57

References name, PG_GETARG_TEXT_PP, PG_GETARG_UUID_P, uuid_generate_internal(), UUID_MAKE_V5, VARDATA_ANY, and VARSIZE_ANY_EXHDR.

◆ uuid_nil()

Datum uuid_nil ( PG_FUNCTION_ARGS  )

Definition at line 424 of file uuid-ossp.c.

425{
426#ifdef HAVE_UUID_OSSP
427 return special_uuid_value("nil");
428#else
429 return uuid_generate_internal(0, NULL,
430 "00000000-0000-0000-0000-000000000000", 36);
431#endif
432}

References uuid_generate_internal().

◆ uuid_ns_dns()

Datum uuid_ns_dns ( PG_FUNCTION_ARGS  )

Definition at line 436 of file uuid-ossp.c.

437{
438#ifdef HAVE_UUID_OSSP
439 return special_uuid_value("ns:DNS");
440#else
441 return uuid_generate_internal(0, NULL,
442 "6ba7b810-9dad-11d1-80b4-00c04fd430c8", 36);
443#endif
444}

References uuid_generate_internal().

◆ uuid_ns_oid()

Datum uuid_ns_oid ( PG_FUNCTION_ARGS  )

Definition at line 460 of file uuid-ossp.c.

461{
462#ifdef HAVE_UUID_OSSP
463 return special_uuid_value("ns:OID");
464#else
465 return uuid_generate_internal(0, NULL,
466 "6ba7b812-9dad-11d1-80b4-00c04fd430c8", 36);
467#endif
468}

References uuid_generate_internal().

◆ uuid_ns_url()

Datum uuid_ns_url ( PG_FUNCTION_ARGS  )

Definition at line 448 of file uuid-ossp.c.

449{
450#ifdef HAVE_UUID_OSSP
451 return special_uuid_value("ns:URL");
452#else
453 return uuid_generate_internal(0, NULL,
454 "6ba7b811-9dad-11d1-80b4-00c04fd430c8", 36);
455#endif
456}

References uuid_generate_internal().

◆ uuid_ns_x500()

Datum uuid_ns_x500 ( PG_FUNCTION_ARGS  )

Definition at line 472 of file uuid-ossp.c.

473{
474#ifdef HAVE_UUID_OSSP
475 return special_uuid_value("ns:X500");
476#else
477 return uuid_generate_internal(0, NULL,
478 "6ba7b814-9dad-11d1-80b4-00c04fd430c8", 36);
479#endif
480}

References uuid_generate_internal().