#include "postgres.h"
#include "access/hash.h"
#include "libpq/pqformat.h"
#include "utils/builtins.h"
#include "utils/uuid.h"
Go to the source code of this file.
Data Structures | |
struct | pg_uuid_t |
Defines | |
#define | UUID_LEN 16 |
Functions | |
static void | string_to_uuid (const char *source, pg_uuid_t *uuid) |
static int | uuid_internal_cmp (const pg_uuid_t *arg1, const pg_uuid_t *arg2) |
Datum | uuid_in (PG_FUNCTION_ARGS) |
Datum | uuid_out (PG_FUNCTION_ARGS) |
Datum | uuid_recv (PG_FUNCTION_ARGS) |
Datum | uuid_send (PG_FUNCTION_ARGS) |
Datum | uuid_lt (PG_FUNCTION_ARGS) |
Datum | uuid_le (PG_FUNCTION_ARGS) |
Datum | uuid_eq (PG_FUNCTION_ARGS) |
Datum | uuid_ge (PG_FUNCTION_ARGS) |
Datum | uuid_gt (PG_FUNCTION_ARGS) |
Datum | uuid_ne (PG_FUNCTION_ARGS) |
Datum | uuid_cmp (PG_FUNCTION_ARGS) |
Datum | uuid_hash (PG_FUNCTION_ARGS) |
#define UUID_LEN 16 |
Definition at line 22 of file uuid.c.
Referenced by uuid_hash(), uuid_internal_cmp(), uuid_recv(), and uuid_send().
static void string_to_uuid | ( | const char * | source, | |
pg_uuid_t * | uuid | |||
) | [static] |
Definition at line 83 of file uuid.c.
References pg_uuid_t::data, ereport, errcode(), errmsg(), ERROR, i, and NULL.
Referenced by uuid_in().
{ const char *src = source; bool braces = false; int i; if (src[0] == '{') { src++; braces = true; } for (i = 0; i < UUID_LEN; i++) { char str_buf[3]; if (src[0] == '\0' || src[1] == '\0') goto syntax_error; memcpy(str_buf, src, 2); if (!isxdigit((unsigned char) str_buf[0]) || !isxdigit((unsigned char) str_buf[1])) goto syntax_error; str_buf[2] = '\0'; uuid->data[i] = (unsigned char) strtoul(str_buf, NULL, 16); src += 2; if (src[0] == '-' && (i % 2) == 1 && i < UUID_LEN - 1) src++; } if (braces) { if (*src != '}') goto syntax_error; src++; } if (*src != '\0') goto syntax_error; return; syntax_error: ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for uuid: \"%s\"", source))); }
Datum uuid_cmp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 217 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_INT32, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_INT32(uuid_internal_cmp(arg1, arg2)); }
Datum uuid_eq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 180 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) == 0); }
Datum uuid_ge | ( | PG_FUNCTION_ARGS | ) |
Definition at line 189 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) >= 0); }
Datum uuid_gt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 198 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) > 0); }
Datum uuid_hash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 227 of file uuid.c.
References pg_uuid_t::data, hash_any(), PG_GETARG_UUID_P, and UUID_LEN.
{ pg_uuid_t *key = PG_GETARG_UUID_P(0); return hash_any(key->data, UUID_LEN); }
Datum uuid_in | ( | PG_FUNCTION_ARGS | ) |
Definition at line 34 of file uuid.c.
References palloc(), PG_GETARG_CSTRING, PG_RETURN_UUID_P, and string_to_uuid().
Referenced by special_uuid_value(), and uuid_generate_internal().
{ char *uuid_str = PG_GETARG_CSTRING(0); pg_uuid_t *uuid; uuid = (pg_uuid_t *) palloc(sizeof(*uuid)); string_to_uuid(uuid_str, uuid); PG_RETURN_UUID_P(uuid); }
Datum uuid_le | ( | PG_FUNCTION_ARGS | ) |
Definition at line 171 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) <= 0); }
Datum uuid_lt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 162 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) < 0); }
Datum uuid_ne | ( | PG_FUNCTION_ARGS | ) |
Definition at line 207 of file uuid.c.
References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().
{ pg_uuid_t *arg1 = PG_GETARG_UUID_P(0); pg_uuid_t *arg2 = PG_GETARG_UUID_P(1); PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) != 0); }
Datum uuid_out | ( | PG_FUNCTION_ARGS | ) |
Definition at line 45 of file uuid.c.
References appendStringInfoChar(), buf, StringInfoData::data, pg_uuid_t::data, i, initStringInfo(), PG_GETARG_UUID_P, and PG_RETURN_CSTRING.
Referenced by uuid_generate_v35_internal().
{ pg_uuid_t *uuid = PG_GETARG_UUID_P(0); static const char hex_chars[] = "0123456789abcdef"; StringInfoData buf; int i; initStringInfo(&buf); for (i = 0; i < UUID_LEN; i++) { int hi; int lo; /* * We print uuid values as a string of 8, 4, 4, 4, and then 12 * hexadecimal characters, with each group is separated by a hyphen * ("-"). Therefore, add the hyphens at the appropriate places here. */ if (i == 4 || i == 6 || i == 8 || i == 10) appendStringInfoChar(&buf, '-'); hi = uuid->data[i] >> 4; lo = uuid->data[i] & 0x0F; appendStringInfoChar(&buf, hex_chars[hi]); appendStringInfoChar(&buf, hex_chars[lo]); } PG_RETURN_CSTRING(buf.data); }
Datum uuid_recv | ( | PG_FUNCTION_ARGS | ) |
Definition at line 133 of file uuid.c.
References pg_uuid_t::data, palloc(), PG_GETARG_POINTER, PG_RETURN_POINTER, pq_getmsgbytes(), and UUID_LEN.
{ StringInfo buffer = (StringInfo) PG_GETARG_POINTER(0); pg_uuid_t *uuid; uuid = (pg_uuid_t *) palloc(UUID_LEN); memcpy(uuid->data, pq_getmsgbytes(buffer, UUID_LEN), UUID_LEN); PG_RETURN_POINTER(uuid); }
Datum uuid_send | ( | PG_FUNCTION_ARGS | ) |
Definition at line 144 of file uuid.c.
References pg_uuid_t::data, PG_GETARG_UUID_P, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), pq_sendbytes(), and UUID_LEN.
{ pg_uuid_t *uuid = PG_GETARG_UUID_P(0); StringInfoData buffer; pq_begintypsend(&buffer); pq_sendbytes(&buffer, (char *) uuid->data, UUID_LEN); PG_RETURN_BYTEA_P(pq_endtypsend(&buffer)); }