212 "cancel request is already being sent on this connection");
269 if (n < 0 &&
errno != 0)
409 cancel->pgtcp_user_timeout = -1;
411 cancel->keepalives_idle = -1;
412 cancel->keepalives_interval = -1;
413 cancel->keepalives_count = -1;
417 &
cancel->pgtcp_user_timeout,
418 conn,
"tcp_user_timeout"))
432 conn,
"keepalives_idle"))
438 &
cancel->keepalives_interval,
439 conn,
"keepalives_interval"))
445 &
cancel->keepalives_count,
446 conn,
"keepalives_count"))
514#if defined(TCP_USER_TIMEOUT) || !defined(WIN32)
564 if (
cancel->cancel_pkt_len == 0)
603#ifdef PG_TCP_KEEPALIVE_IDLE
614 cancel->keepalives_interval))
623 cancel->keepalives_count))
632#ifdef SIO_KEEPALIVE_VALS
635 cancel->keepalives_interval))
637 strlcpy(errbuf,
"PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ",
errbufsize);
644#ifdef TCP_USER_TIMEOUT
646 cancel->pgtcp_user_timeout))
648 strlcpy(errbuf,
"PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ",
errbufsize);
673 if (
send(
tmpsock, (
char *) &
cancel->cancel_pkt_len, cancel_pkt_len, 0) != cancel_pkt_len)
764 "PQrequestCancel() -- connection is not open\n",
#define FLEXIBLE_ARRAY_MEMBER
static PGcancel *volatile cancelConn
PGcancel * PQgetCancel(PGconn *conn)
void PQcancelReset(PGcancelConn *cancelConn)
int PQsendCancelRequest(PGconn *cancelConn)
PGcancelConn * PQcancelCreate(PGconn *conn)
ConnStatusType PQcancelStatus(const PGcancelConn *cancelConn)
static bool optional_setsockopt(int fd, int protoid, int optid, int value)
int PQcancelBlocking(PGcancelConn *cancelConn)
int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize)
PostgresPollingStatusType PQcancelPoll(PGcancelConn *cancelConn)
void PQcancelFinish(PGcancelConn *cancelConn)
int PQrequestCancel(PGconn *conn)
void PQfreeCancel(PGcancel *cancel)
int PQcancelSocket(const PGcancelConn *cancelConn)
char * PQcancelErrorMessage(const PGcancelConn *cancelConn)
int PQcancelStart(PGcancelConn *cancelConn)
bool pqConnectOptions2(PGconn *conn)
void pqClosePGconn(PGconn *conn)
PostgresPollingStatusType PQconnectPoll(PGconn *conn)
bool pqParseIntParam(const char *value, int *result, PGconn *conn, const char *context)
void pqReleaseConnHosts(PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
void PQfinish(PGconn *conn)
PGconn * pqMakeEmptyPGconn(void)
int pqConnectDBStart(PGconn *conn)
bool pqCopyPGconn(PGconn *srcConn, PGconn *dstConn)
char * PQerrorMessage(const PGconn *conn)
int PQsocket(const PGconn *conn)
int pqConnectDBComplete(PGconn *conn)
int pqReadData(PGconn *conn)
int pqFlush(PGconn *conn)
int pqPutMsgStart(char msg_type, PGconn *conn)
int pqPutnchar(const void *s, size_t len, PGconn *conn)
int pqPutMsgEnd(PGconn *conn)
@ CONNECTION_AWAITING_RESPONSE
PostgresPollingStatusType
#define SOCK_ERRNO_SET(e)
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
static char buf[DEFAULT_XLOG_SEG_SIZE]
size_t strlcpy(char *dst, const char *src, size_t siz)
#define CANCEL_REQUEST_CODE
void resetPQExpBuffer(PQExpBuffer str)
static int fd(const char *x, int i)
struct sockaddr_storage addr
char cancel_req[FLEXIBLE_ARRAY_MEMBER]
char * keepalives_interval
char * pgtcp_user_timeout
PQExpBufferData errorMessage
#define recv(s, buf, len, flags)
#define send(s, buf, len, flags)
#define socket(af, type, protocol)
#define connect(s, name, namelen)