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