On Sun, 2007-01-28 at 20:47 +0100, Magnus Hagander wrote:
> uuid_t is defined to UUID in the win32 platform SDK header files. I
> would suggest we use pguuid_t or something like that instead.
We could possibly try to workaround it by #undef'ing any existing uuid_t
definitions before we supply our own, but per out-of-band discussion
with Magnus, it seems safer to just use a different type name
altogether. Attached is a patch that renames uuid_t to pg_uuid_t (and
makes some other minor cleanup of uuid.c), which I'll apply shortly.
-Neil
Index: src/backend/utils/adt/uuid.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/utils/adt/uuid.c,v
retrieving revision 1.1
diff -c -p -r1.1 uuid.c
*** src/backend/utils/adt/uuid.c 28 Jan 2007 16:16:52 -0000 1.1
--- src/backend/utils/adt/uuid.c 28 Jan 2007 20:14:12 -0000
***************
*** 35,84 ****
/* uuid size in bytes */
#define UUID_LEN 16
! /* The uuid_t type is declared as struct uuid_t in uuid.h */
! struct uuid_t
{
char data[UUID_LEN];
};
! static void uuid_data_from_string(const char *source, unsigned char *data);
! static void string_from_uuid_data(const char *fmt, const char *data, char *uuid_str);
static bool parse_uuid_string(const char *fmt, const char *chk_fmt,
! const char *source, unsigned char *data);
static bool is_valid_format(const char *source, const char *fmt);
! static int32 uuid_internal_cmp(uuid_t *arg1, uuid_t *arg2);
Datum
uuid_in(PG_FUNCTION_ARGS)
{
char *uuid_str = PG_GETARG_CSTRING(0);
! uuid_t *uuid;
! uint8 data[UUID_LEN];
! uuid_data_from_string(uuid_str, data);
! uuid = (uuid_t *) palloc(sizeof(uuid_t));
! memcpy(uuid->data, data, UUID_LEN);
PG_RETURN_UUID_P(uuid);
}
Datum
uuid_out(PG_FUNCTION_ARGS)
{
! uuid_t *uuid = (uuid_t *) PG_GETARG_POINTER(0);
char *uuid_str;
uuid_str = (char *) palloc(PRINT_SIZE);
! string_from_uuid_data(UUID_FMT1, uuid->data, uuid_str);
PG_RETURN_CSTRING(uuid_str);
}
/* string to uuid convertor by various format types */
static void
! uuid_data_from_string(const char *source, unsigned char *data)
{
! if (!parse_uuid_string(UUID_FMT1, UUID_CHK_FMT1, source, data) &&
! !parse_uuid_string(UUID_FMT2, UUID_CHK_FMT2, source, data) &&
! !parse_uuid_string(UUID_FMT3, UUID_CHK_FMT3, source, data))
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
--- 35,83 ----
/* uuid size in bytes */
#define UUID_LEN 16
! /* pg_uuid_t is declared to be struct pg_uuid_t in uuid.h */
! struct pg_uuid_t
{
char data[UUID_LEN];
};
! static void string_to_uuid(const char *source, pg_uuid_t *uuid);
! static void uuid_to_string(const char *fmt, const pg_uuid_t *uuid,
! char *uuid_str);
static bool parse_uuid_string(const char *fmt, const char *chk_fmt,
! const char *source, char *data);
static bool is_valid_format(const char *source, const char *fmt);
! static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2);
Datum
uuid_in(PG_FUNCTION_ARGS)
{
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_out(PG_FUNCTION_ARGS)
{
! pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
char *uuid_str;
uuid_str = (char *) palloc(PRINT_SIZE);
! uuid_to_string(UUID_FMT1, uuid, uuid_str);
PG_RETURN_CSTRING(uuid_str);
}
/* string to uuid convertor by various format types */
static void
! string_to_uuid(const char *source, pg_uuid_t *uuid)
{
! if (!parse_uuid_string(UUID_FMT1, UUID_CHK_FMT1, source, uuid->data) &&
! !parse_uuid_string(UUID_FMT2, UUID_CHK_FMT2, source, uuid->data) &&
! !parse_uuid_string(UUID_FMT3, UUID_CHK_FMT3, source, uuid->data))
{
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
*************** is_valid_format(const char *source, cons
*** 126,132 ****
/* parse the uuid string to a format and return true if okay */
static bool
parse_uuid_string(const char *fmt, const char *chk_fmt,
! const char *source, unsigned char *data)
{
int result = sscanf(source, fmt,
&data[0], &data[1], &data[2], &data[3], &data[4],
--- 125,131 ----
/* parse the uuid string to a format and return true if okay */
static bool
parse_uuid_string(const char *fmt, const char *chk_fmt,
! const char *source, char *data)
{
int result = sscanf(source, fmt,
&data[0], &data[1], &data[2], &data[3], &data[4],
*************** parse_uuid_string(const char *fmt, const
*** 139,146 ****
/* create a string representation of the uuid */
static void
! string_from_uuid_data(const char *fmt, const char *data, char *uuid_str)
{
snprintf(uuid_str, PRINT_SIZE, fmt,
data[0], data[1], data[2], data[3], data[4],
data[5], data[6], data[7], data[8], data[9],
--- 138,146 ----
/* create a string representation of the uuid */
static void
! uuid_to_string(const char *fmt, const pg_uuid_t *uuid, char *uuid_str)
{
+ const char *data = uuid->data;
snprintf(uuid_str, PRINT_SIZE, fmt,
data[0], data[1], data[2], data[3], data[4],
data[5], data[6], data[7], data[8], data[9],
*************** Datum
*** 152,160 ****
uuid_recv(PG_FUNCTION_ARGS)
{
StringInfo buffer = (StringInfo) PG_GETARG_POINTER(0);
! uuid_t *uuid;
! uuid = (uuid_t *) palloc(UUID_LEN);
memcpy(uuid->data, pq_getmsgbytes(buffer, UUID_LEN), UUID_LEN);
PG_RETURN_POINTER(uuid);
}
--- 152,160 ----
uuid_recv(PG_FUNCTION_ARGS)
{
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);
}
*************** uuid_recv(PG_FUNCTION_ARGS)
*** 162,168 ****
Datum
uuid_send(PG_FUNCTION_ARGS)
{
! uuid_t *uuid = PG_GETARG_UUID_P(0);
StringInfoData buffer;
pq_begintypsend(&buffer);
--- 162,168 ----
Datum
uuid_send(PG_FUNCTION_ARGS)
{
! pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
StringInfoData buffer;
pq_begintypsend(&buffer);
*************** uuid_send(PG_FUNCTION_ARGS)
*** 171,178 ****
}
/* internal uuid compare function */
! static int32
! uuid_internal_cmp(uuid_t *arg1, uuid_t *arg2)
{
return memcmp(arg1->data, arg2->data, UUID_LEN);
}
--- 171,178 ----
}
/* internal uuid compare function */
! static int
! uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
{
return memcmp(arg1->data, arg2->data, UUID_LEN);
}
*************** uuid_internal_cmp(uuid_t *arg1, uuid_t *
*** 180,187 ****
Datum
uuid_lt(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) < 0);
}
--- 180,187 ----
Datum
uuid_lt(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_lt(PG_FUNCTION_ARGS)
*** 189,196 ****
Datum
uuid_le(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) <= 0);
}
--- 189,196 ----
Datum
uuid_le(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_le(PG_FUNCTION_ARGS)
*** 198,205 ****
Datum
uuid_eq(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) == 0);
}
--- 198,205 ----
Datum
uuid_eq(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_eq(PG_FUNCTION_ARGS)
*** 207,214 ****
Datum
uuid_ge(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) >= 0);
}
--- 207,214 ----
Datum
uuid_ge(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_ge(PG_FUNCTION_ARGS)
*** 216,223 ****
Datum
uuid_gt(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) > 0);
}
--- 216,223 ----
Datum
uuid_gt(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_gt(PG_FUNCTION_ARGS)
*** 225,232 ****
Datum
uuid_ne(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) != 0);
}
--- 225,232 ----
Datum
uuid_ne(PG_FUNCTION_ARGS)
{
! 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);
}
*************** uuid_ne(PG_FUNCTION_ARGS)
*** 235,242 ****
Datum
uuid_cmp(PG_FUNCTION_ARGS)
{
! uuid_t *arg1 = PG_GETARG_UUID_P(0);
! uuid_t *arg2 = PG_GETARG_UUID_P(1);
PG_RETURN_INT32(uuid_internal_cmp(arg1, arg2));
}
--- 235,242 ----
Datum
uuid_cmp(PG_FUNCTION_ARGS)
{
! 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));
}
*************** uuid_cmp(PG_FUNCTION_ARGS)
*** 245,252 ****
Datum
uuid_hash(PG_FUNCTION_ARGS)
{
! uuid_t *key = PG_GETARG_UUID_P(0);
! return hash_any((unsigned char *) key, sizeof(uuid_t));
}
/* cast text to uuid */
--- 245,252 ----
Datum
uuid_hash(PG_FUNCTION_ARGS)
{
! pg_uuid_t *key = PG_GETARG_UUID_P(0);
! return hash_any((unsigned char *) key, sizeof(pg_uuid_t));
}
/* cast text to uuid */
*************** text_uuid(PG_FUNCTION_ARGS)
*** 272,279 ****
Datum
uuid_text(PG_FUNCTION_ARGS)
{
! uuid_t *uuid = PG_GETARG_UUID_P(0);
! Datum uuid_str = DirectFunctionCall1(uuid_out, UUIDPGetDatum(uuid));
PG_RETURN_DATUM(DirectFunctionCall1(textin, uuid_str));
}
--- 272,279 ----
Datum
uuid_text(PG_FUNCTION_ARGS)
{
! pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
! Datum uuid_str = DirectFunctionCall1(uuid_out, UUIDPGetDatum(uuid));
PG_RETURN_DATUM(DirectFunctionCall1(textin, uuid_str));
}
Index: src/include/utils/uuid.h
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/include/utils/uuid.h,v
retrieving revision 1.1
diff -c -p -r1.1 uuid.h
*** src/include/utils/uuid.h 28 Jan 2007 16:16:54 -0000 1.1
--- src/include/utils/uuid.h 28 Jan 2007 20:15:20 -0000
***************
*** 1,7 ****
/*-------------------------------------------------------------------------
*
* uuid.h
! * Header file for the "uuid" data type.
*
* Copyright (c) 2007, PostgreSQL Global Development Group
*
--- 1,9 ----
/*-------------------------------------------------------------------------
*
* uuid.h
! * Header file for the "uuid" ADT. In C, we use the name pg_uuid_t,
! * to avoid conflicts with any uuid_t type that might be defined by
! * the system headers.
*
* Copyright (c) 2007, PostgreSQL Global Development Group
*
***************
*** 16,27 ****
#define UUID_LEN 16
/* opaque struct; defined in uuid.c */
! typedef struct uuid_t uuid_t;
/* fmgr interface macros */
#define UUIDPGetDatum(X) PointerGetDatum(X)
#define PG_RETURN_UUID_P(X) return UUIDPGetDatum(X)
! #define DatumGetUUIDP(X) ((uuid_t *) DatumGetPointer(X))
#define PG_GETARG_UUID_P(X) DatumGetUUIDP(PG_GETARG_DATUM(X))
#endif /* UUID_H */
--- 18,29 ----
#define UUID_LEN 16
/* opaque struct; defined in uuid.c */
! typedef struct pg_uuid_t pg_uuid_t;
/* fmgr interface macros */
#define UUIDPGetDatum(X) PointerGetDatum(X)
#define PG_RETURN_UUID_P(X) return UUIDPGetDatum(X)
! #define DatumGetUUIDP(X) ((pg_uuid_t *) DatumGetPointer(X))
#define PG_GETARG_UUID_P(X) DatumGetUUIDP(PG_GETARG_DATUM(X))
#endif /* UUID_H */
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq