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

Reply via email to