1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-18 12:22:09 +03:00

Provide pg_pread() and pg_pwrite() for random I/O.

Forward to POSIX pread() and pwrite(), or emulate them if unavailable.
The emulation is not perfect as the file position is changed, so
we'll put pg_ prefixes on the names to minimize the risk of confusion
in future patches that might inadvertently try to mix pread() and read()
on the same file descriptor.

Author: Thomas Munro
Reviewed-by: Tom Lane, Jesper Pedersen
Discussion: https://postgr.es/m/CAEepm=02rapCpPR3ZGF2vW=SBHSdFYO_bz_f-wwWJonmA3APgw@mail.gmail.com
This commit is contained in:
Thomas Munro
2018-11-07 09:50:01 +13:00
parent b43df566b3
commit 3fd2a7932e
8 changed files with 168 additions and 0 deletions

55
src/port/pread.c Normal file
View File

@@ -0,0 +1,55 @@
/*-------------------------------------------------------------------------
*
* pread.c
* Implementation of pread(2) for platforms that lack one.
*
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
*
* IDENTIFICATION
* src/port/pread.c
*
* Note that this implementation changes the current file position, unlike
* the POSIX function, so we use the name pg_pread().
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
ssize_t
pg_pread(int fd, void *buf, size_t size, off_t offset)
{
#ifdef WIN32
OVERLAPPED overlapped = {0};
HANDLE handle;
DWORD result;
handle = (HANDLE) _get_osfhandle(fd);
if (handle == INVALID_HANDLE_VALUE)
{
errno = EBADF;
return -1;
}
overlapped.Offset = offset;
if (!ReadFile(handle, buf, size, &result, &overlapped))
{
_dosmaperr(GetLastError());
return -1;
}
return result;
#else
if (lseek(fd, offset, SEEK_SET) < 0)
return -1;
return read(fd, buf, size);
#endif
}