pgpipe.diff

text/x-patch

Filename: pgpipe.diff
Type: text/x-patch
Part: 0
Message: Re: patch for parallel pg_dump

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/port/pipe.c 0 0
src/include/port/win32.h 0 0
src/port/win32pipe.c 0 0
src/tools/msvc/Mkvcbuild.pm 0 0
diff --git a/src/backend/port/pipe.c b/src/backend/port/pipe.c
index 357f5ec..4ca69c4 100644
*** a/src/backend/port/pipe.c
--- b/src/backend/port/pipe.c
***************
*** 1,13 ****
  /*-------------------------------------------------------------------------
   *
   * pipe.c
!  *	  pipe()
   *
   * Copyright (c) 1996-2012, PostgreSQL Global Development Group
   *
!  *	This is a replacement version of pipe for Win32 which allows
!  *	returned handles to be used in select(). Note that read/write calls
!  *	must be replaced with recv/send.
   *
   * IDENTIFICATION
   *	  src/backend/port/pipe.c
--- 1,14 ----
  /*-------------------------------------------------------------------------
   *
   * pipe.c
!  *	  pgpipe()
!  *    piperead()
   *
   * Copyright (c) 1996-2012, PostgreSQL Global Development Group
   *
!  *	This is a wrapper to call pgwin32_pipe() in Windows and report any
!  *  errors via ereport(LOG, ...). The backend checks the return code and
!  *  can throw a more fatal error if necessary.
   *
   * IDENTIFICATION
   *	  src/backend/port/pipe.c
***************
*** 21,95 ****
  int
  pgpipe(int handles[2])
  {
! 	SOCKET		s;
! 	struct sockaddr_in serv_addr;
! 	int			len = sizeof(serv_addr);
! 
! 	handles[0] = handles[1] = INVALID_SOCKET;
! 
! 	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not create socket: %ui", WSAGetLastError())));
! 		return -1;
! 	}
  
! 	memset((void *) &serv_addr, 0, sizeof(serv_addr));
! 	serv_addr.sin_family = AF_INET;
! 	serv_addr.sin_port = htons(0);
! 	serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
! 	if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not bind: %ui", WSAGetLastError())));
! 		closesocket(s);
! 		return -1;
! 	}
! 	if (listen(s, 1) == SOCKET_ERROR)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not listen: %ui", WSAGetLastError())));
! 		closesocket(s);
! 		return -1;
! 	}
! 	if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not getsockname: %ui", WSAGetLastError())));
! 		closesocket(s);
! 		return -1;
! 	}
! 	if ((handles[1] = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not create socket 2: %ui", WSAGetLastError())));
! 		closesocket(s);
! 		return -1;
! 	}
  
! 	if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not connect socket: %ui", WSAGetLastError())));
! 		closesocket(s);
! 		return -1;
! 	}
! 	if ((handles[0] = accept(s, (SOCKADDR *) &serv_addr, &len)) == INVALID_SOCKET)
! 	{
! 		ereport(LOG, (errmsg_internal("pgpipe could not accept socket: %ui", WSAGetLastError())));
! 		closesocket(handles[1]);
! 		handles[1] = INVALID_SOCKET;
! 		closesocket(s);
! 		return -1;
! 	}
! 	closesocket(s);
! 	return 0;
  }
  
- 
  int
  piperead(int s, char *buf, int len)
  {
! 	int			ret = recv(s, buf, len, 0);
! 
! 	if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
! 		/* EOF on the pipe! (win32 socket based implementation) */
! 		ret = 0;
! 	return ret;
  }
  
  #endif
--- 22,41 ----
  int
  pgpipe(int handles[2])
  {
! 	char	   *error_string;
! 	int			error_code;
! 	int			ret;
  
! 	if ((ret = pgwin32_pipe(handles, &error_string, &error_code)) != 0)
! 		ereport(LOG, (errmsg_internal("%s: %ui", error_string, error_code)));
  
! 	return ret;
  }
  
  int
  piperead(int s, char *buf, int len)
  {
! 	return pgwin32_piperead(s, buf, len);
  }
  
  #endif
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index e2dd23b..166b935 100644
*** a/src/include/port/win32.h
--- b/src/include/port/win32.h
*************** extern int	pgwin32_ReserveSharedMemoryRe
*** 400,405 ****
--- 400,409 ----
  /* in backend/port/win32/crashdump.c */
  extern void pgwin32_install_crashdump_handler(void);
  
+ /* in port/win32pipe.c */
+ int pgwin32_pipe(int handles[2], char **error_string, int *error_code);
+ int pgwin32_piperead(int s, char *buf, int len);
+ 
  /* in port/win32error.c */
  extern void _dosmaperr(unsigned long);
  
diff --git a/src/port/win32pipe.c b/src/port/win32pipe.c
index ...05e1da3 .
*** a/src/port/win32pipe.c
--- b/src/port/win32pipe.c
***************
*** 0 ****
--- 1,99 ----
+ /*-------------------------------------------------------------------------
+  *
+  * win32pipe.c
+  *	  pgwin32_pipe()
+  *
+  * Copyright (c) 1996-2012, PostgreSQL Global Development Group
+  *
+  *	This is a replacement version of pipe for Win32 which allows
+  *	returned handles to be used in select(). Note that read/write calls
+  *	must be replaced with recv/send.
+  *
+  * IDENTIFICATION
+  *	  src/port/win32pipe.c
+  *
+  *-------------------------------------------------------------------------
+  */
+ 
+ #include "postgres.h"
+ 
+ int
+ pgwin32_pipe(int handles[2], char **error_string, int *error_code)
+ {
+ 	SOCKET		s;
+ 	struct sockaddr_in serv_addr;
+ 	int			len = sizeof(serv_addr);
+ 
+ 	handles[0] = handles[1] = INVALID_SOCKET;
+ 
+ 	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not create socket";
+ 		return -1;
+ 	}
+ 
+ 	memset((void *) &serv_addr, 0, sizeof(serv_addr));
+ 	serv_addr.sin_family = AF_INET;
+ 	serv_addr.sin_port = htons(0);
+ 	serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ 	if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not bind";
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 	if (listen(s, 1) == SOCKET_ERROR)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not listen";
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 	if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not getsockname";
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 	if ((handles[1] = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not create socket";
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 
+ 	if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not connect socket";
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 	if ((handles[0] = accept(s, (SOCKADDR *) &serv_addr, &len)) == INVALID_SOCKET)
+ 	{
+ 		*error_code = WSAGetLastError();
+ 		*error_string = "pgwin32_pipe could not accept socket";
+ 		closesocket(handles[1]);
+ 		handles[1] = INVALID_SOCKET;
+ 		closesocket(s);
+ 		return -1;
+ 	}
+ 	closesocket(s);
+ 	return 0;
+ }
+ 
+ 
+ int
+ pgwin32_piperead(int s, char *buf, int len)
+ {
+ 	int			ret = recv(s, buf, len, 0);
+ 
+ 	if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
+ 		/* EOF on the pipe! (win32 socket based implementation) */
+ 		ret = 0;
+ 	return ret;
+ }
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 64ec408..fda79fc 100644
*** a/src/tools/msvc/Mkvcbuild.pm
--- b/src/tools/msvc/Mkvcbuild.pm
*************** sub mkvcbuild
*** 58,64 ****
        erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c
        pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c
        sprompt.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c
!       win32error.c win32setlocale.c);
  
      $libpgport = $solution->AddProject('libpgport','lib','misc');
      $libpgport->AddDefine('FRONTEND');
--- 58,64 ----
        erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c
        pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c
        sprompt.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c
!       win32error.c win32setlocale.c win32pipe.c);
  
      $libpgport = $solution->AddProject('libpgport','lib','misc');
      $libpgport->AddDefine('FRONTEND');