PostgreSQL Source Code  git master
libpq-fe.h File Reference
#include <stdio.h>
#include "postgres_ext.h"
Include dependency graph for libpq-fe.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  pgNotify
 
struct  _PQprintOpt
 
struct  _PQconninfoOption
 
struct  PQArgBlock
 
struct  pgresAttDesc
 

Macros

#define LIBPQ_HAS_PIPELINING   1
 
#define LIBPQ_HAS_TRACE_FLAGS   1
 
#define LIBPQ_HAS_SSL_LIBRARY_DETECTION   1
 
#define PG_COPYRES_ATTRS   0x01
 
#define PG_COPYRES_TUPLES   0x02 /* Implies PG_COPYRES_ATTRS */
 
#define PG_COPYRES_EVENTS   0x04
 
#define PG_COPYRES_NOTICEHOOKS   0x08
 
#define PQsetdb(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME)    PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)
 
#define PQTRACE_SUPPRESS_TIMESTAMPS   (1<<0)
 
#define PQTRACE_REGRESS_MODE   (1<<1)
 
#define PQ_QUERY_PARAM_MAX_LIMIT   65535
 
#define PQfreeNotify(ptr)   PQfreemem(ptr)
 
#define PQnoPasswordSupplied   "fe_sendauth: no password supplied\n"
 

Typedefs

typedef struct pg_conn PGconn
 
typedef struct pg_cancel_conn PGcancelConn
 
typedef struct pg_result PGresult
 
typedef struct pg_cancel PGcancel
 
typedef struct pgNotify PGnotify
 
typedef pg_int64 pg_usec_time_t
 
typedef void(* PQnoticeReceiver) (void *arg, const PGresult *res)
 
typedef void(* PQnoticeProcessor) (void *arg, const char *message)
 
typedef char pqbool
 
typedef struct _PQprintOpt PQprintOpt
 
typedef struct _PQconninfoOption PQconninfoOption
 
typedef struct pgresAttDesc PGresAttDesc
 
typedef void(* pgthreadlock_t) (int acquire)
 
typedef int(* PQsslKeyPassHook_OpenSSL_type) (char *buf, int size, PGconn *conn)
 

Enumerations

enum  ConnStatusType {
  CONNECTION_OK , CONNECTION_BAD , CONNECTION_STARTED , CONNECTION_MADE ,
  CONNECTION_AWAITING_RESPONSE , CONNECTION_AUTH_OK , CONNECTION_SETENV , CONNECTION_SSL_STARTUP ,
  CONNECTION_NEEDED , CONNECTION_CHECK_WRITABLE , CONNECTION_CONSUME , CONNECTION_GSS_STARTUP ,
  CONNECTION_CHECK_TARGET , CONNECTION_CHECK_STANDBY , CONNECTION_ALLOCATED
}
 
enum  PostgresPollingStatusType {
  PGRES_POLLING_FAILED = 0 , PGRES_POLLING_READING , PGRES_POLLING_WRITING , PGRES_POLLING_OK ,
  PGRES_POLLING_ACTIVE
}
 
enum  ExecStatusType {
  PGRES_EMPTY_QUERY = 0 , PGRES_COMMAND_OK , PGRES_TUPLES_OK , PGRES_COPY_OUT ,
  PGRES_COPY_IN , PGRES_BAD_RESPONSE , PGRES_NONFATAL_ERROR , PGRES_FATAL_ERROR ,
  PGRES_COPY_BOTH , PGRES_SINGLE_TUPLE , PGRES_PIPELINE_SYNC , PGRES_PIPELINE_ABORTED ,
  PGRES_TUPLES_CHUNK
}
 
enum  PGTransactionStatusType {
  PQTRANS_IDLE , PQTRANS_ACTIVE , PQTRANS_INTRANS , PQTRANS_INERROR ,
  PQTRANS_UNKNOWN
}
 
enum  PGVerbosity { PQERRORS_TERSE , PQERRORS_DEFAULT , PQERRORS_VERBOSE , PQERRORS_SQLSTATE }
 
enum  PGContextVisibility { PQSHOW_CONTEXT_NEVER , PQSHOW_CONTEXT_ERRORS , PQSHOW_CONTEXT_ALWAYS }
 
enum  PGPing { PQPING_OK , PQPING_REJECT , PQPING_NO_RESPONSE , PQPING_NO_ATTEMPT }
 
enum  PGpipelineStatus { PQ_PIPELINE_OFF , PQ_PIPELINE_ON , PQ_PIPELINE_ABORTED }
 

Functions

PGconnPQconnectStart (const char *conninfo)
 
PGconnPQconnectStartParams (const char *const *keywords, const char *const *values, int expand_dbname)
 
PostgresPollingStatusType PQconnectPoll (PGconn *conn)
 
PGconnPQconnectdb (const char *conninfo)
 
PGconnPQconnectdbParams (const char *const *keywords, const char *const *values, int expand_dbname)
 
PGconnPQsetdbLogin (const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd)
 
void PQfinish (PGconn *conn)
 
PQconninfoOptionPQconndefaults (void)
 
PQconninfoOptionPQconninfoParse (const char *conninfo, char **errmsg)
 
PQconninfoOptionPQconninfo (PGconn *conn)
 
void PQconninfoFree (PQconninfoOption *connOptions)
 
int PQresetStart (PGconn *conn)
 
PostgresPollingStatusType PQresetPoll (PGconn *conn)
 
void PQreset (PGconn *conn)
 
PGcancelConnPQcancelCreate (PGconn *conn)
 
int PQcancelStart (PGcancelConn *cancelConn)
 
int PQcancelBlocking (PGcancelConn *cancelConn)
 
PostgresPollingStatusType PQcancelPoll (PGcancelConn *cancelConn)
 
ConnStatusType PQcancelStatus (const PGcancelConn *cancelConn)
 
int PQcancelSocket (const PGcancelConn *cancelConn)
 
char * PQcancelErrorMessage (const PGcancelConn *cancelConn)
 
void PQcancelReset (PGcancelConn *cancelConn)
 
void PQcancelFinish (PGcancelConn *cancelConn)
 
PGcancelPQgetCancel (PGconn *conn)
 
void PQfreeCancel (PGcancel *cancel)
 
int PQcancel (PGcancel *cancel, char *errbuf, int errbufsize)
 
int PQrequestCancel (PGconn *conn)
 
char * PQdb (const PGconn *conn)
 
char * PQuser (const PGconn *conn)
 
char * PQpass (const PGconn *conn)
 
char * PQhost (const PGconn *conn)
 
char * PQhostaddr (const PGconn *conn)
 
char * PQport (const PGconn *conn)
 
char * PQtty (const PGconn *conn)
 
char * PQoptions (const PGconn *conn)
 
ConnStatusType PQstatus (const PGconn *conn)
 
PGTransactionStatusType PQtransactionStatus (const PGconn *conn)
 
const char * PQparameterStatus (const PGconn *conn, const char *paramName)
 
int PQprotocolVersion (const PGconn *conn)
 
int PQserverVersion (const PGconn *conn)
 
char * PQerrorMessage (const PGconn *conn)
 
int PQsocket (const PGconn *conn)
 
int PQbackendPID (const PGconn *conn)
 
PGpipelineStatus PQpipelineStatus (const PGconn *conn)
 
int PQconnectionNeedsPassword (const PGconn *conn)
 
int PQconnectionUsedPassword (const PGconn *conn)
 
int PQconnectionUsedGSSAPI (const PGconn *conn)
 
int PQclientEncoding (const PGconn *conn)
 
int PQsetClientEncoding (PGconn *conn, const char *encoding)
 
int PQsslInUse (PGconn *conn)
 
void * PQsslStruct (PGconn *conn, const char *struct_name)
 
const char * PQsslAttribute (PGconn *conn, const char *attribute_name)
 
const char *const * PQsslAttributeNames (PGconn *conn)
 
void * PQgetssl (PGconn *conn)
 
void PQinitSSL (int do_init)
 
void PQinitOpenSSL (int do_ssl, int do_crypto)
 
int PQgssEncInUse (PGconn *conn)
 
void * PQgetgssctx (PGconn *conn)
 
PGVerbosity PQsetErrorVerbosity (PGconn *conn, PGVerbosity verbosity)
 
PGContextVisibility PQsetErrorContextVisibility (PGconn *conn, PGContextVisibility show_context)
 
PQnoticeReceiver PQsetNoticeReceiver (PGconn *conn, PQnoticeReceiver proc, void *arg)
 
PQnoticeProcessor PQsetNoticeProcessor (PGconn *conn, PQnoticeProcessor proc, void *arg)
 
pgthreadlock_t PQregisterThreadLock (pgthreadlock_t newhandler)
 
void PQtrace (PGconn *conn, FILE *debug_port)
 
void PQuntrace (PGconn *conn)
 
void PQsetTraceFlags (PGconn *conn, int flags)
 
PGresultPQexec (PGconn *conn, const char *query)
 
PGresultPQexecParams (PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
 
PGresultPQprepare (PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
 
PGresultPQexecPrepared (PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
 
int PQsendQuery (PGconn *conn, const char *query)
 
int PQsendQueryParams (PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
 
int PQsendPrepare (PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
 
int PQsendQueryPrepared (PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
 
int PQsetSingleRowMode (PGconn *conn)
 
int PQsetChunkedRowsMode (PGconn *conn, int chunkSize)
 
PGresultPQgetResult (PGconn *conn)
 
int PQisBusy (PGconn *conn)
 
int PQconsumeInput (PGconn *conn)
 
int PQenterPipelineMode (PGconn *conn)
 
int PQexitPipelineMode (PGconn *conn)
 
int PQpipelineSync (PGconn *conn)
 
int PQsendFlushRequest (PGconn *conn)
 
int PQsendPipelineSync (PGconn *conn)
 
PGnotifyPQnotifies (PGconn *conn)
 
int PQputCopyData (PGconn *conn, const char *buffer, int nbytes)
 
int PQputCopyEnd (PGconn *conn, const char *errormsg)
 
int PQgetCopyData (PGconn *conn, char **buffer, int async)
 
int PQgetline (PGconn *conn, char *buffer, int length)
 
int PQputline (PGconn *conn, const char *string)
 
int PQgetlineAsync (PGconn *conn, char *buffer, int bufsize)
 
int PQputnbytes (PGconn *conn, const char *buffer, int nbytes)
 
int PQendcopy (PGconn *conn)
 
int PQsetnonblocking (PGconn *conn, int arg)
 
int PQisnonblocking (const PGconn *conn)
 
int PQisthreadsafe (void)
 
PGPing PQping (const char *conninfo)
 
PGPing PQpingParams (const char *const *keywords, const char *const *values, int expand_dbname)
 
int PQflush (PGconn *conn)
 
PGresultPQfn (PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs)
 
ExecStatusType PQresultStatus (const PGresult *res)
 
char * PQresStatus (ExecStatusType status)
 
char * PQresultErrorMessage (const PGresult *res)
 
char * PQresultVerboseErrorMessage (const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context)
 
char * PQresultErrorField (const PGresult *res, int fieldcode)
 
int PQntuples (const PGresult *res)
 
int PQnfields (const PGresult *res)
 
int PQbinaryTuples (const PGresult *res)
 
char * PQfname (const PGresult *res, int field_num)
 
int PQfnumber (const PGresult *res, const char *field_name)
 
Oid PQftable (const PGresult *res, int field_num)
 
int PQftablecol (const PGresult *res, int field_num)
 
int PQfformat (const PGresult *res, int field_num)
 
Oid PQftype (const PGresult *res, int field_num)
 
int PQfsize (const PGresult *res, int field_num)
 
int PQfmod (const PGresult *res, int field_num)
 
char * PQcmdStatus (PGresult *res)
 
char * PQoidStatus (const PGresult *res)
 
Oid PQoidValue (const PGresult *res)
 
char * PQcmdTuples (PGresult *res)
 
char * PQgetvalue (const PGresult *res, int tup_num, int field_num)
 
int PQgetlength (const PGresult *res, int tup_num, int field_num)
 
int PQgetisnull (const PGresult *res, int tup_num, int field_num)
 
int PQnparams (const PGresult *res)
 
Oid PQparamtype (const PGresult *res, int param_num)
 
PGresultPQdescribePrepared (PGconn *conn, const char *stmt)
 
PGresultPQdescribePortal (PGconn *conn, const char *portal)
 
int PQsendDescribePrepared (PGconn *conn, const char *stmt)
 
int PQsendDescribePortal (PGconn *conn, const char *portal)
 
PGresultPQclosePrepared (PGconn *conn, const char *stmt)
 
PGresultPQclosePortal (PGconn *conn, const char *portal)
 
int PQsendClosePrepared (PGconn *conn, const char *stmt)
 
int PQsendClosePortal (PGconn *conn, const char *portal)
 
void PQclear (PGresult *res)
 
void PQfreemem (void *ptr)
 
PGresultPQmakeEmptyPGresult (PGconn *conn, ExecStatusType status)
 
PGresultPQcopyResult (const PGresult *src, int flags)
 
int PQsetResultAttrs (PGresult *res, int numAttributes, PGresAttDesc *attDescs)
 
void * PQresultAlloc (PGresult *res, size_t nBytes)
 
size_t PQresultMemorySize (const PGresult *res)
 
int PQsetvalue (PGresult *res, int tup_num, int field_num, char *value, int len)
 
size_t PQescapeStringConn (PGconn *conn, char *to, const char *from, size_t length, int *error)
 
char * PQescapeLiteral (PGconn *conn, const char *str, size_t len)
 
char * PQescapeIdentifier (PGconn *conn, const char *str, size_t len)
 
unsigned char * PQescapeByteaConn (PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length)
 
unsigned char * PQunescapeBytea (const unsigned char *strtext, size_t *retbuflen)
 
size_t PQescapeString (char *to, const char *from, size_t length)
 
unsigned char * PQescapeBytea (const unsigned char *from, size_t from_length, size_t *to_length)
 
void PQprint (FILE *fout, const PGresult *res, const PQprintOpt *po)
 
void PQdisplayTuples (const PGresult *res, FILE *fp, int fillAlign, const char *fieldSep, int printHeader, int quiet)
 
void PQprintTuples (const PGresult *res, FILE *fout, int PrintAttNames, int TerseOutput, int colWidth)
 
int lo_open (PGconn *conn, Oid lobjId, int mode)
 
int lo_close (PGconn *conn, int fd)
 
int lo_read (PGconn *conn, int fd, char *buf, size_t len)
 
int lo_write (PGconn *conn, int fd, const char *buf, size_t len)
 
int lo_lseek (PGconn *conn, int fd, int offset, int whence)
 
pg_int64 lo_lseek64 (PGconn *conn, int fd, pg_int64 offset, int whence)
 
Oid lo_creat (PGconn *conn, int mode)
 
Oid lo_create (PGconn *conn, Oid lobjId)
 
int lo_tell (PGconn *conn, int fd)
 
pg_int64 lo_tell64 (PGconn *conn, int fd)
 
int lo_truncate (PGconn *conn, int fd, size_t len)
 
int lo_truncate64 (PGconn *conn, int fd, pg_int64 len)
 
int lo_unlink (PGconn *conn, Oid lobjId)
 
Oid lo_import (PGconn *conn, const char *filename)
 
Oid lo_import_with_oid (PGconn *conn, const char *filename, Oid lobjId)
 
int lo_export (PGconn *conn, Oid lobjId, const char *filename)
 
int PQlibVersion (void)
 
int PQsocketPoll (int sock, int forRead, int forWrite, pg_usec_time_t end_time)
 
pg_usec_time_t PQgetCurrentTimeUSec (void)
 
int PQmblen (const char *s, int encoding)
 
int PQmblenBounded (const char *s, int encoding)
 
int PQdsplen (const char *s, int encoding)
 
int PQenv2encoding (void)
 
char * PQencryptPassword (const char *passwd, const char *user)
 
char * PQencryptPasswordConn (PGconn *conn, const char *passwd, const char *user, const char *algorithm)
 
PGresultPQchangePassword (PGconn *conn, const char *user, const char *passwd)
 
int pg_char_to_encoding (const char *name)
 
const char * pg_encoding_to_char (int encoding)
 
int pg_valid_server_encoding_id (int encoding)
 
PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL (void)
 
void PQsetSSLKeyPassHook_OpenSSL (PQsslKeyPassHook_OpenSSL_type hook)
 
int PQdefaultSSLKeyPassHook_OpenSSL (char *buf, int size, PGconn *conn)
 

Macro Definition Documentation

◆ LIBPQ_HAS_PIPELINING

#define LIBPQ_HAS_PIPELINING   1

Definition at line 36 of file libpq-fe.h.

◆ LIBPQ_HAS_SSL_LIBRARY_DETECTION

#define LIBPQ_HAS_SSL_LIBRARY_DETECTION   1

Definition at line 40 of file libpq-fe.h.

◆ LIBPQ_HAS_TRACE_FLAGS

#define LIBPQ_HAS_TRACE_FLAGS   1

Definition at line 38 of file libpq-fe.h.

◆ PG_COPYRES_ATTRS

#define PG_COPYRES_ATTRS   0x01

Definition at line 45 of file libpq-fe.h.

◆ PG_COPYRES_EVENTS

#define PG_COPYRES_EVENTS   0x04

Definition at line 47 of file libpq-fe.h.

◆ PG_COPYRES_NOTICEHOOKS

#define PG_COPYRES_NOTICEHOOKS   0x08

Definition at line 48 of file libpq-fe.h.

◆ PG_COPYRES_TUPLES

#define PG_COPYRES_TUPLES   0x02 /* Implies PG_COPYRES_ATTRS */

Definition at line 46 of file libpq-fe.h.

◆ PQ_QUERY_PARAM_MAX_LIMIT

#define PQ_QUERY_PARAM_MAX_LIMIT   65535

Definition at line 473 of file libpq-fe.h.

◆ PQfreeNotify

#define PQfreeNotify (   ptr)    PQfreemem(ptr)

Definition at line 595 of file libpq-fe.h.

◆ PQnoPasswordSupplied

#define PQnoPasswordSupplied   "fe_sendauth: no password supplied\n"

Definition at line 599 of file libpq-fe.h.

◆ PQsetdb

#define PQsetdb (   M_PGHOST,
  M_PGPORT,
  M_PGOPT,
  M_PGTTY,
  M_DBNAME 
)     PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)

Definition at line 306 of file libpq-fe.h.

◆ PQTRACE_REGRESS_MODE

#define PQTRACE_REGRESS_MODE   (1<<1)

Definition at line 446 of file libpq-fe.h.

◆ PQTRACE_SUPPRESS_TIMESTAMPS

#define PQTRACE_SUPPRESS_TIMESTAMPS   (1<<0)

Definition at line 444 of file libpq-fe.h.

Typedef Documentation

◆ pg_usec_time_t

Definition at line 205 of file libpq-fe.h.

◆ PGcancel

typedef struct pg_cancel PGcancel

Definition at line 1 of file libpq-fe.h.

◆ PGcancelConn

typedef struct pg_cancel_conn PGcancelConn

Definition at line 1 of file libpq-fe.h.

◆ PGconn

typedef struct pg_conn PGconn

Definition at line 1 of file libpq-fe.h.

◆ PGnotify

typedef struct pgNotify PGnotify

◆ PGresAttDesc

typedef struct pgresAttDesc PGresAttDesc

◆ PGresult

typedef struct pg_result PGresult

Definition at line 1 of file libpq-fe.h.

◆ pgthreadlock_t

typedef void(* pgthreadlock_t) (int acquire)

Definition at line 434 of file libpq-fe.h.

◆ pqbool

typedef char pqbool

Definition at line 212 of file libpq-fe.h.

◆ PQconninfoOption

◆ PQnoticeProcessor

typedef void(* PQnoticeProcessor) (void *arg, const char *message)

Definition at line 209 of file libpq-fe.h.

◆ PQnoticeReceiver

typedef void(* PQnoticeReceiver) (void *arg, const PGresult *res)

Definition at line 208 of file libpq-fe.h.

◆ PQprintOpt

typedef struct _PQprintOpt PQprintOpt

◆ PQsslKeyPassHook_OpenSSL_type

typedef int(* PQsslKeyPassHook_OpenSSL_type) (char *buf, int size, PGconn *conn)

Definition at line 711 of file libpq-fe.h.

Enumeration Type Documentation

◆ ConnStatusType

Enumerator
CONNECTION_OK 
CONNECTION_BAD 
CONNECTION_STARTED 
CONNECTION_MADE 
CONNECTION_AWAITING_RESPONSE 
CONNECTION_AUTH_OK 
CONNECTION_SETENV 
CONNECTION_SSL_STARTUP 
CONNECTION_NEEDED 
CONNECTION_CHECK_WRITABLE 
CONNECTION_CONSUME 
CONNECTION_GSS_STARTUP 
CONNECTION_CHECK_TARGET 
CONNECTION_CHECK_STANDBY 
CONNECTION_ALLOCATED 

Definition at line 58 of file libpq-fe.h.

59 {
62  /* Non-blocking mode only below here */
63 
64  /*
65  * The existence of these should never be relied upon - they should only
66  * be used for user feedback or similar purposes.
67  */
68  CONNECTION_STARTED, /* Waiting for connection to be made. */
69  CONNECTION_MADE, /* Connection OK; waiting to send. */
70  CONNECTION_AWAITING_RESPONSE, /* Waiting for a response from the
71  * postmaster. */
72  CONNECTION_AUTH_OK, /* Received authentication; waiting for
73  * backend startup. */
74  CONNECTION_SETENV, /* This state is no longer used. */
75  CONNECTION_SSL_STARTUP, /* Performing SSL handshake. */
76  CONNECTION_NEEDED, /* Internal state: connect() needed. */
77  CONNECTION_CHECK_WRITABLE, /* Checking if session is read-write. */
78  CONNECTION_CONSUME, /* Consuming any extra messages. */
79  CONNECTION_GSS_STARTUP, /* Negotiating GSSAPI. */
80  CONNECTION_CHECK_TARGET, /* Internal state: checking target server
81  * properties. */
82  CONNECTION_CHECK_STANDBY, /* Checking if server is in standby mode. */
83  CONNECTION_ALLOCATED, /* Waiting for connection attempt to be
84  * started. */
ConnStatusType
Definition: libpq-fe.h:59
@ CONNECTION_CONSUME
Definition: libpq-fe.h:78
@ CONNECTION_CHECK_STANDBY
Definition: libpq-fe.h:82
@ CONNECTION_STARTED
Definition: libpq-fe.h:68
@ CONNECTION_AWAITING_RESPONSE
Definition: libpq-fe.h:70
@ CONNECTION_MADE
Definition: libpq-fe.h:69
@ CONNECTION_CHECK_WRITABLE
Definition: libpq-fe.h:77
@ CONNECTION_BAD
Definition: libpq-fe.h:61
@ CONNECTION_OK
Definition: libpq-fe.h:60
@ CONNECTION_GSS_STARTUP
Definition: libpq-fe.h:79
@ CONNECTION_ALLOCATED
Definition: libpq-fe.h:83
@ CONNECTION_SSL_STARTUP
Definition: libpq-fe.h:75
@ CONNECTION_AUTH_OK
Definition: libpq-fe.h:72
@ CONNECTION_CHECK_TARGET
Definition: libpq-fe.h:80
@ CONNECTION_NEEDED
Definition: libpq-fe.h:76
@ CONNECTION_SETENV
Definition: libpq-fe.h:74

◆ ExecStatusType

Enumerator
PGRES_EMPTY_QUERY 
PGRES_COMMAND_OK 
PGRES_TUPLES_OK 
PGRES_COPY_OUT 
PGRES_COPY_IN 
PGRES_BAD_RESPONSE 
PGRES_NONFATAL_ERROR 
PGRES_FATAL_ERROR 
PGRES_COPY_BOTH 
PGRES_SINGLE_TUPLE 
PGRES_PIPELINE_SYNC 
PGRES_PIPELINE_ABORTED 
PGRES_TUPLES_CHUNK 

Definition at line 96 of file libpq-fe.h.

97 {
98  PGRES_EMPTY_QUERY = 0, /* empty query string was executed */
99  PGRES_COMMAND_OK, /* a query command that doesn't return
100  * anything was executed properly by the
101  * backend */
102  PGRES_TUPLES_OK, /* a query command that returns tuples was
103  * executed properly by the backend, PGresult
104  * contains the result tuples */
105  PGRES_COPY_OUT, /* Copy Out data transfer in progress */
106  PGRES_COPY_IN, /* Copy In data transfer in progress */
107  PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from the
108  * backend */
109  PGRES_NONFATAL_ERROR, /* notice or warning message */
110  PGRES_FATAL_ERROR, /* query failed */
111  PGRES_COPY_BOTH, /* Copy In/Out data transfer in progress */
112  PGRES_SINGLE_TUPLE, /* single tuple from larger resultset */
113  PGRES_PIPELINE_SYNC, /* pipeline synchronization point */
114  PGRES_PIPELINE_ABORTED, /* Command didn't run because of an abort
115  * earlier in a pipeline */
116  PGRES_TUPLES_CHUNK /* chunk of tuples from larger resultset */
ExecStatusType
Definition: libpq-fe.h:97
@ PGRES_COPY_IN
Definition: libpq-fe.h:106
@ PGRES_COPY_BOTH
Definition: libpq-fe.h:111
@ PGRES_COMMAND_OK
Definition: libpq-fe.h:99
@ PGRES_TUPLES_CHUNK
Definition: libpq-fe.h:116
@ PGRES_FATAL_ERROR
Definition: libpq-fe.h:110
@ PGRES_SINGLE_TUPLE
Definition: libpq-fe.h:112
@ PGRES_COPY_OUT
Definition: libpq-fe.h:105
@ PGRES_EMPTY_QUERY
Definition: libpq-fe.h:98
@ PGRES_PIPELINE_SYNC
Definition: libpq-fe.h:113
@ PGRES_BAD_RESPONSE
Definition: libpq-fe.h:107
@ PGRES_PIPELINE_ABORTED
Definition: libpq-fe.h:114
@ PGRES_NONFATAL_ERROR
Definition: libpq-fe.h:109
@ PGRES_TUPLES_OK
Definition: libpq-fe.h:102

◆ PGContextVisibility

Enumerator
PQSHOW_CONTEXT_NEVER 
PQSHOW_CONTEXT_ERRORS 
PQSHOW_CONTEXT_ALWAYS 

Definition at line 136 of file libpq-fe.h.

137 {
138  PQSHOW_CONTEXT_NEVER, /* never show CONTEXT field */
139  PQSHOW_CONTEXT_ERRORS, /* show CONTEXT for errors only (default) */
140  PQSHOW_CONTEXT_ALWAYS /* always show CONTEXT field */
PGContextVisibility
Definition: libpq-fe.h:137
@ PQSHOW_CONTEXT_NEVER
Definition: libpq-fe.h:138
@ PQSHOW_CONTEXT_ALWAYS
Definition: libpq-fe.h:140
@ PQSHOW_CONTEXT_ERRORS
Definition: libpq-fe.h:139

◆ PGPing

enum PGPing
Enumerator
PQPING_OK 
PQPING_REJECT 
PQPING_NO_RESPONSE 
PQPING_NO_ATTEMPT 

Definition at line 148 of file libpq-fe.h.

149 {
150  PQPING_OK, /* server is accepting connections */
151  PQPING_REJECT, /* server is alive but rejecting connections */
152  PQPING_NO_RESPONSE, /* could not establish connection */
153  PQPING_NO_ATTEMPT /* connection not attempted (bad params) */
154 } PGPing;
PGPing
Definition: libpq-fe.h:149
@ PQPING_OK
Definition: libpq-fe.h:150
@ PQPING_REJECT
Definition: libpq-fe.h:151
@ PQPING_NO_RESPONSE
Definition: libpq-fe.h:152
@ PQPING_NO_ATTEMPT
Definition: libpq-fe.h:153

◆ PGpipelineStatus

Enumerator
PQ_PIPELINE_OFF 
PQ_PIPELINE_ON 
PQ_PIPELINE_ABORTED 

Definition at line 159 of file libpq-fe.h.

160 {
PGpipelineStatus
Definition: libpq-fe.h:160
@ PQ_PIPELINE_OFF
Definition: libpq-fe.h:161
@ PQ_PIPELINE_ABORTED
Definition: libpq-fe.h:163
@ PQ_PIPELINE_ON
Definition: libpq-fe.h:162

◆ PGTransactionStatusType

Enumerator
PQTRANS_IDLE 
PQTRANS_ACTIVE 
PQTRANS_INTRANS 
PQTRANS_INERROR 
PQTRANS_UNKNOWN 

Definition at line 119 of file libpq-fe.h.

120 {
121  PQTRANS_IDLE, /* connection idle */
122  PQTRANS_ACTIVE, /* command in progress */
123  PQTRANS_INTRANS, /* idle, within transaction block */
124  PQTRANS_INERROR, /* idle, within failed transaction */
125  PQTRANS_UNKNOWN /* cannot determine status */
PGTransactionStatusType
Definition: libpq-fe.h:120
@ PQTRANS_INTRANS
Definition: libpq-fe.h:123
@ PQTRANS_IDLE
Definition: libpq-fe.h:121
@ PQTRANS_ACTIVE
Definition: libpq-fe.h:122
@ PQTRANS_UNKNOWN
Definition: libpq-fe.h:125
@ PQTRANS_INERROR
Definition: libpq-fe.h:124

◆ PGVerbosity

Enumerator
PQERRORS_TERSE 
PQERRORS_DEFAULT 
PQERRORS_VERBOSE 
PQERRORS_SQLSTATE 

Definition at line 128 of file libpq-fe.h.

129 {
130  PQERRORS_TERSE, /* single-line error messages */
131  PQERRORS_DEFAULT, /* recommended style */
132  PQERRORS_VERBOSE, /* all the facts, ma'am */
133  PQERRORS_SQLSTATE /* only error severity and SQLSTATE code */
134 } PGVerbosity;
PGVerbosity
Definition: libpq-fe.h:129
@ PQERRORS_VERBOSE
Definition: libpq-fe.h:132
@ PQERRORS_DEFAULT
Definition: libpq-fe.h:131
@ PQERRORS_TERSE
Definition: libpq-fe.h:130
@ PQERRORS_SQLSTATE
Definition: libpq-fe.h:133

◆ PostgresPollingStatusType

Enumerator
PGRES_POLLING_FAILED 
PGRES_POLLING_READING 
PGRES_POLLING_WRITING 
PGRES_POLLING_OK 
PGRES_POLLING_ACTIVE 

Definition at line 87 of file libpq-fe.h.

88 {
90  PGRES_POLLING_READING, /* These two indicate that one may */
91  PGRES_POLLING_WRITING, /* use select before polling again. */
93  PGRES_POLLING_ACTIVE /* unused; keep for backwards compatibility */
PostgresPollingStatusType
Definition: libpq-fe.h:88
@ PGRES_POLLING_ACTIVE
Definition: libpq-fe.h:93
@ PGRES_POLLING_OK
Definition: libpq-fe.h:92
@ PGRES_POLLING_READING
Definition: libpq-fe.h:90
@ PGRES_POLLING_WRITING
Definition: libpq-fe.h:91
@ PGRES_POLLING_FAILED
Definition: libpq-fe.h:89

Function Documentation

◆ lo_close()

int lo_close ( PGconn conn,
int  fd 
)

Definition at line 96 of file fe-lobj.c.

97 {
98  PQArgBlock argv[1];
99  PGresult *res;
100  int retval;
101  int result_len;
102 
103  if (lo_initialize(conn) < 0)
104  return -1;
105 
106  argv[0].isint = 1;
107  argv[0].len = 4;
108  argv[0].u.integer = fd;
110  &retval, &result_len, 1, argv, 1);
112  {
113  PQclear(res);
114  return retval;
115  }
116  else
117  {
118  PQclear(res);
119  return -1;
120  }
121 }
PGresult * PQfn(PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs)
Definition: fe-exec.c:2980
ExecStatusType PQresultStatus(const PGresult *res)
Definition: fe-exec.c:3411
static int lo_initialize(PGconn *conn)
Definition: fe-lobj.c:843
static int fd(const char *x, int i)
Definition: preproc-init.c:105
PGconn * conn
Definition: streamutil.c:55
int isint
Definition: libpq-fe.h:260
int integer
Definition: libpq-fe.h:264
union PQArgBlock::@178 u
Oid fn_lo_close
Definition: libpq-int.h:287
PGlobjfuncs * lobjfuncs
Definition: libpq-int.h:517

References conn, fd(), pgLobjfuncs::fn_lo_close, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by dumpLOs(), EndRestoreLO(), exportFile(), importFile(), lo_export(), lo_import_internal(), my_truncate(), overwrite(), and pickout().

◆ lo_creat()

Oid lo_creat ( PGconn conn,
int  mode 
)

Definition at line 438 of file fe-lobj.c.

439 {
440  PQArgBlock argv[1];
441  PGresult *res;
442  int retval;
443  int result_len;
444 
445  if (lo_initialize(conn) < 0)
446  return InvalidOid;
447 
448  argv[0].isint = 1;
449  argv[0].len = 4;
450  argv[0].u.integer = mode;
452  &retval, &result_len, 1, argv, 1);
454  {
455  PQclear(res);
456  return (Oid) retval;
457  }
458  else
459  {
460  PQclear(res);
461  return InvalidOid;
462  }
463 }
static PgChecksumMode mode
Definition: pg_checksums.c:56
#define InvalidOid
Definition: postgres_ext.h:36
unsigned int Oid
Definition: postgres_ext.h:31
Oid fn_lo_creat
Definition: libpq-int.h:288

References conn, pgLobjfuncs::fn_lo_creat, PQArgBlock::integer, InvalidOid, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, mode, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by importFile(), and lo_import_internal().

◆ lo_create()

Oid lo_create ( PGconn conn,
Oid  lobjId 
)

Definition at line 474 of file fe-lobj.c.

475 {
476  PQArgBlock argv[1];
477  PGresult *res;
478  int retval;
479  int result_len;
480 
481  if (lo_initialize(conn) < 0)
482  return InvalidOid;
483 
484  /* Must check this on-the-fly because it's not there pre-8.1 */
485  if (conn->lobjfuncs->fn_lo_create == 0)
486  {
487  libpq_append_conn_error(conn, "cannot determine OID of function %s",
488  "lo_create");
489  return InvalidOid;
490  }
491 
492  argv[0].isint = 1;
493  argv[0].len = 4;
494  argv[0].u.integer = lobjId;
496  &retval, &result_len, 1, argv, 1);
498  {
499  PQclear(res);
500  return (Oid) retval;
501  }
502  else
503  {
504  PQclear(res);
505  return InvalidOid;
506  }
507 }
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
Definition: fe-misc.c:1357
Oid fn_lo_create
Definition: libpq-int.h:289

References conn, pgLobjfuncs::fn_lo_create, PQArgBlock::integer, InvalidOid, PQArgBlock::isint, PQArgBlock::len, libpq_append_conn_error(), lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by lo_import_internal(), and StartRestoreLO().

◆ lo_export()

int lo_export ( PGconn conn,
Oid  lobjId,
const char *  filename 
)

Definition at line 748 of file fe-lobj.c.

749 {
750  int result = 1;
751  int fd;
752  int nbytes,
753  tmp;
754  char buf[LO_BUFSIZE];
755  int lobj;
756  char sebuf[PG_STRERROR_R_BUFLEN];
757 
758  /*
759  * open the large object.
760  */
761  lobj = lo_open(conn, lobjId, INV_READ);
762  if (lobj == -1)
763  {
764  /* we assume lo_open() already set a suitable error message */
765  return -1;
766  }
767 
768  /*
769  * create the file to be written to
770  */
771  fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY, 0666);
772  if (fd < 0)
773  {
774  /* We must do lo_close before setting the errorMessage */
775  int save_errno = errno;
776 
777  (void) lo_close(conn, lobj);
778  /* deliberately overwrite any error from lo_close */
780  libpq_append_conn_error(conn, "could not open file \"%s\": %s",
781  filename,
782  strerror_r(save_errno, sebuf, sizeof(sebuf)));
783  return -1;
784  }
785 
786  /*
787  * read in from the large object and write to the file
788  */
789  while ((nbytes = lo_read(conn, lobj, buf, LO_BUFSIZE)) > 0)
790  {
791  tmp = write(fd, buf, nbytes);
792  if (tmp != nbytes)
793  {
794  /* We must do lo_close before setting the errorMessage */
795  int save_errno = errno;
796 
797  (void) lo_close(conn, lobj);
798  (void) close(fd);
799  /* deliberately overwrite any error from lo_close */
801  libpq_append_conn_error(conn, "could not write to file \"%s\": %s",
802  filename,
803  strerror_r(save_errno, sebuf, sizeof(sebuf)));
804  return -1;
805  }
806  }
807 
808  /*
809  * If lo_read() failed, we are now in an aborted transaction so there's no
810  * need for lo_close(); furthermore, if we tried it we'd overwrite the
811  * useful error result with a useless one. So skip lo_close() if we got a
812  * failure result.
813  */
814  if (nbytes < 0 ||
815  lo_close(conn, lobj) != 0)
816  {
817  /* assume lo_read() or lo_close() left a suitable error message */
818  result = -1;
819  }
820 
821  /* if we already failed, don't overwrite that msg with a close error */
822  if (close(fd) != 0 && result >= 0)
823  {
824  libpq_append_conn_error(conn, "could not write to file \"%s\": %s",
825  filename, strerror_r(errno, sebuf, sizeof(sebuf)));
826  result = -1;
827  }
828 
829  return result;
830 }
#define PG_BINARY
Definition: c.h:1273
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:96
#define LO_BUFSIZE
Definition: fe-lobj.c:42
int lo_read(PGconn *conn, int fd, char *buf, size_t len)
Definition: fe-lobj.c:245
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
#define close(a)
Definition: win32.h:12
#define write(a, b, c)
Definition: win32.h:14
#define INV_READ
Definition: libpq-fs.h:22
#define pqClearConnErrorState(conn)
Definition: libpq-int.h:884
static char * filename
Definition: pg_dumpall.c:119
static char * buf
Definition: pg_test_fsync.c:73
#define PG_STRERROR_R_BUFLEN
Definition: port.h:256
#define strerror_r
Definition: port.h:255

References buf, close, conn, fd(), filename, INV_READ, libpq_append_conn_error(), LO_BUFSIZE, lo_close(), lo_open(), lo_read(), PG_BINARY, PG_STRERROR_R_BUFLEN, pqClearConnErrorState, strerror_r, and write.

Referenced by do_lo_export(), and main().

◆ lo_import()

Oid lo_import ( PGconn conn,
const char *  filename 
)

Definition at line 626 of file fe-lobj.c.

627 {
629 }
static Oid lo_import_internal(PGconn *conn, const char *filename, Oid oid)
Definition: fe-lobj.c:647

References conn, filename, InvalidOid, and lo_import_internal().

Referenced by do_lo_import(), and main().

◆ lo_import_with_oid()

Oid lo_import_with_oid ( PGconn conn,
const char *  filename,
Oid  lobjId 
)

Definition at line 641 of file fe-lobj.c.

642 {
643  return lo_import_internal(conn, filename, lobjId);
644 }

References conn, filename, and lo_import_internal().

◆ lo_lseek()

int lo_lseek ( PGconn conn,
int  fd,
int  offset,
int  whence 
)

Definition at line 344 of file fe-lobj.c.

345 {
346  PQArgBlock argv[3];
347  PGresult *res;
348  int retval;
349  int result_len;
350 
351  if (lo_initialize(conn) < 0)
352  return -1;
353 
354  argv[0].isint = 1;
355  argv[0].len = 4;
356  argv[0].u.integer = fd;
357 
358  argv[1].isint = 1;
359  argv[1].len = 4;
360  argv[1].u.integer = offset;
361 
362  argv[2].isint = 1;
363  argv[2].len = 4;
364  argv[2].u.integer = whence;
365 
367  &retval, &result_len, 1, argv, 3);
369  {
370  PQclear(res);
371  return retval;
372  }
373  else
374  {
375  PQclear(res);
376  return -1;
377  }
378 }
Oid fn_lo_lseek
Definition: libpq-int.h:291

References conn, fd(), pgLobjfuncs::fn_lo_lseek, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by overwrite(), and pickout().

◆ lo_lseek64()

pg_int64 lo_lseek64 ( PGconn conn,
int  fd,
pg_int64  offset,
int  whence 
)

Definition at line 385 of file fe-lobj.c.

386 {
387  PQArgBlock argv[3];
388  PGresult *res;
389  pg_int64 retval;
390  int result_len;
391 
392  if (lo_initialize(conn) < 0)
393  return -1;
394 
395  if (conn->lobjfuncs->fn_lo_lseek64 == 0)
396  {
397  libpq_append_conn_error(conn, "cannot determine OID of function %s",
398  "lo_lseek64");
399  return -1;
400  }
401 
402  argv[0].isint = 1;
403  argv[0].len = 4;
404  argv[0].u.integer = fd;
405 
406  offset = lo_hton64(offset);
407  argv[1].isint = 0;
408  argv[1].len = 8;
409  argv[1].u.ptr = (int *) &offset;
410 
411  argv[2].isint = 1;
412  argv[2].len = 4;
413  argv[2].u.integer = whence;
414 
416  (void *) &retval, &result_len, 0, argv, 3);
417  if (PQresultStatus(res) == PGRES_COMMAND_OK && result_len == 8)
418  {
419  PQclear(res);
420  return lo_ntoh64(retval);
421  }
422  else
423  {
424  PQclear(res);
425  return -1;
426  }
427 }
static pg_int64 lo_ntoh64(pg_int64 net64)
Definition: fe-lobj.c:1048
static pg_int64 lo_hton64(pg_int64 host64)
Definition: fe-lobj.c:1023
PG_INT64_TYPE pg_int64
Definition: postgres_ext.h:47
int * ptr
Definition: libpq-fe.h:263
Oid fn_lo_lseek64
Definition: libpq-int.h:292

References conn, fd(), pgLobjfuncs::fn_lo_lseek64, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, libpq_append_conn_error(), lo_hton64(), lo_initialize(), lo_ntoh64(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), PQArgBlock::ptr, res, and PQArgBlock::u.

Referenced by overwrite(), and pickout().

◆ lo_open()

int lo_open ( PGconn conn,
Oid  lobjId,
int  mode 
)

Definition at line 57 of file fe-lobj.c.

58 {
59  int fd;
60  int result_len;
61  PQArgBlock argv[2];
62  PGresult *res;
63 
64  if (lo_initialize(conn) < 0)
65  return -1;
66 
67  argv[0].isint = 1;
68  argv[0].len = 4;
69  argv[0].u.integer = lobjId;
70 
71  argv[1].isint = 1;
72  argv[1].len = 4;
73  argv[1].u.integer = mode;
74 
75  res = PQfn(conn, conn->lobjfuncs->fn_lo_open, &fd, &result_len, 1, argv, 2);
77  {
78  PQclear(res);
79  return fd;
80  }
81  else
82  {
83  PQclear(res);
84  return -1;
85  }
86 }
Oid fn_lo_open
Definition: libpq-int.h:286

References conn, fd(), pgLobjfuncs::fn_lo_open, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, mode, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by dumpLOs(), exportFile(), importFile(), lo_export(), lo_import_internal(), my_truncate(), overwrite(), pickout(), and StartRestoreLO().

◆ lo_read()

int lo_read ( PGconn conn,
int  fd,
char *  buf,
size_t  len 
)

Definition at line 245 of file fe-lobj.c.

246 {
247  PQArgBlock argv[2];
248  PGresult *res;
249  int result_len;
250 
251  if (lo_initialize(conn) < 0)
252  return -1;
253 
254  /*
255  * Long ago, somebody thought it'd be a good idea to declare this function
256  * as taking size_t ... but the underlying backend function only accepts a
257  * signed int32 length. So throw error if the given value overflows
258  * int32.
259  */
260  if (len > (size_t) INT_MAX)
261  {
262  libpq_append_conn_error(conn, "argument of lo_read exceeds integer range");
263  return -1;
264  }
265 
266  argv[0].isint = 1;
267  argv[0].len = 4;
268  argv[0].u.integer = fd;
269 
270  argv[1].isint = 1;
271  argv[1].len = 4;
272  argv[1].u.integer = (int) len;
273 
275  (void *) buf, &result_len, 0, argv, 2);
277  {
278  PQclear(res);
279  return result_len;
280  }
281  else
282  {
283  PQclear(res);
284  return -1;
285  }
286 }
const void size_t len
Oid fn_lo_read
Definition: libpq-int.h:297

References buf, conn, fd(), pgLobjfuncs::fn_lo_read, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, len, libpq_append_conn_error(), lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by lo_export().

◆ lo_tell()

int lo_tell ( PGconn conn,
int  fd 
)

Definition at line 515 of file fe-lobj.c.

516 {
517  int retval;
518  PQArgBlock argv[1];
519  PGresult *res;
520  int result_len;
521 
522  if (lo_initialize(conn) < 0)
523  return -1;
524 
525  argv[0].isint = 1;
526  argv[0].len = 4;
527  argv[0].u.integer = fd;
528 
530  &retval, &result_len, 1, argv, 1);
532  {
533  PQclear(res);
534  return retval;
535  }
536  else
537  {
538  PQclear(res);
539  return -1;
540  }
541 }
Oid fn_lo_tell
Definition: libpq-int.h:293

References conn, fd(), pgLobjfuncs::fn_lo_tell, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

◆ lo_tell64()

pg_int64 lo_tell64 ( PGconn conn,
int  fd 
)

Definition at line 548 of file fe-lobj.c.

549 {
550  pg_int64 retval;
551  PQArgBlock argv[1];
552  PGresult *res;
553  int result_len;
554 
555  if (lo_initialize(conn) < 0)
556  return -1;
557 
558  if (conn->lobjfuncs->fn_lo_tell64 == 0)
559  {
560  libpq_append_conn_error(conn, "cannot determine OID of function %s",
561  "lo_tell64");
562  return -1;
563  }
564 
565  argv[0].isint = 1;
566  argv[0].len = 4;
567  argv[0].u.integer = fd;
568 
570  (void *) &retval, &result_len, 0, argv, 1);
571  if (PQresultStatus(res) == PGRES_COMMAND_OK && result_len == 8)
572  {
573  PQclear(res);
574  return lo_ntoh64(retval);
575  }
576  else
577  {
578  PQclear(res);
579  return -1;
580  }
581 }
Oid fn_lo_tell64
Definition: libpq-int.h:294

References conn, fd(), pgLobjfuncs::fn_lo_tell64, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, libpq_append_conn_error(), lo_initialize(), lo_ntoh64(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by pickout().

◆ lo_truncate()

int lo_truncate ( PGconn conn,
int  fd,
size_t  len 
)

Definition at line 131 of file fe-lobj.c.

132 {
133  PQArgBlock argv[2];
134  PGresult *res;
135  int retval;
136  int result_len;
137 
138  if (lo_initialize(conn) < 0)
139  return -1;
140 
141  /* Must check this on-the-fly because it's not there pre-8.3 */
142  if (conn->lobjfuncs->fn_lo_truncate == 0)
143  {
144  libpq_append_conn_error(conn, "cannot determine OID of function %s",
145  "lo_truncate");
146  return -1;
147  }
148 
149  /*
150  * Long ago, somebody thought it'd be a good idea to declare this function
151  * as taking size_t ... but the underlying backend function only accepts a
152  * signed int32 length. So throw error if the given value overflows
153  * int32. (A possible alternative is to automatically redirect the call
154  * to lo_truncate64; but if the caller wanted to rely on that backend
155  * function being available, he could have called lo_truncate64 for
156  * himself.)
157  */
158  if (len > (size_t) INT_MAX)
159  {
160  libpq_append_conn_error(conn, "argument of lo_truncate exceeds integer range");
161  return -1;
162  }
163 
164  argv[0].isint = 1;
165  argv[0].len = 4;
166  argv[0].u.integer = fd;
167 
168  argv[1].isint = 1;
169  argv[1].len = 4;
170  argv[1].u.integer = (int) len;
171 
173  &retval, &result_len, 1, argv, 2);
174 
176  {
177  PQclear(res);
178  return retval;
179  }
180  else
181  {
182  PQclear(res);
183  return -1;
184  }
185 }
Oid fn_lo_truncate
Definition: libpq-int.h:295

References conn, fd(), pgLobjfuncs::fn_lo_truncate, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, len, libpq_append_conn_error(), lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

◆ lo_truncate64()

int lo_truncate64 ( PGconn conn,
int  fd,
pg_int64  len 
)

Definition at line 195 of file fe-lobj.c.

196 {
197  PQArgBlock argv[2];
198  PGresult *res;
199  int retval;
200  int result_len;
201 
202  if (lo_initialize(conn) < 0)
203  return -1;
204 
205  if (conn->lobjfuncs->fn_lo_truncate64 == 0)
206  {
207  libpq_append_conn_error(conn, "cannot determine OID of function %s",
208  "lo_truncate64");
209  return -1;
210  }
211 
212  argv[0].isint = 1;
213  argv[0].len = 4;
214  argv[0].u.integer = fd;
215 
216  len = lo_hton64(len);
217  argv[1].isint = 0;
218  argv[1].len = 8;
219  argv[1].u.ptr = (int *) &len;
220 
222  &retval, &result_len, 1, argv, 2);
223 
225  {
226  PQclear(res);
227  return retval;
228  }
229  else
230  {
231  PQclear(res);
232  return -1;
233  }
234 }
Oid fn_lo_truncate64
Definition: libpq-int.h:296

References conn, fd(), pgLobjfuncs::fn_lo_truncate64, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, len, libpq_append_conn_error(), lo_hton64(), lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), PQArgBlock::ptr, res, and PQArgBlock::u.

Referenced by my_truncate().

◆ lo_unlink()

int lo_unlink ( PGconn conn,
Oid  lobjId 
)

Definition at line 589 of file fe-lobj.c.

590 {
591  PQArgBlock argv[1];
592  PGresult *res;
593  int result_len;
594  int retval;
595 
596  if (lo_initialize(conn) < 0)
597  return -1;
598 
599  argv[0].isint = 1;
600  argv[0].len = 4;
601  argv[0].u.integer = lobjId;
602 
604  &retval, &result_len, 1, argv, 1);
606  {
607  PQclear(res);
608  return retval;
609  }
610  else
611  {
612  PQclear(res);
613  return -1;
614  }
615 }
Oid fn_lo_unlink
Definition: libpq-int.h:290

References conn, pgLobjfuncs::fn_lo_unlink, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), res, and PQArgBlock::u.

Referenced by do_lo_unlink(), and vacuumlo().

◆ lo_write()

int lo_write ( PGconn conn,
int  fd,
const char *  buf,
size_t  len 
)

Definition at line 295 of file fe-lobj.c.

296 {
297  PQArgBlock argv[2];
298  PGresult *res;
299  int result_len;
300  int retval;
301 
302  if (lo_initialize(conn) < 0)
303  return -1;
304 
305  /*
306  * Long ago, somebody thought it'd be a good idea to declare this function
307  * as taking size_t ... but the underlying backend function only accepts a
308  * signed int32 length. So throw error if the given value overflows
309  * int32.
310  */
311  if (len > (size_t) INT_MAX)
312  {
313  libpq_append_conn_error(conn, "argument of lo_write exceeds integer range");
314  return -1;
315  }
316 
317  argv[0].isint = 1;
318  argv[0].len = 4;
319  argv[0].u.integer = fd;
320 
321  argv[1].isint = 0;
322  argv[1].len = (int) len;
323  argv[1].u.ptr = (int *) unconstify(char *, buf);
324 
326  &retval, &result_len, 1, argv, 2);
328  {
329  PQclear(res);
330  return retval;
331  }
332  else
333  {
334  PQclear(res);
335  return -1;
336  }
337 }
#define unconstify(underlying_type, expr)
Definition: c.h:1245
Oid fn_lo_write
Definition: libpq-int.h:298

References buf, conn, fd(), pgLobjfuncs::fn_lo_write, PQArgBlock::integer, PQArgBlock::isint, PQArgBlock::len, len, libpq_append_conn_error(), lo_initialize(), pg_conn::lobjfuncs, PGRES_COMMAND_OK, PQclear(), PQfn(), PQresultStatus(), PQArgBlock::ptr, res, PQArgBlock::u, and unconstify.

Referenced by lo_import_internal().

◆ pg_char_to_encoding()

int pg_char_to_encoding ( const char *  name)

Definition at line 549 of file encnames.c.

550 {
551  unsigned int nel = lengthof(pg_encname_tbl);
552  const pg_encname *base = pg_encname_tbl,
553  *last = base + nel - 1,
554  *position;
555  int result;
556  char buff[NAMEDATALEN],
557  *key;
558 
559  if (name == NULL || *name == '\0')
560  return -1;
561 
562  if (strlen(name) >= NAMEDATALEN)
563  return -1; /* it's certainly not in the table */
564 
565  key = clean_encoding_name(name, buff);
566 
567  while (last >= base)
568  {
569  position = base + ((last - base) >> 1);
570  result = key[0] - position->name[0];
571 
572  if (result == 0)
573  {
574  result = strcmp(key, position->name);
575  if (result == 0)
576  return position->encoding;
577  }
578  if (result < 0)
579  last = position - 1;
580  else
581  base = position + 1;
582  }
583  return -1;
584 }
#define lengthof(array)
Definition: c.h:788
static const pg_encname pg_encname_tbl[]
Definition: encnames.c:39
static char * clean_encoding_name(const char *key, char *newkey)
Definition: encnames.c:524
#define NAMEDATALEN
const char * name

References clean_encoding_name(), sort-test::key, lengthof, name, NAMEDATALEN, and pg_encname_tbl.

Referenced by pg_valid_client_encoding(), and pg_valid_server_encoding().

◆ pg_encoding_to_char()

const char* pg_encoding_to_char ( int  encoding)

Definition at line 587 of file encnames.c.

588 {
590  {
591  const pg_enc2name *p = &pg_enc2name_tbl[encoding];
592 
593  Assert(encoding == p->encoding);
594  return p->name;
595  }
596  return "";
597 }
#define Assert(condition)
Definition: c.h:858
const pg_enc2name pg_enc2name_tbl[]
Definition: encnames.c:308
int32 encoding
Definition: pg_database.h:41
#define PG_VALID_ENCODING(_enc)
Definition: pg_wchar.h:287
pg_enc encoding
Definition: pg_wchar.h:342
const char * name
Definition: pg_wchar.h:341

References Assert, encoding, pg_enc2name::encoding, pg_enc2name::name, pg_enc2name_tbl, and PG_VALID_ENCODING.

◆ pg_valid_server_encoding_id()

int pg_valid_server_encoding_id ( int  encoding)

Definition at line 513 of file encnames.c.

514 {
516 }
#define PG_VALID_BE_ENCODING(_enc)
Definition: pg_wchar.h:281

References encoding, and PG_VALID_BE_ENCODING.

◆ PQbackendPID()

int PQbackendPID ( const PGconn conn)

Definition at line 7205 of file fe-connect.c.

7206 {
7207  if (!conn || conn->status != CONNECTION_OK)
7208  return 0;
7209  return conn->be_pid;
7210 }
int be_pid
Definition: libpq-int.h:508
ConnStatusType status
Definition: libpq-int.h:436

References pg_conn::be_pid, conn, CONNECTION_OK, and pg_conn::status.

Referenced by get_prompt(), libpqrcv_get_backend_pid(), main(), send_cancellable_query_impl(), and StartLogStreamer().

◆ PQbinaryTuples()

int PQbinaryTuples ( const PGresult res)

Definition at line 3497 of file fe-exec.c.

3498 {
3499  if (!res)
3500  return 0;
3501  return res->binary;
3502 }
int binary
Definition: libpq-int.h:182

References pg_result::binary, and res.

Referenced by HandleCopyResult().

◆ PQcancel()

int PQcancel ( PGcancel cancel,
char *  errbuf,
int  errbufsize 
)

Definition at line 463 of file fe-cancel.c.

464 {
465  int save_errno = SOCK_ERRNO;
466  pgsocket tmpsock = PGINVALID_SOCKET;
467  int maxlen;
468  struct
469  {
470  uint32 packetlen;
472  } crp;
473 
474  if (!cancel)
475  {
476  strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize);
477  /* strlcpy probably doesn't change errno, but be paranoid */
478  SOCK_ERRNO_SET(save_errno);
479  return false;
480  }
481 
482  /*
483  * We need to open a temporary connection to the postmaster. Do this with
484  * only kernel calls.
485  */
486  if ((tmpsock = socket(cancel->raddr.addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
487  {
488  strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize);
489  goto cancel_errReturn;
490  }
491 
492  /*
493  * Since this connection will only be used to send a single packet of
494  * data, we don't need NODELAY. We also don't set the socket to
495  * nonblocking mode, because the API definition of PQcancel requires the
496  * cancel to be sent in a blocking way.
497  *
498  * We do set socket options related to keepalives and other TCP timeouts.
499  * This ensures that this function does not block indefinitely when
500  * reasonable keepalive and timeout settings have been provided.
501  */
502  if (cancel->raddr.addr.ss_family != AF_UNIX &&
503  cancel->keepalives != 0)
504  {
505 #ifndef WIN32
506  if (!optional_setsockopt(tmpsock, SOL_SOCKET, SO_KEEPALIVE, 1))
507  {
508  strlcpy(errbuf, "PQcancel() -- setsockopt(SO_KEEPALIVE) failed: ", errbufsize);
509  goto cancel_errReturn;
510  }
511 
512 #ifdef PG_TCP_KEEPALIVE_IDLE
513  if (!optional_setsockopt(tmpsock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE,
514  cancel->keepalives_idle))
515  {
516  strlcpy(errbuf, "PQcancel() -- setsockopt(" PG_TCP_KEEPALIVE_IDLE_STR ") failed: ", errbufsize);
517  goto cancel_errReturn;
518  }
519 #endif
520 
521 #ifdef TCP_KEEPINTVL
522  if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPINTVL,
523  cancel->keepalives_interval))
524  {
525  strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPINTVL) failed: ", errbufsize);
526  goto cancel_errReturn;
527  }
528 #endif
529 
530 #ifdef TCP_KEEPCNT
531  if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPCNT,
532  cancel->keepalives_count))
533  {
534  strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPCNT) failed: ", errbufsize);
535  goto cancel_errReturn;
536  }
537 #endif
538 
539 #else /* WIN32 */
540 
541 #ifdef SIO_KEEPALIVE_VALS
542  if (!pqSetKeepalivesWin32(tmpsock,
543  cancel->keepalives_idle,
544  cancel->keepalives_interval))
545  {
546  strlcpy(errbuf, "PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ", errbufsize);
547  goto cancel_errReturn;
548  }
549 #endif /* SIO_KEEPALIVE_VALS */
550 #endif /* WIN32 */
551 
552  /* TCP_USER_TIMEOUT works the same way on Unix and Windows */
553 #ifdef TCP_USER_TIMEOUT
554  if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_USER_TIMEOUT,
555  cancel->pgtcp_user_timeout))
556  {
557  strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ", errbufsize);
558  goto cancel_errReturn;
559  }
560 #endif
561  }
562 
563 retry3:
564  if (connect(tmpsock, (struct sockaddr *) &cancel->raddr.addr,
565  cancel->raddr.salen) < 0)
566  {
567  if (SOCK_ERRNO == EINTR)
568  /* Interrupted system call - we'll just try again */
569  goto retry3;
570  strlcpy(errbuf, "PQcancel() -- connect() failed: ", errbufsize);
571  goto cancel_errReturn;
572  }
573 
574  /* Create and send the cancel request packet. */
575 
576  crp.packetlen = pg_hton32((uint32) sizeof(crp));
577  crp.cp.cancelRequestCode = (MsgType) pg_hton32(CANCEL_REQUEST_CODE);
578  crp.cp.backendPID = pg_hton32(cancel->be_pid);
579  crp.cp.cancelAuthCode = pg_hton32(cancel->be_key);
580 
581 retry4:
582  if (send(tmpsock, (char *) &crp, sizeof(crp), 0) != (int) sizeof(crp))
583  {
584  if (SOCK_ERRNO == EINTR)
585  /* Interrupted system call - we'll just try again */
586  goto retry4;
587  strlcpy(errbuf, "PQcancel() -- send() failed: ", errbufsize);
588  goto cancel_errReturn;
589  }
590 
591  /*
592  * Wait for the postmaster to close the connection, which indicates that
593  * it's processed the request. Without this delay, we might issue another
594  * command only to find that our cancel zaps that command instead of the
595  * one we thought we were canceling. Note we don't actually expect this
596  * read to obtain any data, we are just waiting for EOF to be signaled.
597  */
598 retry5:
599  if (recv(tmpsock, (char *) &crp, 1, 0) < 0)
600  {
601  if (SOCK_ERRNO == EINTR)
602  /* Interrupted system call - we'll just try again */
603  goto retry5;
604  /* we ignore other error conditions */
605  }
606 
607  /* All done */
608  closesocket(tmpsock);
609  SOCK_ERRNO_SET(save_errno);
610  return true;
611 
612 cancel_errReturn:
613 
614  /*
615  * Make sure we don't overflow the error buffer. Leave space for the \n at
616  * the end, and for the terminating zero.
617  */
618  maxlen = errbufsize - strlen(errbuf) - 2;
619  if (maxlen >= 0)
620  {
621  /*
622  * We can't invoke strerror here, since it's not signal-safe. Settle
623  * for printing the decimal value of errno. Even that has to be done
624  * the hard way.
625  */
626  int val = SOCK_ERRNO;
627  char buf[32];
628  char *bufp;
629 
630  bufp = buf + sizeof(buf) - 1;
631  *bufp = '\0';
632  do
633  {
634  *(--bufp) = (val % 10) + '0';
635  val /= 10;
636  } while (val > 0);
637  bufp -= 6;
638  memcpy(bufp, "error ", 6);
639  strncat(errbuf, bufp, maxlen);
640  strcat(errbuf, "\n");
641  }
642  if (tmpsock != PGINVALID_SOCKET)
643  closesocket(tmpsock);
644  SOCK_ERRNO_SET(save_errno);
645  return false;
646 }
unsigned int uint32
Definition: c.h:506
static bool optional_setsockopt(int fd, int protoid, int optid, int value)
Definition: fe-cancel.c:431
long val
Definition: informix.c:670
#define SOCK_ERRNO
Definition: libpq-int.h:932
#define SOCK_ERRNO_SET(e)
Definition: libpq-int.h:934
#define pg_hton32(x)
Definition: pg_bswap.h:121
int pgsocket
Definition: port.h:29
#define PGINVALID_SOCKET
Definition: port.h:31
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
#define closesocket
Definition: port.h:349
#define CANCEL_REQUEST_CODE
Definition: pqcomm.h:132
ProtocolVersion MsgType
Definition: pqcomm.h:101
struct sockaddr_storage addr
Definition: pqcomm.h:32
socklen_t salen
Definition: pqcomm.h:33
int pgtcp_user_timeout
Definition: fe-cancel.c:45
int keepalives_interval
Definition: fe-cancel.c:48
int keepalives_idle
Definition: fe-cancel.c:47
int keepalives_count
Definition: fe-cancel.c:50
SockAddr raddr
Definition: fe-cancel.c:42
int be_pid
Definition: fe-cancel.c:43
int keepalives
Definition: fe-cancel.c:46
int be_key
Definition: fe-cancel.c:44
#define EINTR
Definition: win32_port.h:374
#define recv(s, buf, len, flags)
Definition: win32_port.h:501
#define send(s, buf, len, flags)
Definition: win32_port.h:502
#define socket(af, type, protocol)
Definition: win32_port.h:495
#define connect(s, name, namelen)
Definition: win32_port.h:499

References SockAddr::addr, pg_cancel::be_key, pg_cancel::be_pid, buf, CANCEL_REQUEST_CODE, closesocket, connect, EINTR, pg_cancel::keepalives, pg_cancel::keepalives_count, pg_cancel::keepalives_idle, pg_cancel::keepalives_interval, optional_setsockopt(), pg_hton32, PGINVALID_SOCKET, pg_cancel::pgtcp_user_timeout, pg_cancel::raddr, recv, SockAddr::salen, send, SOCK_ERRNO, SOCK_ERRNO_SET, socket, strlcpy(), and val.

Referenced by DisconnectDatabase(), handle_sigint(), PQrequestCancel(), ShutdownWorkersHard(), sigTermHandler(), and test_cancel().

◆ PQcancelBlocking()

int PQcancelBlocking ( PGcancelConn cancelConn)

Definition at line 171 of file fe-cancel.c.

172 {
174  return 0;
175  return pqConnectDBComplete(&cancelConn->conn);
176 }
static PGcancel *volatile cancelConn
Definition: cancel.c:43
int PQcancelStart(PGcancelConn *cancelConn)
Definition: fe-cancel.c:185
int pqConnectDBComplete(PGconn *conn)
Definition: fe-connect.c:2470

References cancelConn, PQcancelStart(), and pqConnectDBComplete().

Referenced by disconnectDatabase(), test_cancel(), and try_complete_step().

◆ PQcancelCreate()

PGcancelConn* PQcancelCreate ( PGconn conn)

Definition at line 65 of file fe-cancel.c.

66 {
68  pg_conn_host originalHost;
69 
70  if (cancelConn == NULL)
71  return NULL;
72 
73  /* Check we have an open connection */
74  if (!conn)
75  {
76  libpq_append_conn_error(cancelConn, "connection pointer is NULL");
77  return (PGcancelConn *) cancelConn;
78  }
79 
80  if (conn->sock == PGINVALID_SOCKET)
81  {
82  libpq_append_conn_error(cancelConn, "connection not open");
83  return (PGcancelConn *) cancelConn;
84  }
85 
86  /*
87  * Indicate that this connection is used to send a cancellation
88  */
89  cancelConn->cancelRequest = true;
90 
92  return (PGcancelConn *) cancelConn;
93 
94  /*
95  * Compute derived options
96  */
98  return (PGcancelConn *) cancelConn;
99 
100  /*
101  * Copy cancellation token data from the original connection
102  */
105 
106  /*
107  * Cancel requests should not iterate over all possible hosts. The request
108  * needs to be sent to the exact host and address that the original
109  * connection used. So we manually create the host and address arrays with
110  * a single element after freeing the host array that we generated from
111  * the connection options.
112  */
114  cancelConn->nconnhost = 1;
115  cancelConn->naddr = 1;
116 
117  cancelConn->connhost = calloc(cancelConn->nconnhost, sizeof(pg_conn_host));
118  if (!cancelConn->connhost)
119  goto oom_error;
120 
121  originalHost = conn->connhost[conn->whichhost];
122  if (originalHost.host)
123  {
124  cancelConn->connhost[0].host = strdup(originalHost.host);
125  if (!cancelConn->connhost[0].host)
126  goto oom_error;
127  }
128  if (originalHost.hostaddr)
129  {
130  cancelConn->connhost[0].hostaddr = strdup(originalHost.hostaddr);
131  if (!cancelConn->connhost[0].hostaddr)
132  goto oom_error;
133  }
134  if (originalHost.port)
135  {
136  cancelConn->connhost[0].port = strdup(originalHost.port);
137  if (!cancelConn->connhost[0].port)
138  goto oom_error;
139  }
140  if (originalHost.password)
141  {
142  cancelConn->connhost[0].password = strdup(originalHost.password);
143  if (!cancelConn->connhost[0].password)
144  goto oom_error;
145  }
146 
147  cancelConn->addr = calloc(cancelConn->naddr, sizeof(AddrInfo));
148  if (!cancelConn->addr)
149  goto oom_error;
150 
151  cancelConn->addr[0].addr = conn->raddr;
152  cancelConn->addr[0].family = conn->raddr.addr.ss_family;
153 
155  return (PGcancelConn *) cancelConn;
156 
157 oom_error:
158  cancelConn->status = CONNECTION_BAD;
159  libpq_append_conn_error(cancelConn, "out of memory");
160  return (PGcancelConn *) cancelConn;
161 }
bool pqConnectOptions2(PGconn *conn)
Definition: fe-connect.c:1120
void pqReleaseConnHosts(PGconn *conn)
Definition: fe-connect.c:4730
PGconn * pqMakeEmptyPGconn(void)
Definition: fe-connect.c:4549
bool pqCopyPGconn(PGconn *srcConn, PGconn *dstConn)
Definition: fe-connect.c:956
#define calloc(a, b)
Definition: header.h:55
char * host
Definition: libpq-int.h:352
char * password
Definition: libpq-int.h:355
char * port
Definition: libpq-int.h:354
char * hostaddr
Definition: libpq-int.h:353
pgsocket sock
Definition: libpq-int.h:473
int be_key
Definition: libpq-int.h:509
SockAddr raddr
Definition: libpq-int.h:476
int whichhost
Definition: libpq-int.h:455
pg_conn_host * connhost
Definition: libpq-int.h:456

References SockAddr::addr, pg_cancel::be_key, pg_conn::be_key, pg_cancel::be_pid, pg_conn::be_pid, calloc, cancelConn, conn, CONNECTION_ALLOCATED, CONNECTION_BAD, pg_conn::connhost, pg_conn_host::host, pg_conn_host::hostaddr, libpq_append_conn_error(), pg_conn_host::password, PGINVALID_SOCKET, pg_conn_host::port, pqConnectOptions2(), pqCopyPGconn(), pqMakeEmptyPGconn(), pqReleaseConnHosts(), pg_conn::raddr, pg_conn::sock, and pg_conn::whichhost.

Referenced by disconnectDatabase(), libpqsrv_cancel(), test_cancel(), and try_complete_step().

◆ PQcancelErrorMessage()

char* PQcancelErrorMessage ( const PGcancelConn cancelConn)

Definition at line 306 of file fe-cancel.c.

307 {
308  return PQerrorMessage(&cancelConn->conn);
309 }
char * PQerrorMessage(const PGconn *conn)
Definition: fe-connect.c:7171

References cancelConn, and PQerrorMessage().

Referenced by libpqsrv_cancel(), test_cancel(), and try_complete_step().

◆ PQcancelFinish()

void PQcancelFinish ( PGcancelConn cancelConn)

Definition at line 334 of file fe-cancel.c.

335 {
336  PQfinish(&cancelConn->conn);
337 }
void PQfinish(PGconn *conn)
Definition: fe-connect.c:4892

References cancelConn, and PQfinish().

Referenced by disconnectDatabase(), libpqsrv_cancel(), test_cancel(), and try_complete_step().

◆ PQcancelPoll()

PostgresPollingStatusType PQcancelPoll ( PGcancelConn cancelConn)

Definition at line 207 of file fe-cancel.c.

208 {
209  PGconn *conn = &cancelConn->conn;
210  int n;
211 
212  /*
213  * We leave most of the connection establishment to PQconnectPoll, since
214  * it's very similar to normal connection establishment. But once we get
215  * to the CONNECTION_AWAITING_RESPONSE we need to start doing our own
216  * thing.
217  */
219  {
220  return PQconnectPoll(conn);
221  }
222 
223  /*
224  * At this point we are waiting on the server to close the connection,
225  * which is its way of communicating that the cancel has been handled.
226  */
227 
228  n = pqReadData(conn);
229 
230  if (n == 0)
231  return PGRES_POLLING_READING;
232 
233 #ifndef WIN32
234 
235  /*
236  * If we receive an error report it, but only if errno is non-zero.
237  * Otherwise we assume it's an EOF, which is what we expect from the
238  * server.
239  *
240  * We skip this for Windows, because Windows is a bit special in its EOF
241  * behaviour for TCP. Sometimes it will error with an ECONNRESET when
242  * there is a clean connection closure. See these threads for details:
243  * https://www.postgresql.org/message-id/flat/90b34057-4176-7bb0-0dbb-9822a5f6425b%40greiz-reinsdorf.de
244  *
245  * https://www.postgresql.org/message-id/flat/CA%2BhUKG%2BOeoETZQ%3DQw5Ub5h3tmwQhBmDA%3DnuNO3KG%3DzWfUypFAw%40mail.gmail.com
246  *
247  * PQcancel ignores such errors and reports success for the cancellation
248  * anyway, so even if this is not always correct we do the same here.
249  */
250  if (n < 0 && errno != 0)
251  {
253  return PGRES_POLLING_FAILED;
254  }
255 #endif
256 
257  /*
258  * We don't expect any data, only connection closure. So if we strangely
259  * do receive some data we consider that an error.
260  */
261  if (n > 0)
262  {
263  libpq_append_conn_error(conn, "unexpected response from server");
265  return PGRES_POLLING_FAILED;
266  }
267 
268  /*
269  * Getting here means that we received an EOF, which is what we were
270  * expecting -- the cancel request has completed.
271  */
272  cancelConn->conn.status = CONNECTION_OK;
274  return PGRES_POLLING_OK;
275 }
PostgresPollingStatusType PQconnectPoll(PGconn *conn)
Definition: fe-connect.c:2596
int pqReadData(PGconn *conn)
Definition: fe-misc.c:565
void resetPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:146
PQExpBufferData errorMessage
Definition: libpq-int.h:633

References cancelConn, conn, CONNECTION_AWAITING_RESPONSE, CONNECTION_BAD, CONNECTION_OK, pg_conn::errorMessage, libpq_append_conn_error(), PGRES_POLLING_FAILED, PGRES_POLLING_OK, PGRES_POLLING_READING, PQconnectPoll(), pqReadData(), resetPQExpBuffer(), and pg_conn::status.

Referenced by libpqsrv_cancel(), pqConnectDBComplete(), and test_cancel().

◆ PQcancelReset()

void PQcancelReset ( PGcancelConn cancelConn)

Definition at line 318 of file fe-cancel.c.

319 {
320  pqClosePGconn(&cancelConn->conn);
321  cancelConn->conn.status = CONNECTION_ALLOCATED;
322  cancelConn->conn.whichhost = 0;
323  cancelConn->conn.whichaddr = 0;
324  cancelConn->conn.try_next_host = false;
325  cancelConn->conn.try_next_addr = false;
326 }
void pqClosePGconn(PGconn *conn)
Definition: fe-connect.c:4846

References cancelConn, CONNECTION_ALLOCATED, and pqClosePGconn().

Referenced by test_cancel().

◆ PQcancelSocket()

int PQcancelSocket ( const PGcancelConn cancelConn)

Definition at line 294 of file fe-cancel.c.

295 {
296  return PQsocket(&cancelConn->conn);
297 }
int PQsocket(const PGconn *conn)
Definition: fe-connect.c:7197

References cancelConn, and PQsocket().

Referenced by libpqsrv_cancel(), and test_cancel().

◆ PQcancelStart()

int PQcancelStart ( PGcancelConn cancelConn)

Definition at line 185 of file fe-cancel.c.

186 {
187  if (!cancelConn || cancelConn->conn.status == CONNECTION_BAD)
188  return 0;
189 
190  if (cancelConn->conn.status != CONNECTION_ALLOCATED)
191  {
193  "cancel request is already being sent on this connection");
194  cancelConn->conn.status = CONNECTION_BAD;
195  return 0;
196  }
197 
198  return pqConnectDBStart(&cancelConn->conn);
199 }
int pqConnectDBStart(PGconn *conn)
Definition: fe-connect.c:2392

References cancelConn, CONNECTION_ALLOCATED, CONNECTION_BAD, libpq_append_conn_error(), and pqConnectDBStart().

Referenced by libpqsrv_cancel(), PQcancelBlocking(), and test_cancel().

◆ PQcancelStatus()

ConnStatusType PQcancelStatus ( const PGcancelConn cancelConn)

Definition at line 283 of file fe-cancel.c.

284 {
285  return PQstatus(&cancelConn->conn);
286 }
ConnStatusType PQstatus(const PGconn *conn)
Definition: fe-connect.c:7118

References cancelConn, and PQstatus().

Referenced by test_cancel().

◆ PQchangePassword()

PGresult* PQchangePassword ( PGconn conn,
const char *  user,
const char *  passwd 
)

Definition at line 1401 of file fe-auth.c.

1402 {
1403  char *encrypted_password = PQencryptPasswordConn(conn, passwd,
1404  user, NULL);
1405 
1406  if (!encrypted_password)
1407  {
1408  /* PQencryptPasswordConn() already registered the error */
1409  return NULL;
1410  }
1411  else
1412  {
1413  char *fmtpw = PQescapeLiteral(conn, encrypted_password,
1414  strlen(encrypted_password));
1415 
1416  /* no longer needed, so clean up now */
1417  PQfreemem(encrypted_password);
1418 
1419  if (!fmtpw)
1420  {
1421  /* PQescapeLiteral() already registered the error */
1422  return NULL;
1423  }
1424  else
1425  {
1426  char *fmtuser = PQescapeIdentifier(conn, user, strlen(user));
1427 
1428  if (!fmtuser)
1429  {
1430  /* PQescapeIdentifier() already registered the error */
1431  PQfreemem(fmtpw);
1432  return NULL;
1433  }
1434  else
1435  {
1437  PGresult *res;
1438 
1439  initPQExpBuffer(&buf);
1440  printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD %s",
1441  fmtuser, fmtpw);
1442 
1443  res = PQexec(conn, buf.data);
1444 
1445  /* clean up */
1446  termPQExpBuffer(&buf);
1447  PQfreemem(fmtuser);
1448  PQfreemem(fmtpw);
1449 
1450  return res;
1451  }
1452  }
1453  }
1454 }
char * PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm)
Definition: fe-auth.c:1276
void PQfreemem(void *ptr)
Definition: fe-exec.c:4032
char * PQescapeIdentifier(PGconn *conn, const char *str, size_t len)
Definition: fe-exec.c:4310
char * PQescapeLiteral(PGconn *conn, const char *str, size_t len)
Definition: fe-exec.c:4304
PGresult * PQexec(PGconn *conn, const char *query)
Definition: fe-exec.c:2262
static char * user
Definition: pg_regress.c:120
void printfPQExpBuffer(PQExpBuffer str, const char *fmt,...)
Definition: pqexpbuffer.c:235
void initPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:90
void termPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:129

References buf, conn, initPQExpBuffer(), PQencryptPasswordConn(), PQescapeIdentifier(), PQescapeLiteral(), PQexec(), PQfreemem(), printfPQExpBuffer(), res, termPQExpBuffer(), and user.

Referenced by exec_command_password().

◆ PQclear()

void PQclear ( PGresult res)

Definition at line 721 of file fe-exec.c.

722 {
723  PGresult_data *block;
724  int i;
725 
726  /* As a convenience, do nothing for a NULL pointer */
727  if (!res)
728  return;
729  /* Also, do nothing if the argument is OOM_result */
730  if ((const PGresult *) res == &OOM_result)
731  return;
732 
733  /* Close down any events we may have */
734  for (i = 0; i < res->nEvents; i++)
735  {
736  /* only send DESTROY to successfully-initialized event procs */
738  {
740 
741  evt.result = res;
742  (void) res->events[i].proc(PGEVT_RESULTDESTROY, &evt,
743  res->events[i].passThrough);
744  }
745  free(res->events[i].name);
746  }
747 
748  free(res->events);
749 
750  /* Free all the subsidiary blocks */
751  while ((block = res->curBlock) != NULL)
752  {
753  res->curBlock = block->next;
754  free(block);
755  }
756 
757  /* Free the top-level tuple pointer array */
758  free(res->tuples);
759 
760  /* zero out the pointer fields to catch programming errors */
761  res->attDescs = NULL;
762  res->tuples = NULL;
763  res->paramDescs = NULL;
764  res->errFields = NULL;
765  res->events = NULL;
766  res->nEvents = 0;
767  /* res->curBlock was zeroed out earlier */
768 
769  /* Free the PGresult structure itself */
770  free(res);
771 }
static const PGresult OOM_result
Definition: fe-exec.c:49
#define free(a)
Definition: header.h:65
int i
Definition: isn.c:73
@ PGEVT_RESULTDESTROY
Definition: libpq-events.h:34
void * passThrough
Definition: libpq-int.h:165
char * name
Definition: libpq-int.h:164
PGEventProc proc
Definition: libpq-int.h:163
bool resultInitialized
Definition: libpq-int.h:167
int nEvents
Definition: libpq-int.h:191
PGresAttValue ** tuples
Definition: libpq-int.h:175
PGresAttDesc * attDescs
Definition: libpq-int.h:174
PGMessageField * errFields
Definition: libpq-int.h:200
PGresParamDesc * paramDescs
Definition: libpq-int.h:179
PGEvent * events
Definition: libpq-int.h:190
PGresult_data * curBlock
Definition: libpq-int.h:211
PGresult_data * next
Definition: libpq-int.h:108

References pg_result::attDescs, pg_result::curBlock, pg_result::errFields, pg_result::events, free, i, PGEvent::name, pg_result::nEvents, pgresult_data::next, OOM_result, pg_result::paramDescs, PGEvent::passThrough, PGEVT_RESULTDESTROY, PGEvent::proc, res, PGEventResultDestroy::result, PGEvent::resultInitialized, and pg_result::tuples.

Referenced by pqClearAsyncResult(), PQcopyResult(), PQexecFinish(), PQexecStart(), pqInternalNotice(), and PQmakeEmptyPGresult().

◆ PQclientEncoding()

int PQclientEncoding ( const PGconn conn)

◆ PQclosePortal()

PGresult* PQclosePortal ( PGconn conn,
const char *  portal 
)

Definition at line 2539 of file fe-exec.c.

2540 {
2541  if (!PQexecStart(conn))
2542  return NULL;
2543  if (!PQsendTypedCommand(conn, PqMsg_Close, 'P', portal))
2544  return NULL;
2545  return PQexecFinish(conn);
2546 }
static PGresult * PQexecFinish(PGconn *conn)
Definition: fe-exec.c:2410
static int PQsendTypedCommand(PGconn *conn, char command, char type, const char *target)
Definition: fe-exec.c:2589
static bool PQexecStart(PGconn *conn)
Definition: fe-exec.c:2344
#define PqMsg_Close
Definition: protocol.h:20

References conn, PQexecFinish(), PQexecStart(), PqMsg_Close, and PQsendTypedCommand().

Referenced by test_prepared().

◆ PQclosePrepared()

PGresult* PQclosePrepared ( PGconn conn,
const char *  stmt 
)

Definition at line 2521 of file fe-exec.c.

2522 {
2523  if (!PQexecStart(conn))
2524  return NULL;
2525  if (!PQsendTypedCommand(conn, PqMsg_Close, 'S', stmt))
2526  return NULL;
2527  return PQexecFinish(conn);
2528 }
#define stmt
Definition: indent_codes.h:59

References conn, PQexecFinish(), PQexecStart(), PqMsg_Close, PQsendTypedCommand(), and stmt.

Referenced by test_prepared().

◆ PQcmdStatus()

char* PQcmdStatus ( PGresult res)

Definition at line 3752 of file fe-exec.c.

3753 {
3754  if (!res)
3755  return NULL;
3756  return res->cmdStatus;
3757 }
char cmdStatus[CMDSTATUS_LEN]
Definition: libpq-int.h:181

References pg_result::cmdStatus, and res.

Referenced by dblink_exec(), ecpg_process_output(), ExecQueryAndProcessResults(), materializeResult(), PrintQueryStatus(), and test_pipelined_insert().

◆ PQcmdTuples()

char* PQcmdTuples ( PGresult res)

Definition at line 3822 of file fe-exec.c.

3823 {
3824  char *p,
3825  *c;
3826 
3827  if (!res)
3828  return "";
3829 
3830  if (strncmp(res->cmdStatus, "INSERT ", 7) == 0)
3831  {
3832  p = res->cmdStatus + 7;
3833  /* INSERT: skip oid and space */
3834  while (*p && *p != ' ')
3835  p++;
3836  if (*p == 0)
3837  goto interpret_error; /* no space? */
3838  p++;
3839  }
3840  else if (strncmp(res->cmdStatus, "SELECT ", 7) == 0 ||
3841  strncmp(res->cmdStatus, "DELETE ", 7) == 0 ||
3842  strncmp(res->cmdStatus, "UPDATE ", 7) == 0)
3843  p = res->cmdStatus + 7;
3844  else if (strncmp(res->cmdStatus, "FETCH ", 6) == 0 ||
3845  strncmp(res->cmdStatus, "MERGE ", 6) == 0)
3846  p = res->cmdStatus + 6;
3847  else if (strncmp(res->cmdStatus, "MOVE ", 5) == 0 ||
3848  strncmp(res->cmdStatus, "COPY ", 5) == 0)
3849  p = res->cmdStatus + 5;
3850  else
3851  return "";
3852 
3853  /* check that we have an integer (at least one digit, nothing else) */
3854  for (c = p; *c; c++)
3855  {
3856  if (!isdigit((unsigned char) *c))
3857  goto interpret_error;
3858  }
3859  if (c == p)
3860  goto interpret_error;
3861 
3862  return p;
3863 
3864 interpret_error:
3866  "could not interpret result from server: %s",
3867  res->cmdStatus);
3868  return "";
3869 }
void pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...)
Definition: fe-exec.c:938
char * c
PGNoticeHooks noticeHooks
Definition: libpq-int.h:189

References pg_result::cmdStatus, pg_result::noticeHooks, pqInternalNotice(), and res.

Referenced by ecpg_process_output(), execute_dml_stmt(), execute_foreign_modify(), and SetResultVariables().

◆ PQconndefaults()

PQconninfoOption* PQconndefaults ( void  )

Definition at line 1881 of file fe-connect.c.

1882 {
1883  PQExpBufferData errorBuf;
1884  PQconninfoOption *connOptions;
1885 
1886  /* We don't actually report any errors here, but callees want a buffer */
1887  initPQExpBuffer(&errorBuf);
1888  if (PQExpBufferDataBroken(errorBuf))
1889  return NULL; /* out of memory already :-( */
1890 
1891  connOptions = conninfo_init(&errorBuf);
1892  if (connOptions != NULL)
1893  {
1894  /* pass NULL errorBuf to ignore errors */
1895  if (!conninfo_add_defaults(connOptions, NULL))
1896  {
1897  PQconninfoFree(connOptions);
1898  connOptions = NULL;
1899  }
1900  }
1901 
1902  termPQExpBuffer(&errorBuf);
1903  return connOptions;
1904 }
static PQconninfoOption * conninfo_init(PQExpBuffer errorMessage)
Definition: fe-connect.c:5774
static bool conninfo_add_defaults(PQconninfoOption *options, PQExpBuffer errorMessage)
Definition: fe-connect.c:6201
void PQconninfoFree(PQconninfoOption *connOptions)
Definition: fe-connect.c:7004
#define PQExpBufferDataBroken(buf)
Definition: pqexpbuffer.h:67

References conninfo_add_defaults(), conninfo_init(), initPQExpBuffer(), PQconninfoFree(), PQExpBufferDataBroken, and termPQExpBuffer().

Referenced by check_pghost_envvar(), dblink_fdw_validator(), do_connect(), get_connect_string(), GetDbnameFromConnectionOptions(), InitPgFdwOptions(), and main().

◆ PQconnectdb()

PGconn* PQconnectdb ( const char *  conninfo)

Definition at line 744 of file fe-connect.c.

745 {
746  PGconn *conn = PQconnectStart(conninfo);
747 
748  if (conn && conn->status != CONNECTION_BAD)
749  (void) pqConnectDBComplete(conn);
750 
751  return conn;
752 }
PGconn * PQconnectStart(const char *conninfo)
Definition: fe-connect.c:872

References conn, CONNECTION_BAD, pqConnectDBComplete(), PQconnectStart(), and pg_conn::status.

Referenced by connect_database(), get_db_conn(), and main().

◆ PQconnectdbParams()

PGconn* PQconnectdbParams ( const char *const *  keywords,
const char *const *  values,
int  expand_dbname 
)

Definition at line 689 of file fe-connect.c.

692 {
693  PGconn *conn = PQconnectStartParams(keywords, values, expand_dbname);
694 
695  if (conn && conn->status != CONNECTION_BAD)
696  (void) pqConnectDBComplete(conn);
697 
698  return conn;
699 }
static Datum values[MAXATTR]
Definition: bootstrap.c:150
PGconn * PQconnectStartParams(const char *const *keywords, const char *const *values, int expand_dbname)
Definition: fe-connect.c:791

References conn, CONNECTION_BAD, pqConnectDBComplete(), PQconnectStartParams(), pg_conn::status, and values.

Referenced by ConnectDatabase(), connectDatabase(), copy_connection(), doConnect(), ECPGconnect(), GetConnection(), main(), sql_conn(), and vacuumlo().

◆ PQconnectionNeedsPassword()

int PQconnectionNeedsPassword ( const PGconn conn)

Definition at line 7222 of file fe-connect.c.

7223 {
7224  char *password;
7225 
7226  if (!conn)
7227  return false;
7228  password = PQpass(conn);
7229  if (conn->password_needed &&
7230  (password == NULL || password[0] == '\0'))
7231  return true;
7232  else
7233  return false;
7234 }
char * PQpass(const PGconn *conn)
Definition: fe-connect.c:7033
static char * password
Definition: streamutil.c:54
bool password_needed
Definition: libpq-int.h:480

References conn, password, pg_conn::password_needed, and PQpass().

Referenced by ConnectDatabase(), connectDatabase(), do_connect(), doConnect(), GetConnection(), main(), sql_conn(), and vacuumlo().

◆ PQconnectionUsedGSSAPI()

int PQconnectionUsedGSSAPI ( const PGconn conn)

Definition at line 7248 of file fe-connect.c.

7249 {
7250  if (!conn)
7251  return false;
7252  if (conn->gssapi_used)
7253  return true;
7254  else
7255  return false;
7256 }
bool gssapi_used
Definition: libpq-int.h:481

References conn, and pg_conn::gssapi_used.

Referenced by dblink_security_check(), and pgfdw_security_check().

◆ PQconnectionUsedPassword()

int PQconnectionUsedPassword ( const PGconn conn)

Definition at line 7237 of file fe-connect.c.

7238 {
7239  if (!conn)
7240  return false;
7241  if (conn->password_needed)
7242  return true;
7243  else
7244  return false;
7245 }

References conn, and pg_conn::password_needed.

Referenced by ConnectDatabase(), dblink_security_check(), libpqrcv_connect(), and pgfdw_security_check().

◆ PQconnectPoll()

PostgresPollingStatusType PQconnectPoll ( PGconn conn)

Definition at line 2596 of file fe-connect.c.

2597 {
2598  bool reset_connection_state_machine = false;
2599  bool need_new_connection = false;
2600  PGresult *res;
2601  char sebuf[PG_STRERROR_R_BUFLEN];
2602  int optval;
2603 
2604  if (conn == NULL)
2605  return PGRES_POLLING_FAILED;
2606 
2607  /* Get the new data */
2608  switch (conn->status)
2609  {
2610  /*
2611  * We really shouldn't have been polled in these two cases, but we
2612  * can handle it.
2613  */
2614  case CONNECTION_BAD:
2615  return PGRES_POLLING_FAILED;
2616  case CONNECTION_OK:
2617  return PGRES_POLLING_OK;
2618 
2619  /* These are reading states */
2621  case CONNECTION_AUTH_OK:
2623  case CONNECTION_CONSUME:
2625  {
2626  /* Load waiting data */
2627  int n = pqReadData(conn);
2628 
2629  if (n < 0)
2630  goto error_return;
2631  if (n == 0)
2632  return PGRES_POLLING_READING;
2633 
2634  break;
2635  }
2636 
2637  /* These are writing states, so we just proceed. */
2638  case CONNECTION_STARTED:
2639  case CONNECTION_MADE:
2640  break;
2641 
2642  /* Special cases: proceed without waiting. */
2644  case CONNECTION_NEEDED:
2647  break;
2648 
2649  default:
2650  libpq_append_conn_error(conn, "invalid connection state, probably indicative of memory corruption");
2651  goto error_return;
2652  }
2653 
2654 
2655 keep_going: /* We will come back to here until there is
2656  * nothing left to do. */
2657 
2658  /* Time to advance to next address, or next host if no more addresses? */
2659  if (conn->try_next_addr)
2660  {
2661  if (conn->whichaddr < conn->naddr)
2662  {
2663  conn->whichaddr++;
2664  reset_connection_state_machine = true;
2665  }
2666  else
2667  conn->try_next_host = true;
2668  conn->try_next_addr = false;
2669  }
2670 
2671  /* Time to advance to next connhost[] entry? */
2672  if (conn->try_next_host)
2673  {
2674  pg_conn_host *ch;
2675  struct addrinfo hint;
2676  struct addrinfo *addrlist;
2677  int thisport;
2678  int ret;
2679  char portstr[MAXPGPATH];
2680 
2681  if (conn->whichhost + 1 < conn->nconnhost)
2682  conn->whichhost++;
2683  else
2684  {
2685  /*
2686  * Oops, no more hosts.
2687  *
2688  * If we are trying to connect in "prefer-standby" mode, then drop
2689  * the standby requirement and start over. Don't do this for
2690  * cancel requests though, since we are certain the list of
2691  * servers won't change as the target_server_type option is not
2692  * applicable to those connections.
2693  *
2694  * Otherwise, an appropriate error message is already set up, so
2695  * we just need to set the right status.
2696  */
2698  conn->nconnhost > 0 &&
2699  !conn->cancelRequest)
2700  {
2702  conn->whichhost = 0;
2703  }
2704  else
2705  goto error_return;
2706  }
2707 
2708  /* Drop any address info for previous host */
2710 
2711  /*
2712  * Look up info for the new host. On failure, log the problem in
2713  * conn->errorMessage, then loop around to try the next host. (Note
2714  * we don't clear try_next_host until we've succeeded.)
2715  */
2716  ch = &conn->connhost[conn->whichhost];
2717 
2718  /* Initialize hint structure */
2719  MemSet(&hint, 0, sizeof(hint));
2720  hint.ai_socktype = SOCK_STREAM;
2721  hint.ai_family = AF_UNSPEC;
2722 
2723  /* Figure out the port number we're going to use. */
2724  if (ch->port == NULL || ch->port[0] == '\0')
2725  thisport = DEF_PGPORT;
2726  else
2727  {
2728  if (!pqParseIntParam(ch->port, &thisport, conn, "port"))
2729  goto error_return;
2730 
2731  if (thisport < 1 || thisport > 65535)
2732  {
2733  libpq_append_conn_error(conn, "invalid port number: \"%s\"", ch->port);
2734  goto keep_going;
2735  }
2736  }
2737  snprintf(portstr, sizeof(portstr), "%d", thisport);
2738 
2739  /* Use pg_getaddrinfo_all() to resolve the address */
2740  switch (ch->type)
2741  {
2742  case CHT_HOST_NAME:
2743  ret = pg_getaddrinfo_all(ch->host, portstr, &hint,
2744  &addrlist);
2745  if (ret || !addrlist)
2746  {
2747  libpq_append_conn_error(conn, "could not translate host name \"%s\" to address: %s",
2748  ch->host, gai_strerror(ret));
2749  goto keep_going;
2750  }
2751  break;
2752 
2753  case CHT_HOST_ADDRESS:
2754  hint.ai_flags = AI_NUMERICHOST;
2755  ret = pg_getaddrinfo_all(ch->hostaddr, portstr, &hint,
2756  &addrlist);
2757  if (ret || !addrlist)
2758  {
2759  libpq_append_conn_error(conn, "could not parse network address \"%s\": %s",
2760  ch->hostaddr, gai_strerror(ret));
2761  goto keep_going;
2762  }
2763  break;
2764 
2765  case CHT_UNIX_SOCKET:
2766  hint.ai_family = AF_UNIX;
2767  UNIXSOCK_PATH(portstr, thisport, ch->host);
2768  if (strlen(portstr) >= UNIXSOCK_PATH_BUFLEN)
2769  {
2770  libpq_append_conn_error(conn, "Unix-domain socket path \"%s\" is too long (maximum %d bytes)",
2771  portstr,
2772  (int) (UNIXSOCK_PATH_BUFLEN - 1));
2773  goto keep_going;
2774  }
2775 
2776  /*
2777  * NULL hostname tells pg_getaddrinfo_all to parse the service
2778  * name as a Unix-domain socket path.
2779  */
2780  ret = pg_getaddrinfo_all(NULL, portstr, &hint,
2781  &addrlist);
2782  if (ret || !addrlist)
2783  {
2784  libpq_append_conn_error(conn, "could not translate Unix-domain socket path \"%s\" to address: %s",
2785  portstr, gai_strerror(ret));
2786  goto keep_going;
2787  }
2788  break;
2789  }
2790 
2791  /*
2792  * Store a copy of the addrlist in private memory so we can perform
2793  * randomization for load balancing.
2794  */
2795  ret = store_conn_addrinfo(conn, addrlist);
2796  pg_freeaddrinfo_all(hint.ai_family, addrlist);
2797  if (ret)
2798  goto error_return; /* message already logged */
2799 
2800  /*
2801  * If random load balancing is enabled we shuffle the addresses.
2802  */
2804  {
2805  /*
2806  * This is the "inside-out" variant of the Fisher-Yates shuffle
2807  * algorithm. Notionally, we append each new value to the array
2808  * and then swap it with a randomly-chosen array element (possibly
2809  * including itself, else we fail to generate permutations with
2810  * the last integer last). The swap step can be optimized by
2811  * combining it with the insertion.
2812  *
2813  * We don't need to initialize conn->prng_state here, because that
2814  * already happened in pqConnectOptions2.
2815  */
2816  for (int i = 1; i < conn->naddr; i++)
2817  {
2818  int j = pg_prng_uint64_range(&conn->prng_state, 0, i);
2819  AddrInfo temp = conn->addr[j];
2820 
2821  conn->addr[j] = conn->addr[i];
2822  conn->addr[i] = temp;
2823  }
2824  }
2825 
2826  reset_connection_state_machine = true;
2827  conn->try_next_host = false;
2828  }
2829 
2830  /* Reset connection state machine? */
2831  if (reset_connection_state_machine)
2832  {
2833  /*
2834  * (Re) initialize our connection control variables for a set of
2835  * connection attempts to a single server address. These variables
2836  * must persist across individual connection attempts, but we must
2837  * reset them when we start to consider a new server.
2838  */
2839  conn->pversion = PG_PROTOCOL(3, 0);
2840  conn->send_appname = true;
2841  conn->failed_enc_methods = 0;
2842  conn->current_enc_method = 0;
2844  reset_connection_state_machine = false;
2845  need_new_connection = true;
2846  }
2847 
2848  /* Force a new connection (perhaps to the same server as before)? */
2849  if (need_new_connection)
2850  {
2851  /* Drop any existing connection */
2852  pqDropConnection(conn, true);
2853 
2854  /* Reset all state obtained from old server */
2856 
2857  /* Drop any PGresult we might have, too */
2862 
2863  /* Reset conn->status to put the state machine in the right state */
2865 
2866  need_new_connection = false;
2867  }
2868 
2869  /*
2870  * Decide what to do next, if server rejects SSL or GSS negotiation, but
2871  * the connection is still valid. If there are no options left, error out
2872  * with 'msg'.
2873  */
2874 #define ENCRYPTION_NEGOTIATION_FAILED(msg) \
2875  do { \
2876  switch (encryption_negotiation_failed(conn)) \
2877  { \
2878  case 0: \
2879  libpq_append_conn_error(conn, (msg)); \
2880  goto error_return; \
2881  case 1: \
2882  conn->status = CONNECTION_MADE; \
2883  return PGRES_POLLING_WRITING; \
2884  case 2: \
2885  need_new_connection = true; \
2886  goto keep_going; \
2887  } \
2888  } while(0);
2889 
2890  /*
2891  * Decide what to do next, if connection fails. If there are no options
2892  * left, return with an error. The error message has already been written
2893  * to the connection's error buffer.
2894  */
2895 #define CONNECTION_FAILED() \
2896  do { \
2897  if (connection_failed(conn)) \
2898  { \
2899  need_new_connection = true; \
2900  goto keep_going; \
2901  } \
2902  else \
2903  goto error_return; \
2904  } while(0);
2905 
2906  /* Now try to advance the state machine for this connection */
2907  switch (conn->status)
2908  {
2909  case CONNECTION_NEEDED:
2910  {
2911  /*
2912  * Try to initiate a connection to one of the addresses
2913  * returned by pg_getaddrinfo_all(). conn->whichaddr is the
2914  * next one to try.
2915  *
2916  * The extra level of braces here is historical. It's not
2917  * worth reindenting this whole switch case to remove 'em.
2918  */
2919  {
2920  char host_addr[NI_MAXHOST];
2921  int sock_type;
2922  AddrInfo *addr_cur;
2923 
2924  /*
2925  * Advance to next possible host, if we've tried all of
2926  * the addresses for the current host.
2927  */
2928  if (conn->whichaddr == conn->naddr)
2929  {
2930  conn->try_next_host = true;
2931  goto keep_going;
2932  }
2933  addr_cur = &conn->addr[conn->whichaddr];
2934 
2935  /* Remember current address for possible use later */
2936  memcpy(&conn->raddr, &addr_cur->addr, sizeof(SockAddr));
2937 
2938 #ifdef ENABLE_GSS
2939 
2940  /*
2941  * Before establishing the connection, check if it's
2942  * doomed to fail because gssencmode='require' but GSSAPI
2943  * is not available.
2944  */
2945  if (conn->gssencmode[0] == 'r')
2946  {
2947  if (conn->raddr.addr.ss_family == AF_UNIX)
2948  {
2950  "GSSAPI encryption required but it is not supported over a local socket");
2951  goto error_return;
2952  }
2953  if (conn->gcred == GSS_C_NO_CREDENTIAL)
2954  {
2955  if (!pg_GSS_have_cred_cache(&conn->gcred))
2956  {
2958  "GSSAPI encryption required but no credential cache");
2959  goto error_return;
2960  }
2961  }
2962  }
2963 #endif
2964 
2965  /*
2966  * Choose the encryption method to try first. Do this
2967  * before establishing the connection, so that if none of
2968  * the modes allowed by the connections options are
2969  * available, we can error out before establishing the
2970  * connection.
2971  */
2973  goto error_return;
2974 
2975  /*
2976  * Set connip, too. Note we purposely ignore strdup
2977  * failure; not a big problem if it fails.
2978  */
2979  if (conn->connip != NULL)
2980  {
2981  free(conn->connip);
2982  conn->connip = NULL;
2983  }
2984  getHostaddr(conn, host_addr, NI_MAXHOST);
2985  if (host_addr[0])
2986  conn->connip = strdup(host_addr);
2987 
2988  /* Try to create the socket */
2989  sock_type = SOCK_STREAM;
2990 #ifdef SOCK_CLOEXEC
2991 
2992  /*
2993  * Atomically mark close-on-exec, if possible on this
2994  * platform, so that there isn't a window where a
2995  * subprogram executed by another thread inherits the
2996  * socket. See fallback code below.
2997  */
2998  sock_type |= SOCK_CLOEXEC;
2999 #endif
3000 #ifdef SOCK_NONBLOCK
3001 
3002  /*
3003  * We might as well skip a system call for nonblocking
3004  * mode too, if we can.
3005  */
3006  sock_type |= SOCK_NONBLOCK;
3007 #endif
3008  conn->sock = socket(addr_cur->family, sock_type, 0);
3009  if (conn->sock == PGINVALID_SOCKET)
3010  {
3011  int errorno = SOCK_ERRNO;
3012 
3013  /*
3014  * Silently ignore socket() failure if we have more
3015  * addresses to try; this reduces useless chatter in
3016  * cases where the address list includes both IPv4 and
3017  * IPv6 but kernel only accepts one family.
3018  */
3019  if (conn->whichaddr < conn->naddr ||
3020  conn->whichhost + 1 < conn->nconnhost)
3021  {
3022  conn->try_next_addr = true;
3023  goto keep_going;
3024  }
3025  emitHostIdentityInfo(conn, host_addr);
3026  libpq_append_conn_error(conn, "could not create socket: %s",
3027  SOCK_STRERROR(errorno, sebuf, sizeof(sebuf)));
3028  goto error_return;
3029  }
3030 
3031  /*
3032  * Once we've identified a target address, all errors
3033  * except the preceding socket()-failure case should be
3034  * prefixed with host-identity information. (If the
3035  * connection succeeds, the contents of conn->errorMessage
3036  * won't matter, so this is harmless.)
3037  */
3038  emitHostIdentityInfo(conn, host_addr);
3039 
3040  /*
3041  * Select socket options: no delay of outgoing data for
3042  * TCP sockets, nonblock mode, close-on-exec. Try the
3043  * next address if any of this fails.
3044  */
3045  if (addr_cur->family != AF_UNIX)
3046  {
3047  if (!connectNoDelay(conn))
3048  {
3049  /* error message already created */
3050  conn->try_next_addr = true;
3051  goto keep_going;
3052  }
3053  }
3054 #ifndef SOCK_NONBLOCK
3055  if (!pg_set_noblock(conn->sock))
3056  {
3057  libpq_append_conn_error(conn, "could not set socket to nonblocking mode: %s",
3058  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3059  conn->try_next_addr = true;
3060  goto keep_going;
3061  }
3062 #endif
3063 
3064 #ifndef SOCK_CLOEXEC
3065 #ifdef F_SETFD
3066  if (fcntl(conn->sock, F_SETFD, FD_CLOEXEC) == -1)
3067  {
3068  libpq_append_conn_error(conn, "could not set socket to close-on-exec mode: %s",
3069  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3070  conn->try_next_addr = true;
3071  goto keep_going;
3072  }
3073 #endif /* F_SETFD */
3074 #endif
3075 
3076  if (addr_cur->family != AF_UNIX)
3077  {
3078 #ifndef WIN32
3079  int on = 1;
3080 #endif
3081  int usekeepalives = useKeepalives(conn);
3082  int err = 0;
3083 
3084  if (usekeepalives < 0)
3085  {
3086  libpq_append_conn_error(conn, "keepalives parameter must be an integer");
3087  err = 1;
3088  }
3089  else if (usekeepalives == 0)
3090  {
3091  /* Do nothing */
3092  }
3093 #ifndef WIN32
3094  else if (setsockopt(conn->sock,
3095  SOL_SOCKET, SO_KEEPALIVE,
3096  (char *) &on, sizeof(on)) < 0)
3097  {
3098  libpq_append_conn_error(conn, "%s(%s) failed: %s",
3099  "setsockopt",
3100  "SO_KEEPALIVE",
3101  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3102  err = 1;
3103  }
3104  else if (!setKeepalivesIdle(conn)
3106  || !setKeepalivesCount(conn))
3107  err = 1;
3108 #else /* WIN32 */
3109 #ifdef SIO_KEEPALIVE_VALS
3110  else if (!prepKeepalivesWin32(conn))
3111  err = 1;
3112 #endif /* SIO_KEEPALIVE_VALS */
3113 #endif /* WIN32 */
3114  else if (!setTCPUserTimeout(conn))
3115  err = 1;
3116 
3117  if (err)
3118  {
3119  conn->try_next_addr = true;
3120  goto keep_going;
3121  }
3122  }
3123 
3124  /*----------
3125  * We have three methods of blocking SIGPIPE during
3126  * send() calls to this socket:
3127  *
3128  * - setsockopt(sock, SO_NOSIGPIPE)
3129  * - send(sock, ..., MSG_NOSIGNAL)
3130  * - setting the signal mask to SIG_IGN during send()
3131  *
3132  * The third method requires three syscalls per send,
3133  * so we prefer either of the first two, but they are
3134  * less portable. The state is tracked in the following
3135  * members of PGconn:
3136  *
3137  * conn->sigpipe_so - we have set up SO_NOSIGPIPE
3138  * conn->sigpipe_flag - we're specifying MSG_NOSIGNAL
3139  *
3140  * If we can use SO_NOSIGPIPE, then set sigpipe_so here
3141  * and we're done. Otherwise, set sigpipe_flag so that
3142  * we will try MSG_NOSIGNAL on sends. If we get an error
3143  * with MSG_NOSIGNAL, we'll clear that flag and revert to
3144  * signal masking.
3145  *----------
3146  */
3147  conn->sigpipe_so = false;
3148 #ifdef MSG_NOSIGNAL
3149  conn->sigpipe_flag = true;
3150 #else
3151  conn->sigpipe_flag = false;
3152 #endif /* MSG_NOSIGNAL */
3153 
3154 #ifdef SO_NOSIGPIPE
3155  optval = 1;
3156  if (setsockopt(conn->sock, SOL_SOCKET, SO_NOSIGPIPE,
3157  (char *) &optval, sizeof(optval)) == 0)
3158  {
3159  conn->sigpipe_so = true;
3160  conn->sigpipe_flag = false;
3161  }
3162 #endif /* SO_NOSIGPIPE */
3163 
3164  /*
3165  * Start/make connection. This should not block, since we
3166  * are in nonblock mode. If it does, well, too bad.
3167  */
3168  if (connect(conn->sock, (struct sockaddr *) &addr_cur->addr.addr,
3169  addr_cur->addr.salen) < 0)
3170  {
3171  if (SOCK_ERRNO == EINPROGRESS ||
3172 #ifdef WIN32
3173  SOCK_ERRNO == EWOULDBLOCK ||
3174 #endif
3175  SOCK_ERRNO == EINTR)
3176  {
3177  /*
3178  * This is fine - we're in non-blocking mode, and
3179  * the connection is in progress. Tell caller to
3180  * wait for write-ready on socket.
3181  */
3183  return PGRES_POLLING_WRITING;
3184  }
3185  /* otherwise, trouble */
3186  }
3187  else
3188  {
3189  /*
3190  * Hm, we're connected already --- seems the "nonblock
3191  * connection" wasn't. Advance the state machine and
3192  * go do the next stuff.
3193  */
3195  goto keep_going;
3196  }
3197 
3198  /*
3199  * This connection failed. Add the error report to
3200  * conn->errorMessage, then try the next address if any.
3201  */
3203  conn->try_next_addr = true;
3204  goto keep_going;
3205  }
3206  }
3207 
3208  case CONNECTION_STARTED:
3209  {
3210  socklen_t optlen = sizeof(optval);
3211 
3212  /*
3213  * Write ready, since we've made it here, so the connection
3214  * has been made ... or has failed.
3215  */
3216 
3217  /*
3218  * Now check (using getsockopt) that there is not an error
3219  * state waiting for us on the socket.
3220  */
3221 
3222  if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
3223  (char *) &optval, &optlen) == -1)
3224  {
3225  libpq_append_conn_error(conn, "could not get socket error status: %s",
3226  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3227  goto error_return;
3228  }
3229  else if (optval != 0)
3230  {
3231  /*
3232  * When using a nonblocking connect, we will typically see
3233  * connect failures at this point, so provide a friendly
3234  * error message.
3235  */
3236  connectFailureMessage(conn, optval);
3237 
3238  /*
3239  * Try the next address if any, just as in the case where
3240  * connect() returned failure immediately.
3241  */
3242  conn->try_next_addr = true;
3243  goto keep_going;
3244  }
3245 
3246  /* Fill in the client address */
3247  conn->laddr.salen = sizeof(conn->laddr.addr);
3248  if (getsockname(conn->sock,
3249  (struct sockaddr *) &conn->laddr.addr,
3250  &conn->laddr.salen) < 0)
3251  {
3252  libpq_append_conn_error(conn, "could not get client address from socket: %s",
3253  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3254  goto error_return;
3255  }
3256 
3257  /*
3258  * Implement requirepeer check, if requested and it's a
3259  * Unix-domain socket.
3260  */
3261  if (conn->requirepeer && conn->requirepeer[0] &&
3262  conn->raddr.addr.ss_family == AF_UNIX)
3263  {
3264 #ifndef WIN32
3265  char *remote_username;
3266 #endif
3267  uid_t uid;
3268  gid_t gid;
3269 
3270  errno = 0;
3271  if (getpeereid(conn->sock, &uid, &gid) != 0)
3272  {
3273  /*
3274  * Provide special error message if getpeereid is a
3275  * stub
3276  */
3277  if (errno == ENOSYS)
3278  libpq_append_conn_error(conn, "requirepeer parameter is not supported on this platform");
3279  else
3280  libpq_append_conn_error(conn, "could not get peer credentials: %s",
3281  strerror_r(errno, sebuf, sizeof(sebuf)));
3282  goto error_return;
3283  }
3284 
3285 #ifndef WIN32
3286  remote_username = pg_fe_getusername(uid,
3287  &conn->errorMessage);
3288  if (remote_username == NULL)
3289  goto error_return; /* message already logged */
3290 
3291  if (strcmp(remote_username, conn->requirepeer) != 0)
3292  {
3293  libpq_append_conn_error(conn, "requirepeer specifies \"%s\", but actual peer user name is \"%s\"",
3294  conn->requirepeer, remote_username);
3295  free(remote_username);
3296  goto error_return;
3297  }
3298  free(remote_username);
3299 #else /* WIN32 */
3300  /* should have failed with ENOSYS above */
3301  Assert(false);
3302 #endif /* WIN32 */
3303  }
3304 
3305  /*
3306  * Make sure we can write before advancing to next step.
3307  */
3309  return PGRES_POLLING_WRITING;
3310  }
3311 
3312  case CONNECTION_MADE:
3313  {
3314  char *startpacket;
3315  int packetlen;
3316 
3317 #ifdef ENABLE_GSS
3318 
3319  /*
3320  * If GSSAPI encryption is enabled, send a packet to the
3321  * server asking for GSSAPI Encryption and proceed with GSSAPI
3322  * handshake. We will come back here after GSSAPI encryption
3323  * has been established, with conn->gctx set.
3324  */
3325  if (conn->current_enc_method == ENC_GSSAPI && !conn->gctx)
3326  {
3328 
3329  if (pqPacketSend(conn, 0, &pv, sizeof(pv)) != STATUS_OK)
3330  {
3331  libpq_append_conn_error(conn, "could not send GSSAPI negotiation packet: %s",
3332  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3333  goto error_return;
3334  }
3335 
3336  /* Ok, wait for response */
3338  return PGRES_POLLING_READING;
3339  }
3340 #endif
3341 
3342 #ifdef USE_SSL
3343 
3344  /*
3345  * Enable the libcrypto callbacks before checking if SSL needs
3346  * to be done. This is done before sending the startup packet
3347  * as depending on the type of authentication done, like MD5
3348  * or SCRAM that use cryptohashes, the callbacks would be
3349  * required even without a SSL connection
3350  */
3351  if (pqsecure_initialize(conn, false, true) < 0)
3352  goto error_return;
3353 
3354  /*
3355  * If SSL is enabled, start the SSL negotiation. We will come
3356  * back here after SSL encryption has been established, with
3357  * ssl_in_use set.
3358  */
3360  {
3361  /*
3362  * If traditional postgres SSL negotiation is used, send
3363  * the SSL request. In direct negotiation, jump straight
3364  * into the SSL handshake.
3365  */
3366  if (conn->sslnegotiation[0] == 'p')
3367  {
3368  ProtocolVersion pv;
3369 
3370  /*
3371  * Send the SSL request packet.
3372  *
3373  * Theoretically, this could block, but it really
3374  * shouldn't since we only got here if the socket is
3375  * write-ready.
3376  */
3378  if (pqPacketSend(conn, 0, &pv, sizeof(pv)) != STATUS_OK)
3379  {
3380  libpq_append_conn_error(conn, "could not send SSL negotiation packet: %s",
3381  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3382  goto error_return;
3383  }
3384  /* Ok, wait for response */
3386  return PGRES_POLLING_READING;
3387  }
3388  else
3389  {
3390  Assert(conn->sslnegotiation[0] == 'd');
3392  return PGRES_POLLING_WRITING;
3393  }
3394  }
3395 #endif /* USE_SSL */
3396 
3397  /*
3398  * For cancel requests this is as far as we need to go in the
3399  * connection establishment. Now we can actually send our
3400  * cancellation request.
3401  */
3402  if (conn->cancelRequest)
3403  {
3404  CancelRequestPacket cancelpacket;
3405 
3406  packetlen = sizeof(cancelpacket);
3408  cancelpacket.backendPID = pg_hton32(conn->be_pid);
3409  cancelpacket.cancelAuthCode = pg_hton32(conn->be_key);
3410  if (pqPacketSend(conn, 0, &cancelpacket, packetlen) != STATUS_OK)
3411  {
3412  libpq_append_conn_error(conn, "could not send cancel packet: %s",
3413  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3414  goto error_return;
3415  }
3417  return PGRES_POLLING_READING;
3418  }
3419 
3420  /*
3421  * We have now established encryption, or we are happy to
3422  * proceed without.
3423  */
3424 
3425  /* Build the startup packet. */
3426  startpacket = pqBuildStartupPacket3(conn, &packetlen,
3428  if (!startpacket)
3429  {
3430  libpq_append_conn_error(conn, "out of memory");
3431  goto error_return;
3432  }
3433 
3434  /*
3435  * Send the startup packet.
3436  *
3437  * Theoretically, this could block, but it really shouldn't
3438  * since we only got here if the socket is write-ready.
3439  */
3440  if (pqPacketSend(conn, 0, startpacket, packetlen) != STATUS_OK)
3441  {
3442  libpq_append_conn_error(conn, "could not send startup packet: %s",
3443  SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
3444  free(startpacket);
3445  goto error_return;
3446  }
3447 
3448  free(startpacket);
3449 
3451  return PGRES_POLLING_READING;
3452  }
3453 
3454  /*
3455  * Handle SSL negotiation: wait for postmaster messages and
3456  * respond as necessary.
3457  */
3459  {
3460 #ifdef USE_SSL
3461  PostgresPollingStatusType pollres;
3462 
3463  /*
3464  * On first time through with traditional SSL negotiation, get
3465  * the postmaster's response to our SSLRequest packet. With
3466  * sslnegotiation='direct', go straight to initiating SSL.
3467  */
3468  if (!conn->ssl_in_use && conn->sslnegotiation[0] == 'p')
3469  {
3470  /*
3471  * We use pqReadData here since it has the logic to
3472  * distinguish no-data-yet from connection closure. Since
3473  * conn->ssl isn't set, a plain recv() will occur.
3474  */
3475  char SSLok;
3476  int rdresult;
3477 
3478  rdresult = pqReadData(conn);
3479  if (rdresult < 0)
3480  {
3481  /* errorMessage is already filled in */
3482  goto error_return;
3483  }
3484  if (rdresult == 0)
3485  {
3486  /* caller failed to wait for data */
3487  return PGRES_POLLING_READING;
3488  }
3489  if (pqGetc(&SSLok, conn) < 0)
3490  {
3491  /* should not happen really */
3492  return PGRES_POLLING_READING;
3493  }
3494  if (SSLok == 'S')
3495  {
3496  /* mark byte consumed */
3497  conn->inStart = conn->inCursor;
3498  }
3499  else if (SSLok == 'N')
3500  {
3501  /* mark byte consumed */
3502  conn->inStart = conn->inCursor;
3503 
3504  /*
3505  * The connection is still valid, so if it's OK to
3506  * continue without SSL, we can proceed using this
3507  * connection. Otherwise return with an error.
3508  */
3509  ENCRYPTION_NEGOTIATION_FAILED(libpq_gettext("server does not support SSL, but SSL was required"));
3510  }
3511  else if (SSLok == 'E')
3512  {
3513  /*
3514  * Server failure of some sort, such as failure to
3515  * fork a backend process. We need to process and
3516  * report the error message, which might be formatted
3517  * according to either protocol 2 or protocol 3.
3518  * Rather than duplicate the code for that, we flip
3519  * into AWAITING_RESPONSE state and let the code there
3520  * deal with it. Note we have *not* consumed the "E"
3521  * byte here.
3522  */
3524 
3525  /*
3526  * Don't fall back to a plaintext connection after
3527  * reading the error.
3528  */
3530  goto keep_going;
3531  }
3532  else
3533  {
3534  libpq_append_conn_error(conn, "received invalid response to SSL negotiation: %c",
3535  SSLok);
3536  goto error_return;
3537  }
3538  }
3539 
3540  /*
3541  * Set up global SSL state if required. The crypto state has
3542  * already been set if libpq took care of doing that, so there
3543  * is no need to make that happen again.
3544  */
3545  if (pqsecure_initialize(conn, true, false) != 0)
3546  goto error_return;
3547 
3548  /*
3549  * Begin or continue the SSL negotiation process.
3550  */
3551  pollres = pqsecure_open_client(conn);
3552  if (pollres == PGRES_POLLING_OK)
3553  {
3554  /*
3555  * At this point we should have no data already buffered.
3556  * If we do, it was received before we performed the SSL
3557  * handshake, so it wasn't encrypted and indeed may have
3558  * been injected by a man-in-the-middle.
3559  */
3560  if (conn->inCursor != conn->inEnd)
3561  {
3562  libpq_append_conn_error(conn, "received unencrypted data after SSL response");
3563  goto error_return;
3564  }
3565 
3566  /* SSL handshake done, ready to send startup packet */
3568  return PGRES_POLLING_WRITING;
3569  }
3570  if (pollres == PGRES_POLLING_FAILED)
3571  {
3572  /*
3573  * SSL handshake failed. We will retry with a plaintext
3574  * connection, if permitted by sslmode.
3575  */
3577  }
3578  /* Else, return POLLING_READING or POLLING_WRITING status */
3579  return pollres;
3580 #else /* !USE_SSL */
3581  /* can't get here */
3582  goto error_return;
3583 #endif /* USE_SSL */
3584  }
3585 
3587  {
3588 #ifdef ENABLE_GSS
3589  PostgresPollingStatusType pollres;
3590 
3591  /*
3592  * If we haven't yet, get the postmaster's response to our
3593  * negotiation packet
3594  */
3595  if (!conn->gctx)
3596  {
3597  char gss_ok;
3598  int rdresult = pqReadData(conn);
3599 
3600  if (rdresult < 0)
3601  /* pqReadData fills in error message */
3602  goto error_return;
3603  else if (rdresult == 0)
3604  /* caller failed to wait for data */
3605  return PGRES_POLLING_READING;
3606  if (pqGetc(&gss_ok, conn) < 0)
3607  /* shouldn't happen... */
3608  return PGRES_POLLING_READING;
3609 
3610  if (gss_ok == 'E')
3611  {
3612  /*
3613  * Server failure of some sort, possibly protocol
3614  * version support failure. We need to process and
3615  * report the error message, which might be formatted
3616  * according to either protocol 2 or protocol 3.
3617  * Rather than duplicate the code for that, we flip
3618  * into AWAITING_RESPONSE state and let the code there
3619  * deal with it. Note we have *not* consumed the "E"
3620  * byte here.
3621  *
3622  * Note that unlike on an error response to
3623  * SSLRequest, we allow falling back to SSL or
3624  * plaintext connection here. GSS support was
3625  * introduced in PostgreSQL version 12, so an error
3626  * response might mean that we are connecting to a
3627  * pre-v12 server.
3628  */
3630  goto keep_going;
3631  }
3632 
3633  /* mark byte consumed */
3634  conn->inStart = conn->inCursor;
3635 
3636  if (gss_ok == 'N')
3637  {
3638  /*
3639  * The connection is still valid, so if it's OK to
3640  * continue without GSS, we can proceed using this
3641  * connection. Otherwise return with an error.
3642  */
3643  ENCRYPTION_NEGOTIATION_FAILED(libpq_gettext("server doesn't support GSSAPI encryption, but it was required"));
3644  }
3645  else if (gss_ok != 'G')
3646  {
3647  libpq_append_conn_error(conn, "received invalid response to GSSAPI negotiation: %c",
3648  gss_ok);
3649  goto error_return;
3650  }
3651  }
3652 
3653  /* Begin or continue GSSAPI negotiation */
3654  pollres = pqsecure_open_gss(conn);
3655  if (pollres == PGRES_POLLING_OK)
3656  {
3657  /*
3658  * At this point we should have no data already buffered.
3659  * If we do, it was received before we performed the GSS
3660  * handshake, so it wasn't encrypted and indeed may have
3661  * been injected by a man-in-the-middle.
3662  */
3663  if (conn->inCursor != conn->inEnd)
3664  {
3665  libpq_append_conn_error(conn, "received unencrypted data after GSSAPI encryption response");
3666  goto error_return;
3667  }
3668 
3669  /* All set for startup packet */
3671  return PGRES_POLLING_WRITING;
3672  }
3673  else if (pollres == PGRES_POLLING_FAILED)
3674  {
3675  /*
3676  * GSS handshake failed. We will retry with an SSL or
3677  * plaintext connection, if permitted by the options.
3678  */
3680  }
3681  /* Else, return POLLING_READING or POLLING_WRITING status */
3682  return pollres;
3683 #else /* !ENABLE_GSS */
3684  /* unreachable */
3685  goto error_return;
3686 #endif /* ENABLE_GSS */
3687  }
3688 
3689  /*
3690  * Handle authentication exchange: wait for postmaster messages
3691  * and respond as necessary.
3692  */
3694  {
3695  char beresp;
3696  int msgLength;
3697  int avail;
3698  AuthRequest areq;
3699  int res;
3700 
3701  /*
3702  * Scan the message from current point (note that if we find
3703  * the message is incomplete, we will return without advancing
3704  * inStart, and resume here next time).
3705  */
3706  conn->inCursor = conn->inStart;
3707 
3708  /* Read type byte */
3709  if (pqGetc(&beresp, conn))
3710  {
3711  /* We'll come back when there is more data */
3712  return PGRES_POLLING_READING;
3713  }
3714 
3715  /*
3716  * Validate message type: we expect only an authentication
3717  * request, NegotiateProtocolVersion, or an error here.
3718  * Anything else probably means it's not Postgres on the other
3719  * end at all.
3720  */
3721  if (beresp != PqMsg_AuthenticationRequest &&
3722  beresp != PqMsg_ErrorResponse &&
3724  {
3725  libpq_append_conn_error(conn, "expected authentication request from server, but received %c",
3726  beresp);
3727  goto error_return;
3728  }
3729 
3730  /* Read message length word */
3731  if (pqGetInt(&msgLength, 4, conn))
3732  {
3733  /* We'll come back when there is more data */
3734  return PGRES_POLLING_READING;
3735  }
3736 
3737  /*
3738  * Try to validate message length before using it.
3739  *
3740  * Authentication requests can't be very large, although GSS
3741  * auth requests may not be that small. Same for
3742  * NegotiateProtocolVersion.
3743  *
3744  * Errors can be a little larger, but not huge. If we see a
3745  * large apparent length in an error, it means we're really
3746  * talking to a pre-3.0-protocol server; cope. (Before
3747  * version 14, the server also used the old protocol for
3748  * errors that happened before processing the startup packet.)
3749  */
3750  if (beresp == PqMsg_AuthenticationRequest &&
3751  (msgLength < 8 || msgLength > 2000))
3752  {
3753  libpq_append_conn_error(conn, "received invalid authentication request");
3754  goto error_return;
3755  }
3756  if (beresp == PqMsg_NegotiateProtocolVersion &&
3757  (msgLength < 8 || msgLength > 2000))
3758  {
3759  libpq_append_conn_error(conn, "received invalid protocol negotiation message");
3760  goto error_return;
3761  }
3762 
3763 #define MAX_ERRLEN 30000
3764  if (beresp == PqMsg_ErrorResponse &&
3765  (msgLength < 8 || msgLength > MAX_ERRLEN))
3766  {
3767  /* Handle error from a pre-3.0 server */
3768  conn->inCursor = conn->inStart + 1; /* reread data */
3770  {
3771  /*
3772  * We may not have authenticated the server yet, so
3773  * don't let the buffer grow forever.
3774  */
3775  avail = conn->inEnd - conn->inCursor;
3776  if (avail > MAX_ERRLEN)
3777  {
3778  libpq_append_conn_error(conn, "received invalid error message");
3779  goto error_return;
3780  }
3781 
3782  /* We'll come back when there is more data */
3783  return PGRES_POLLING_READING;
3784  }
3785  /* OK, we read the message; mark data consumed */
3786  conn->inStart = conn->inCursor;
3787 
3788  /*
3789  * Before 7.2, the postmaster didn't always end its
3790  * messages with a newline, so add one if needed to
3791  * conform to libpq conventions.
3792  */
3793  if (conn->errorMessage.len == 0 ||
3794  conn->errorMessage.data[conn->errorMessage.len - 1] != '\n')
3795  {
3797  }
3798 
3799  goto error_return;
3800  }
3801 #undef MAX_ERRLEN
3802 
3803  /*
3804  * Can't process if message body isn't all here yet.
3805  *
3806  * After this check passes, any further EOF during parsing
3807  * implies that the server sent a bad/truncated message.
3808  * Reading more bytes won't help in that case, so don't return
3809  * PGRES_POLLING_READING after this point.
3810  */
3811  msgLength -= 4;
3812  avail = conn->inEnd - conn->inCursor;
3813  if (avail < msgLength)
3814  {
3815  /*
3816  * Before returning, try to enlarge the input buffer if
3817  * needed to hold the whole message; see notes in
3818  * pqParseInput3.
3819  */
3820  if (pqCheckInBufferSpace(conn->inCursor + (size_t) msgLength,
3821  conn))
3822  goto error_return;
3823  /* We'll come back when there is more data */
3824  return PGRES_POLLING_READING;
3825  }
3826 
3827  /* Handle errors. */
3828  if (beresp == PqMsg_ErrorResponse)
3829  {
3830  if (pqGetErrorNotice3(conn, true))
3831  {
3832  libpq_append_conn_error(conn, "received invalid error message");
3833  goto error_return;
3834  }
3835  /* OK, we read the message; mark data consumed */
3836  conn->inStart = conn->inCursor;
3837 
3838  /*
3839  * If error is "cannot connect now", try the next host if
3840  * any (but we don't want to consider additional addresses
3841  * for this host, nor is there much point in changing SSL
3842  * or GSS mode). This is helpful when dealing with
3843  * standby servers that might not be in hot-standby state.
3844  */
3845  if (strcmp(conn->last_sqlstate,
3847  {
3848  conn->try_next_host = true;
3849  goto keep_going;
3850  }
3851 
3852  /* Check to see if we should mention pgpassfile */
3854 
3856  }
3857  else if (beresp == PqMsg_NegotiateProtocolVersion)
3858  {
3860  {
3861  libpq_append_conn_error(conn, "received invalid protocol negotiation message");
3862  goto error_return;
3863  }
3864  /* OK, we read the message; mark data consumed */
3865  conn->inStart = conn->inCursor;
3866  goto error_return;
3867  }
3868 
3869  /* It is an authentication request. */
3870  conn->auth_req_received = true;
3871 
3872  /* Get the type of request. */
3873  if (pqGetInt((int *) &areq, 4, conn))
3874  {
3875  /* can't happen because we checked the length already */
3876  libpq_append_conn_error(conn, "received invalid authentication request");
3877  goto error_return;
3878  }
3879  msgLength -= 4;
3880 
3881  /*
3882  * Process the rest of the authentication request message, and
3883  * respond to it if necessary.
3884  *
3885  * Note that conn->pghost must be non-NULL if we are going to
3886  * avoid the Kerberos code doing a hostname look-up.
3887  */
3888  res = pg_fe_sendauth(areq, msgLength, conn);
3889 
3890  /* OK, we have processed the message; mark data consumed */
3891  conn->inStart = conn->inCursor;
3892 
3893  if (res != STATUS_OK)
3894  goto error_return;
3895 
3896  /*
3897  * Just make sure that any data sent by pg_fe_sendauth is
3898  * flushed out. Although this theoretically could block, it
3899  * really shouldn't since we don't send large auth responses.
3900  */
3901  if (pqFlush(conn))
3902  goto error_return;
3903 
3904  if (areq == AUTH_REQ_OK)
3905  {
3906  /* We are done with authentication exchange */
3908 
3909  /*
3910  * Set asyncStatus so that PQgetResult will think that
3911  * what comes back next is the result of a query. See
3912  * below.
3913  */
3915  }
3916 
3917  /* Look to see if we have more data yet. */
3918  goto keep_going;
3919  }
3920 
3921  case CONNECTION_AUTH_OK:
3922  {
3923  /*
3924  * Now we expect to hear from the backend. A ReadyForQuery
3925  * message indicates that startup is successful, but we might
3926  * also get an Error message indicating failure. (Notice
3927  * messages indicating nonfatal warnings are also allowed by
3928  * the protocol, as are ParameterStatus and BackendKeyData
3929  * messages.) Easiest way to handle this is to let
3930  * PQgetResult() read the messages. We just have to fake it
3931  * out about the state of the connection, by setting
3932  * asyncStatus = PGASYNC_BUSY (done above).
3933  */
3934 
3935  if (PQisBusy(conn))
3936  return PGRES_POLLING_READING;
3937 
3938  res = PQgetResult(conn);
3939 
3940  /*
3941  * NULL return indicating we have gone to IDLE state is
3942  * expected
3943  */
3944  if (res)
3945  {
3947  libpq_append_conn_error(conn, "unexpected message from server during startup");
3948  else if (conn->send_appname &&
3949  (conn->appname || conn->fbappname))
3950  {
3951  /*
3952  * If we tried to send application_name, check to see
3953  * if the error is about that --- pre-9.0 servers will
3954  * reject it at this stage of the process. If so,
3955  * close the connection and retry without sending
3956  * application_name. We could possibly get a false
3957  * SQLSTATE match here and retry uselessly, but there
3958  * seems no great harm in that; we'll just get the
3959  * same error again if it's unrelated.
3960  */
3961  const char *sqlstate;
3962 
3964  if (sqlstate &&
3965  strcmp(sqlstate, ERRCODE_APPNAME_UNKNOWN) == 0)
3966  {
3967  PQclear(res);
3968  conn->send_appname = false;
3969  need_new_connection = true;
3970  goto keep_going;
3971  }
3972  }
3973 
3974  /*
3975  * if the resultStatus is FATAL, then conn->errorMessage
3976  * already has a copy of the error; needn't copy it back.
3977  * But add a newline if it's not there already, since
3978  * postmaster error messages may not have one.
3979  */
3980  if (conn->errorMessage.len <= 0 ||
3981  conn->errorMessage.data[conn->errorMessage.len - 1] != '\n')
3983  PQclear(res);
3984  goto error_return;
3985  }
3986 
3987  /* Almost there now ... */
3989  goto keep_going;
3990  }
3991 
3993  {
3994  /*
3995  * If a read-write, read-only, primary, or standby connection
3996  * is required, see if we have one.
3997  */
4000  {
4001  bool read_only_server;
4002 
4003  /*
4004  * If the server didn't report
4005  * "default_transaction_read_only" or "in_hot_standby" at
4006  * startup, we must determine its state by sending the
4007  * query "SHOW transaction_read_only". This GUC exists in
4008  * all server versions that support 3.0 protocol.
4009  */
4012  {
4013  /*
4014  * We use PQsendQueryContinue so that
4015  * conn->errorMessage does not get cleared. We need
4016  * to preserve any error messages related to previous
4017  * hosts we have tried and failed to connect to.
4018  */
4021  "SHOW transaction_read_only"))
4022  goto error_return;
4023  /* We'll return to this state when we have the answer */
4025  return PGRES_POLLING_READING;
4026  }
4027 
4028  /* OK, we can make the test */
4029  read_only_server =
4032 
4034  read_only_server : !read_only_server)
4035  {
4036  /* Wrong server state, reject and try the next host */
4038  libpq_append_conn_error(conn, "session is read-only");
4039  else
4040  libpq_append_conn_error(conn, "session is not read-only");
4041 
4042  /* Close connection politely. */
4045 
4046  /*
4047  * Try next host if any, but we don't want to consider
4048  * additional addresses for this host.
4049  */
4050  conn->try_next_host = true;
4051  goto keep_going;
4052  }
4053  }
4057  {
4058  /*
4059  * If the server didn't report "in_hot_standby" at
4060  * startup, we must determine its state by sending the
4061  * query "SELECT pg_catalog.pg_is_in_recovery()". Servers
4062  * before 9.0 don't have that function, but by the same
4063  * token they don't have any standby mode, so we may just
4064  * assume the result.
4065  */
4066  if (conn->sversion < 90000)
4068 
4070  {
4071  /*
4072  * We use PQsendQueryContinue so that
4073  * conn->errorMessage does not get cleared. We need
4074  * to preserve any error messages related to previous
4075  * hosts we have tried and failed to connect to.
4076  */
4079  "SELECT pg_catalog.pg_is_in_recovery()"))
4080  goto error_return;
4081  /* We'll return to this state when we have the answer */
4083  return PGRES_POLLING_READING;
4084  }
4085 
4086  /* OK, we can make the test */
4090  {
4091  /* Wrong server state, reject and try the next host */
4093  libpq_append_conn_error(conn, "server is in hot standby mode");
4094  else
4095  libpq_append_conn_error(conn, "server is not in hot standby mode");
4096 
4097  /* Close connection politely. */
4100 
4101  /*
4102  * Try next host if any, but we don't want to consider
4103  * additional addresses for this host.
4104  */
4105  conn->try_next_host = true;
4106  goto keep_going;
4107  }
4108  }
4109 
4110  /*
4111  * For non cancel requests we can release the address list
4112  * now. For cancel requests we never actually resolve
4113  * addresses and instead the addrinfo exists for the lifetime
4114  * of the connection.
4115  */
4116  if (!conn->cancelRequest)
4118 
4119  /*
4120  * Contents of conn->errorMessage are no longer interesting
4121  * (and it seems some clients expect it to be empty after a
4122  * successful connection).
4123  */
4125 
4126  /* We are open for business! */
4128  return PGRES_POLLING_OK;
4129  }
4130 
4131  case CONNECTION_CONSUME:
4132  {
4133  /*
4134  * This state just makes sure the connection is idle after
4135  * we've obtained the result of a SHOW or SELECT query. Once
4136  * we're clear, return to CONNECTION_CHECK_TARGET state to
4137  * decide what to do next. We must transiently set status =
4138  * CONNECTION_OK in order to use the result-consuming
4139  * subroutines.
4140  */
4142  if (!PQconsumeInput(conn))
4143  goto error_return;
4144 
4145  if (PQisBusy(conn))
4146  {
4148  return PGRES_POLLING_READING;
4149  }
4150 
4151  /* Call PQgetResult() again until we get a NULL result */
4152  res = PQgetResult(conn);
4153  if (res != NULL)
4154  {
4155  PQclear(res);
4157  return PGRES_POLLING_READING;
4158  }
4159 
4161  goto keep_going;
4162  }
4163 
4165  {
4166  /*
4167  * Waiting for result of "SHOW transaction_read_only". We
4168  * must transiently set status = CONNECTION_OK in order to use
4169  * the result-consuming subroutines.
4170  */
4172  if (!PQconsumeInput(conn))
4173  goto error_return;
4174 
4175  if (PQisBusy(conn))
4176  {
4178  return PGRES_POLLING_READING;
4179  }
4180 
4181  res = PQgetResult(conn);
4182  if (res && PQresultStatus(res) == PGRES_TUPLES_OK &&
4183  PQntuples(res) == 1)
4184  {
4185  char *val = PQgetvalue(res, 0, 0);
4186 
4187  /*
4188  * "transaction_read_only = on" proves that at least one
4189  * of default_transaction_read_only and in_hot_standby is
4190  * on, but we don't actually know which. We don't care
4191  * though for the purpose of identifying a read-only
4192  * session, so satisfy the CONNECTION_CHECK_TARGET code by
4193  * claiming they are both on. On the other hand, if it's
4194  * a read-write session, they are certainly both off.
4195  */
4196  if (strncmp(val, "on", 2) == 0)
4197  {
4200  }
4201  else
4202  {
4205  }
4206  PQclear(res);
4207 
4208  /* Finish reading messages before continuing */
4210  goto keep_going;
4211  }
4212 
4213  /* Something went wrong with "SHOW transaction_read_only". */
4214  PQclear(res);
4215 
4216  /* Append error report to conn->errorMessage. */
4217  libpq_append_conn_error(conn, "\"%s\" failed",
4218  "SHOW transaction_read_only");
4219 
4220  /* Close connection politely. */
4223 
4224  /* Try next host. */
4225  conn->try_next_host = true;
4226  goto keep_going;
4227  }
4228 
4230  {
4231  /*
4232  * Waiting for result of "SELECT pg_is_in_recovery()". We
4233  * must transiently set status = CONNECTION_OK in order to use
4234  * the result-consuming subroutines.
4235  */
4237  if (!PQconsumeInput(conn))
4238  goto error_return;
4239 
4240  if (PQisBusy(conn))
4241  {
4243  return PGRES_POLLING_READING;
4244  }
4245 
4246  res = PQgetResult(conn);
4247  if (res && PQresultStatus(res) == PGRES_TUPLES_OK &&
4248  PQntuples(res) == 1)
4249  {
4250  char *val = PQgetvalue(res, 0, 0);
4251 
4252  if (strncmp(val, "t", 1) == 0)
4254  else
4256  PQclear(res);
4257 
4258  /* Finish reading messages before continuing */
4260  goto keep_going;
4261  }
4262 
4263  /* Something went wrong with "SELECT pg_is_in_recovery()". */
4264  PQclear(res);
4265 
4266  /* Append error report to conn->errorMessage. */
4267  libpq_append_conn_error(conn, "\"%s\" failed",
4268  "SELECT pg_is_in_recovery()");
4269 
4270  /* Close connection politely. */
4273 
4274  /* Try next host. */
4275  conn->try_next_host = true;
4276  goto keep_going;
4277  }
4278 
4279  default:
4281  "invalid connection state %d, probably indicative of memory corruption",
4282  conn->status);
4283  goto error_return;
4284  }
4285 
4286  /* Unreachable */
4287 
4288 error_return:
4289 
4290  /*
4291  * We used to close the socket at this point, but that makes it awkward
4292  * for those above us if they wish to remove this socket from their own
4293  * records (an fd_set for example). We'll just have this socket closed
4294  * when PQfinish is called (which is compulsory even after an error, since
4295  * the connection structure must be freed).
4296  */
4298  return PGRES_POLLING_FAILED;
4299 }
#define STATUS_OK
Definition: c.h:1169
#define MemSet(start, val, len)
Definition: c.h:1020
void err(int eval, const char *fmt,...)
Definition: err.c:43
int pg_fe_sendauth(AuthRequest areq, int payloadlen, PGconn *conn)
Definition: fe-auth.c:961
char * pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage)
Definition: fe-auth.c:1169
#define MAX_ERRLEN
void pqDropConnection(PGconn *conn, bool flushInput)
Definition: fe-connect.c:471
static const PQEnvironmentOption EnvironmentOptions[]
Definition: fe-connect.c:372
#define CONNECTION_FAILED()
static void sendTerminateConn(PGconn *conn)
Definition: fe-connect.c:4812
static int setKeepalivesCount(PGconn *conn)
Definition: fe-connect.c:2256
static int useKeepalives(PGconn *conn)
Definition: fe-connect.c:2169
static int store_conn_addrinfo(PGconn *conn, struct addrinfo *addrlist)
Definition: fe-connect.c:4759
static void connectFailureMessage(PGconn *conn, int errorno)
Definition: fe-connect.c:2149
static void release_conn_addrinfo(PGconn *conn)
Definition: fe-connect.c:4798
#define ERRCODE_APPNAME_UNKNOWN
Definition: fe-connect.c:86
static int setKeepalivesInterval(PGconn *conn)
Definition: fe-connect.c:2221
static int setKeepalivesIdle(PGconn *conn)
Definition: fe-connect.c:2187
bool pqParseIntParam(const char *value, int *result, PGconn *conn, const char *context)
Definition: fe-connect.c:7706
static void pgpassfileWarning(PGconn *conn)
Definition: fe-connect.c:7577
static void emitHostIdentityInfo(PGconn *conn, const char *host_addr)
Definition: fe-connect.c:2093
static int setTCPUserTimeout(PGconn *conn)
Definition: fe-connect.c:2353
static void pqDropServerData(PGconn *conn)
Definition: fe-connect.c:584
static int connectNoDelay(PGconn *conn)
Definition: fe-connect.c:2034
static void getHostaddr(PGconn *conn, char *host_addr, int host_addr_len)
Definition: fe-connect.c:2060
#define ERRCODE_CANNOT_CONNECT_NOW
Definition: fe-connect.c:91
#define ENCRYPTION_NEGOTIATION_FAILED(msg)
static bool init_allowed_encryption_methods(PGconn *conn)
Definition: fe-connect.c:4305
int pqPacketSend(PGconn *conn, char pack_type, const void *buf, size_t buf_len)
Definition: fe-connect.c:5000
int PQsendQueryContinue(PGconn *conn, const char *query)
Definition: fe-exec.c:1422
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3481
int PQconsumeInput(PGconn *conn)
Definition: fe-exec.c:1984
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3876
void pqClearAsyncResult(PGconn *conn)
Definition: fe-exec.c:779
int PQisBusy(PGconn *conn)
Definition: fe-exec.c:2031
char * PQresultErrorField(const PGresult *res, int fieldcode)
Definition: fe-exec.c:3466
PGresult * PQgetResult(PGconn *conn)
Definition: fe-exec.c:2062
bool pg_GSS_have_cred_cache(gss_cred_id_t *cred_out)
int pqFlush(PGconn *conn)
Definition: fe-misc.c:953
int pqGetc(char *result, PGconn *conn)
Definition: fe-misc.c:77
int pqGetInt(int *result, size_t bytes, PGconn *conn)
Definition: fe-misc.c:216
int pqCheckInBufferSpace(size_t bytes_needed, PGconn *conn)
Definition: fe-misc.c:351
int pqGets_append(PQExpBuffer buf, PGconn *conn)
Definition: fe-misc.c:142
int pqGetNegotiateProtocolVersion3(PGconn *conn)
int pqGetErrorNotice3(PGconn *conn, bool isError)
Definition: fe-protocol3.c:882
char * pqBuildStartupPacket3(PGconn *conn, int *packetlen, const PQEnvironmentOption *options)
PostgresPollingStatusType pqsecure_open_gss(PGconn *conn)
PostgresPollingStatusType pqsecure_open_client(PGconn *conn)
Definition: fe-secure.c:153
int pqsecure_initialize(PGconn *conn, bool do_ssl, bool do_crypto)
Definition: fe-secure.c:138
void pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo *ai)
Definition: ip.c:82
int pg_getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result)
Definition: ip.c:53
int j
Definition: isn.c:74
@ PGASYNC_IDLE
Definition: libpq-int.h:221
@ PGASYNC_BUSY
Definition: libpq-int.h:222
#define libpq_gettext(x)
Definition: libpq-int.h:911
@ LOAD_BALANCE_RANDOM
Definition: libpq-int.h:256
#define SOCK_STRERROR
Definition: libpq-int.h:933
#define ENC_GSSAPI
Definition: libpq-int.h:237
#define ENC_SSL
Definition: libpq-int.h:238
@ CHT_UNIX_SOCKET
Definition: libpq-int.h:317
@ CHT_HOST_ADDRESS
Definition: libpq-int.h:316
@ CHT_HOST_NAME
Definition: libpq-int.h:315
@ PG_BOOL_YES
Definition: libpq-int.h:263
@ PG_BOOL_NO
Definition: libpq-int.h:264
@ PG_BOOL_UNKNOWN
Definition: libpq-int.h:262
@ SERVER_TYPE_STANDBY
Definition: libpq-int.h:247
@ SERVER_TYPE_PRIMARY
Definition: libpq-int.h:246
@ SERVER_TYPE_READ_WRITE
Definition: libpq-int.h:244
@ SERVER_TYPE_PREFER_STANDBY_PASS2
Definition: libpq-int.h:249
@ SERVER_TYPE_PREFER_STANDBY
Definition: libpq-int.h:248
@ SERVER_TYPE_READ_ONLY
Definition: libpq-int.h:245
#define MAXPGPATH
uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax)
Definition: pg_prng.c:144
static char portstr[16]
Definition: pg_regress.c:117
bool pg_set_noblock(pgsocket sock)
Definition: noblock.c:25
#define snprintf
Definition: port.h:238
unsigned int socklen_t
Definition: port.h:40
int getpeereid(int sock, uid_t *uid, gid_t *gid)
Definition: getpeereid.c:33
#define PG_DIAG_SQLSTATE
Definition: postgres_ext.h:56
#define UNIXSOCK_PATH(path, port, sockdir)
Definition: pqcomm.h:44
#define UNIXSOCK_PATH_BUFLEN
Definition: pqcomm.h:60
#define NEGOTIATE_GSS_CODE
Definition: pqcomm.h:167
#define NEGOTIATE_SSL_CODE
Definition: pqcomm.h:166
uint32 ProtocolVersion
Definition: pqcomm.h:99
uint32 AuthRequest
Definition: pqcomm.h:121
#define PG_PROTOCOL(m, n)
Definition: pqcomm.h:89
void appendPQExpBufferChar(PQExpBuffer str, char ch)
Definition: pqexpbuffer.c:378
#define AUTH_REQ_OK
Definition: protocol.h:74
#define PqMsg_AuthenticationRequest
Definition: protocol.h:50
#define PqMsg_NegotiateProtocolVersion
Definition: protocol.h:59
#define PqMsg_ErrorResponse
Definition: protocol.h:44
const char * gai_strerror(int ecode)
int family
Definition: pqcomm.h:38
SockAddr addr
Definition: pqcomm.h:39
MsgType cancelRequestCode
Definition: pqcomm.h:137
uint32 backendPID
Definition: pqcomm.h:138
uint32 cancelAuthCode
Definition: pqcomm.h:139
pg_conn_host_type type
Definition: libpq-int.h:351
SockAddr laddr
Definition: libpq-int.h:475
bool try_next_host
Definition: libpq-int.h:500
AddrInfo * addr
Definition: libpq-int.h:503
uint8 failed_enc_methods
Definition: libpq-int.h:562
char * sslnegotiation
Definition: libpq-int.h:397
bool sigpipe_flag
Definition: libpq-int.h:483
int nconnhost
Definition: libpq-int.h:454
ProtocolVersion pversion
Definition: libpq-int.h:477
bool send_appname
Definition: libpq-int.h:505
PGTransactionStatusType xactStatus
Definition: libpq-int.h:438
bool cancelRequest
Definition: libpq-int.h:419
int inCursor
Definition: libpq-int.h:525
PGTernaryBool in_hot_standby
Definition: libpq-int.h:514
int inEnd
Definition: libpq-int.h:526
char * fbappname
Definition: libpq-int.h:382
uint8 current_enc_method
Definition: libpq-int.h:563
int naddr
Definition: libpq-int.h:501
int inStart
Definition: libpq-int.h:524
char * connip
Definition: libpq-int.h:457
int sversion
Definition: libpq-int.h:478
bool auth_req_received
Definition: libpq-int.h:479
PGTernaryBool default_transaction_read_only
Definition: libpq-int.h:513
bool sigpipe_so
Definition: libpq-int.h:482
int whichaddr
Definition: libpq-int.h:502
char * appname
Definition: libpq-int.h:381
pg_prng_state prng_state
Definition: libpq-int.h:518
char * gssencmode
Definition: libpq-int.h:408
char last_sqlstate[6]
Definition: libpq-int.h:439
PGAsyncStatusType asyncStatus
Definition: libpq-int.h:437
PGLoadBalanceType load_balance_type
Definition: libpq-int.h:497
PGpipelineStatus pipelineStatus
Definition: libpq-int.h:443
uint8 allowed_enc_methods
Definition: libpq-int.h:561
PGTargetServerType target_server_type
Definition: libpq-int.h:496
bool try_next_addr
Definition: libpq-int.h:499
char * requirepeer
Definition: libpq-int.h:407
bool ssl_in_use
Definition: libpq-int.h:566
ExecStatusType resultStatus
Definition: libpq-int.h:180
#define EWOULDBLOCK
Definition: win32_port.h:380
#define EINPROGRESS
Definition: win32_port.h:386
int gid_t
Definition: win32_port.h:245
int uid_t
Definition: win32_port.h:244

References AddrInfo::addr, SockAddr::addr, pg_conn::addr, pg_conn::allowed_enc_methods, appendPQExpBufferChar(), pg_conn::appname, Assert, pg_conn::asyncStatus, AUTH_REQ_OK, pg_conn::auth_req_received, CancelRequestPacket::backendPID, pg_conn::be_key, pg_conn::be_pid, CANCEL_REQUEST_CODE, CancelRequestPacket::cancelAuthCode, pg_conn::cancelRequest, CancelRequestPacket::cancelRequestCode, CHT_HOST_ADDRESS, CHT_HOST_NAME, CHT_UNIX_SOCKET, conn, connect, connectFailureMessage(), CONNECTION_AUTH_OK, CONNECTION_AWAITING_RESPONSE, CONNECTION_BAD, CONNECTION_CHECK_STANDBY, CONNECTION_CHECK_TARGET, CONNECTION_CHECK_WRITABLE, CONNECTION_CONSUME, CONNECTION_FAILED, CONNECTION_GSS_STARTUP, CONNECTION_MADE, CONNECTION_NEEDED, CONNECTION_OK, CONNECTION_SSL_STARTUP, CONNECTION_STARTED, connectNoDelay(), pg_conn::connhost, pg_conn::connip, pg_conn::current_enc_method, PQExpBufferData::data, pg_conn::default_transaction_read_only, EINPROGRESS, EINTR, emitHostIdentityInfo(), ENC_GSSAPI, ENC_SSL, ENCRYPTION_NEGOTIATION_FAILED, EnvironmentOptions, err(), ERRCODE_APPNAME_UNKNOWN, ERRCODE_CANNOT_CONNECT_NOW, pg_conn::errorMessage, EWOULDBLOCK, pg_conn::failed_enc_methods, AddrInfo::family, pg_conn::fbappname, free, gai_strerror(), getHostaddr(), getpeereid(), pg_conn::gssencmode, pg_conn_host::host, pg_conn_host::hostaddr, i, pg_conn::in_hot_standby, pg_conn::inCursor, pg_conn::inEnd, init_allowed_encryption_methods(), pg_conn::inStart, j, pg_conn::laddr, pg_conn::last_sqlstate, PQExpBufferData::len, libpq_append_conn_error(), libpq_gettext, LOAD_BALANCE_RANDOM, pg_conn::load_balance_type, MAX_ERRLEN, MAXPGPATH, MemSet, pg_conn::naddr, pg_conn::nconnhost, NEGOTIATE_GSS_CODE, NEGOTIATE_SSL_CODE, PG_BOOL_NO, PG_BOOL_UNKNOWN, PG_BOOL_YES, PG_DIAG_SQLSTATE, pg_fe_getusername(), pg_fe_sendauth(), pg_freeaddrinfo_all(), pg_getaddrinfo_all(), pg_GSS_have_cred_cache(), pg_hton32, pg_prng_uint64_range(), PG_PROTOCOL, pg_set_noblock(), PG_STRERROR_R_BUFLEN, PGASYNC_BUSY, PGASYNC_IDLE, PGINVALID_SOCKET, pgpassfileWarning(), PGRES_FATAL_ERROR, PGRES_POLLING_FAILED, PGRES_POLLING_OK, PGRES_POLLING_READING, PGRES_POLLING_WRITING, PGRES_TUPLES_OK, pg_conn::pipelineStatus, pg_conn_host::port, portstr, PQ_PIPELINE_OFF, pqBuildStartupPacket3(), pqCheckInBufferSpace(), PQclear(), pqClearAsyncResult(), pqClearConnErrorState, PQconsumeInput(), pqDropConnection(), pqDropServerData(), pqFlush(), pqGetc(), pqGetErrorNotice3(), pqGetInt(), pqGetNegotiateProtocolVersion3(), PQgetResult(), pqGets_append(), PQgetvalue(), PQisBusy(), PqMsg_AuthenticationRequest, PqMsg_ErrorResponse, PqMsg_NegotiateProtocolVersion, PQntuples(), pqPacketSend(), pqParseIntParam(), pqReadData(), PQresultErrorField(), PQresultStatus(), pqsecure_initialize(), pqsecure_open_client(), pqsecure_open_gss(), PQsendQueryContinue(), PQTRANS_IDLE, pg_conn::prng_state, pg_conn::pversion, pg_conn::raddr, release_conn_addrinfo(), pg_conn::requirepeer, res, pg_result::resultStatus, SockAddr::salen, pg_conn::send_appname, sendTerminateConn(), SERVER_TYPE_PREFER_STANDBY, SERVER_TYPE_PREFER_STANDBY_PASS2, SERVER_TYPE_PRIMARY, SERVER_TYPE_READ_ONLY, SERVER_TYPE_READ_WRITE, SERVER_TYPE_STANDBY, setKeepalivesCount(), setKeepalivesIdle(), setKeepalivesInterval(), setTCPUserTimeout(), pg_conn::sigpipe_flag, pg_conn::sigpipe_so, snprintf, pg_conn::sock, SOCK_ERRNO, SOCK_STRERROR, socket, pg_conn::ssl_in_use, pg_conn::sslnegotiation, pg_conn::status, STATUS_OK, store_conn_addrinfo(), strerror_r, pg_conn::sversion, pg_conn::target_server_type, pg_conn::try_next_addr, pg_conn::try_next_host, pg_conn_host::type, UNIXSOCK_PATH, UNIXSOCK_PATH_BUFLEN, useKeepalives(), val, pg_conn::whichaddr, pg_conn::whichhost, and pg_conn::xactStatus.

Referenced by libpqrcv_connect(), libpqsrv_connect_internal(), PQcancelPoll(), pqConnectDBComplete(), pqConnectDBStart(), PQresetPoll(), and wait_until_connected().

◆ PQconnectStart()

PGconn* PQconnectStart ( const char *  conninfo)

Definition at line 872 of file fe-connect.c.

873 {
874  PGconn *conn;
875 
876  /*
877  * Allocate memory for the conn structure. Note that we also expect this
878  * to initialize conn->errorMessage to empty. All subsequent steps during
879  * connection initialization will only append to that buffer.
880  */
882  if (conn == NULL)
883  return NULL;
884 
885  /*
886  * Parse the conninfo string
887  */
888  if (!connectOptions1(conn, conninfo))
889  return conn;
890 
891  /*
892  * Compute derived options
893  */
894  if (!pqConnectOptions2(conn))
895  return conn;
896 
897  /*
898  * Connect to the database
899  */
900  if (!pqConnectDBStart(conn))
901  {
902  /* Just in case we failed to set it in pqConnectDBStart */
904  }
905 
906  return conn;
907 }
static bool connectOptions1(PGconn *conn, const char *conninfo)
Definition: fe-connect.c:997

References conn, CONNECTION_BAD, connectOptions1(), pqConnectDBStart(), pqConnectOptions2(), pqMakeEmptyPGconn(), and pg_conn::status.

Referenced by libpqsrv_connect(), PQconnectdb(), and PQping().

◆ PQconnectStartParams()

PGconn* PQconnectStartParams ( const char *const *  keywords,
const char *const *  values,
int  expand_dbname 
)

Definition at line 791 of file fe-connect.c.

794 {
795  PGconn *conn;
796  PQconninfoOption *connOptions;
797 
798  /*
799  * Allocate memory for the conn structure. Note that we also expect this
800  * to initialize conn->errorMessage to empty. All subsequent steps during
801  * connection initialization will only append to that buffer.
802  */
804  if (conn == NULL)
805  return NULL;
806 
807  /*
808  * Parse the conninfo arrays
809  */
810  connOptions = conninfo_array_parse(keywords, values,
811  &conn->errorMessage,
812  true, expand_dbname);
813  if (connOptions == NULL)
814  {
816  /* errorMessage is already set */
817  return conn;
818  }
819 
820  /*
821  * Move option values into conn structure
822  */
823  if (!fillPGconn(conn, connOptions))
824  {
825  PQconninfoFree(connOptions);
826  return conn;
827  }
828 
829  /*
830  * Free the option info - all is in conn now
831  */
832  PQconninfoFree(connOptions);
833 
834  /*
835  * Compute derived options
836  */
837  if (!pqConnectOptions2(conn))
838  return conn;
839 
840  /*
841  * Connect to the database
842  */
843  if (!pqConnectDBStart(conn))
844  {
845  /* Just in case we failed to set it in pqConnectDBStart */
847  }
848 
849  return conn;
850 }
static PQconninfoOption * conninfo_array_parse(const char *const *keywords, const char *const *values, PQExpBuffer errorMessage, bool use_defaults, int expand_dbname)
Definition: fe-connect.c:6043
static bool fillPGconn(PGconn *conn, PQconninfoOption *connOptions)
Definition: fe-connect.c:918

References conn, CONNECTION_BAD, conninfo_array_parse(), pg_conn::errorMessage, fillPGconn(), pqConnectDBStart(), pqConnectOptions2(), PQconninfoFree(), pqMakeEmptyPGconn(), pg_conn::status, and values.

Referenced by do_connect(), libpqrcv_connect(), libpqsrv_connect_params(), PQconnectdbParams(), and PQpingParams().

◆ PQconninfo()

PQconninfoOption* PQconninfo ( PGconn conn)

Definition at line 6960 of file fe-connect.c.

6961 {
6962  PQExpBufferData errorBuf;
6963  PQconninfoOption *connOptions;
6964 
6965  if (conn == NULL)
6966  return NULL;
6967 
6968  /*
6969  * We don't actually report any errors here, but callees want a buffer,
6970  * and we prefer not to trash the conn's errorMessage.
6971  */
6972  initPQExpBuffer(&errorBuf);
6973  if (PQExpBufferDataBroken(errorBuf))
6974  return NULL; /* out of memory already :-( */
6975 
6976  connOptions = conninfo_init(&errorBuf);
6977 
6978  if (connOptions != NULL)
6979  {
6981 
6982  for (option = PQconninfoOptions; option->keyword; option++)
6983  {
6984  char **connmember;
6985 
6986  if (option->connofs < 0)
6987  continue;
6988 
6989  connmember = (char **) ((char *) conn + option->connofs);
6990 
6991  if (*connmember)
6992  conninfo_storeval(connOptions, option->keyword, *connmember,
6993  &errorBuf, true, false);
6994  }
6995  }
6996 
6997  termPQExpBuffer(&errorBuf);
6998 
6999  return connOptions;
7000 }
static PQconninfoOption * conninfo_storeval(PQconninfoOption *connOptions, const char *keyword, const char *value, PQExpBuffer errorMessage, bool ignoreMissing, bool uri_decode)
Definition: fe-connect.c:6878
static const internalPQconninfoOption PQconninfoOptions[]
Definition: fe-connect.c:190

References conn, conninfo_init(), conninfo_storeval(), initPQExpBuffer(), PQconninfoOptions, PQExpBufferDataBroken, and termPQExpBuffer().

Referenced by copy_connection(), do_connect(), GenerateRecoveryConfig(), and libpqrcv_get_conninfo().

◆ PQconninfoFree()

◆ PQconninfoParse()

PQconninfoOption* PQconninfoParse ( const char *  conninfo,
char **  errmsg 
)

Definition at line 5752 of file fe-connect.c.

5753 {
5754  PQExpBufferData errorBuf;
5755  PQconninfoOption *connOptions;
5756 
5757  if (errmsg)
5758  *errmsg = NULL; /* default */
5759  initPQExpBuffer(&errorBuf);
5760  if (PQExpBufferDataBroken(errorBuf))
5761  return NULL; /* out of memory already :-( */
5762  connOptions = parse_connection_string(conninfo, &errorBuf, false);
5763  if (connOptions == NULL && errmsg)
5764  *errmsg = errorBuf.data;
5765  else
5766  termPQExpBuffer(&errorBuf);
5767  return connOptions;
5768 }
int errmsg(const char *fmt,...)
Definition: elog.c:1070
static PQconninfoOption * parse_connection_string(const char *connstr, PQExpBuffer errorMessage, bool use_defaults)
Definition: fe-connect.c:5813

References PQExpBufferData::data, errmsg(), initPQExpBuffer(), parse_connection_string(), PQExpBufferDataBroken, and termPQExpBuffer().

Referenced by connectDatabase(), dblink_connstr_has_pw(), do_connect(), get_base_conninfo(), GetConnection(), GetDbnameFromConnectionOptions(), libpqrcv_check_conninfo(), libpqrcv_get_dbname_from_conninfo(), and main().

◆ PQconsumeInput()

int PQconsumeInput ( PGconn conn)

Definition at line 1984 of file fe-exec.c.

1985 {
1986  if (!conn)
1987  return 0;
1988 
1989  /*
1990  * for non-blocking connections try to flush the send-queue, otherwise we
1991  * may never get a response for something that may not have already been
1992  * sent because it's in our write buffer!
1993  */
1994  if (pqIsnonblocking(conn))
1995  {
1996  if (pqFlush(conn) < 0)
1997  return 0;
1998  }
1999 
2000  /*
2001  * Load more data, if available. We do this no matter what state we are
2002  * in, since we are probably getting called because the application wants
2003  * to get rid of a read-select condition. Note that we will NOT block
2004  * waiting for more input.
2005  */
2006  if (pqReadData(conn) < 0)
2007  return 0;
2008 
2009  /* Parsing of the data waits till later. */
2010  return 1;
2011 }
#define pqIsnonblocking(conn)
Definition: libpq-int.h:900

References conn, pqFlush(), pqIsnonblocking, and pqReadData().

Referenced by advanceConnectionState(), confirm_query_canceled_impl(), CopyStreamReceive(), dblink_get_notify(), dblink_is_busy(), do_sql_command_end(), ecpg_process_output(), libpqrcv_PQgetResult(), libpqrcv_receive(), libpqsrv_get_result(), main(), pgfdw_cancel_query_end(), pgfdw_exec_cleanup_query_end(), pgfdw_get_cleanup_result(), postgresForeignAsyncNotify(), PQconnectPoll(), PrintNotifications(), StreamLogicalLog(), test_nosync(), test_pipelined_insert(), test_uniqviol(), try_complete_step(), and wait_on_slots().

◆ PQcopyResult()

PGresult* PQcopyResult ( const PGresult src,
int  flags 
)

Definition at line 318 of file fe-exec.c.

319 {
320  PGresult *dest;
321  int i;
322 
323  if (!src)
324  return NULL;
325 
327  if (!dest)
328  return NULL;
329 
330  /* Always copy these over. Is cmdStatus really useful here? */
331  dest->client_encoding = src->client_encoding;
332  strcpy(dest->cmdStatus, src->cmdStatus);
333 
334  /* Wants attrs? */
335  if (flags & (PG_COPYRES_ATTRS | PG_COPYRES_TUPLES))
336  {
337  if (!PQsetResultAttrs(dest, src->numAttributes, src->attDescs))
338  {
339  PQclear(dest);
340  return NULL;
341  }
342  }
343 
344  /* Wants to copy tuples? */
345  if (flags & PG_COPYRES_TUPLES)
346  {
347  int tup,
348  field;
349 
350  for (tup = 0; tup < src->ntups; tup++)
351  {
352  for (field = 0; field < src->numAttributes; field++)
353  {
354  if (!PQsetvalue(dest, tup, field,
355  src->tuples[tup][field].value,
356  src->tuples[tup][field].len))
357  {
358  PQclear(dest);
359  return NULL;
360  }
361  }
362  }
363  }
364 
365  /* Wants to copy notice hooks? */
366  if (flags & PG_COPYRES_NOTICEHOOKS)
367  dest->noticeHooks = src->noticeHooks;
368 
369  /* Wants to copy PGEvents? */
370  if ((flags & PG_COPYRES_EVENTS) && src->nEvents > 0)
371  {
372  dest->events = dupEvents(src->events, src->nEvents,
373  &dest->memorySize);
374  if (!dest->events)
375  {
376  PQclear(dest);
377  return NULL;
378  }
379  dest->nEvents = src->nEvents;
380  }
381 
382  /* Okay, trigger PGEVT_RESULTCOPY event */
383  for (i = 0; i < dest->nEvents; i++)
384  {
385  /* We don't fire events that had some previous failure */
386  if (src->events[i].resultInitialized)
387  {
388  PGEventResultCopy evt;
389 
390  evt.src = src;
391  evt.dest = dest;
392  if (dest->events[i].proc(PGEVT_RESULTCOPY, &evt,
393  dest->events[i].passThrough))
394  dest->events[i].resultInitialized = true;
395  }
396  }
397 
398  return dest;
399 }
int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs)
Definition: fe-exec.c:249
void PQclear(PGresult *res)
Definition: fe-exec.c:721
static PGEvent * dupEvents(PGEvent *events, int count, size_t *memSize)
Definition: fe-exec.c:408
PGresult * PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status)
Definition: fe-exec.c:159
int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len)
Definition: fe-exec.c:452
@ PGEVT_RESULTCOPY
Definition: libpq-events.h:33
#define PG_COPYRES_TUPLES
Definition: libpq-fe.h:46
#define PG_COPYRES_ATTRS
Definition: libpq-fe.h:45
#define PG_COPYRES_EVENTS
Definition: libpq-fe.h:47
#define PG_COPYRES_NOTICEHOOKS
Definition: libpq-fe.h:48
const PGresult * src
Definition: libpq-events.h:60
PGresult * dest
Definition: libpq-events.h:61
int ntups
Definition: libpq-int.h:172
int numAttributes
Definition: libpq-int.h:173
int client_encoding
Definition: libpq-int.h:192
char * value
Definition: libpq-int.h:141

References pg_result::attDescs, pg_result::client_encoding, pg_result::cmdStatus, generate_unaccent_rules::dest, PGEventResultCopy::dest, dupEvents(), pg_result::events, i, pgresAttValue::len, pg_result::nEvents, pg_result::noticeHooks, pg_result::ntups, pg_result::numAttributes, PG_COPYRES_ATTRS, PG_COPYRES_EVENTS, PG_COPYRES_NOTICEHOOKS, PG_COPYRES_TUPLES, PGEVT_RESULTCOPY, PGRES_TUPLES_OK, PQclear(), PQmakeEmptyPGresult(), PQsetResultAttrs(), PQsetvalue(), PGEvent::resultInitialized, PGEventResultCopy::src, pg_result::tuples, and pgresAttValue::value.

Referenced by pqRowProcessor().

◆ PQdb()

◆ PQdefaultSSLKeyPassHook_OpenSSL()

int PQdefaultSSLKeyPassHook_OpenSSL ( char *  buf,
int  size,
PGconn conn 
)

Definition at line 2070 of file fe-secure-openssl.c.

2071 {
2072  if (conn && conn->sslpassword)
2073  {
2074  if (strlen(conn->sslpassword) + 1 > size)
2075  fprintf(stderr, libpq_gettext("WARNING: sslpassword truncated\n"));
2076  strncpy(buf, conn->sslpassword, size);
2077  buf[size - 1] = '\0';
2078  return strlen(buf);
2079  }
2080  else
2081  {
2082  buf[0] = '\0';
2083  return 0;
2084  }
2085 }
#define fprintf
Definition: port.h:242
static pg_noinline void Size size
Definition: slab.c:607
char * sslpassword
Definition: libpq-int.h:401

References buf, conn, fprintf, libpq_gettext, size, and pg_conn::sslpassword.

Referenced by PQssl_passwd_cb().

◆ PQdescribePortal()

PGresult* PQdescribePortal ( PGconn conn,
const char *  portal 
)

Definition at line 2474 of file fe-exec.c.

2475 {
2476  if (!PQexecStart(conn))
2477  return NULL;
2478  if (!PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal))
2479  return NULL;
2480  return PQexecFinish(conn);
2481 }
#define PqMsg_Describe
Definition: protocol.h:21

References conn, PQexecFinish(), PQexecStart(), PqMsg_Describe, and PQsendTypedCommand().

Referenced by test_prepared().

◆ PQdescribePrepared()

PGresult* PQdescribePrepared ( PGconn conn,
const char *  stmt 
)

Definition at line 2455 of file fe-exec.c.

2456 {
2457  if (!PQexecStart(conn))
2458  return NULL;
2460  return NULL;
2461  return PQexecFinish(conn);
2462 }

References conn, PQexecFinish(), PQexecStart(), PqMsg_Describe, PQsendTypedCommand(), and stmt.

Referenced by DescribeQuery(), ECPGdescribe(), and test_prepared().

◆ PQdisplayTuples()

void PQdisplayTuples ( const PGresult res,
FILE *  fp,
int  fillAlign,
const char *  fieldSep,
int  printHeader,
int  quiet 
)

Definition at line 574 of file fe-print.c.

581 {
582 #define DEFAULT_FIELD_SEP " "
583 
584  int i,
585  j;
586  int nFields;
587  int nTuples;
588  int *fLength = NULL;
589 
590  if (fieldSep == NULL)
591  fieldSep = DEFAULT_FIELD_SEP;
592 
593  /* Get some useful info about the results */
594  nFields = PQnfields(res);
595  nTuples = PQntuples(res);
596 
597  if (fp == NULL)
598  fp = stdout;
599 
600  /* Figure the field lengths to align to */
601  /* will be somewhat time consuming for very large results */
602  if (fillAlign)
603  {
604  fLength = (int *) malloc(nFields * sizeof(int));
605  if (!fLength)
606  {
607  fprintf(stderr, libpq_gettext("out of memory\n"));
608  return;
609  }
610 
611  for (j = 0; j < nFields; j++)
612  {
613  fLength[j] = strlen(PQfname(res, j));
614  for (i = 0; i < nTuples; i++)
615  {
616  int flen = PQgetlength(res, i, j);
617 
618  if (flen > fLength[j])
619  fLength[j] = flen;
620  }
621  }
622  }
623 
624  if (printHeader)
625  {
626  /* first, print out the attribute names */
627  for (i = 0; i < nFields; i++)
628  {
629  fputs(PQfname(res, i), fp);
630  if (fillAlign)
631  fill(strlen(PQfname(res, i)), fLength[i], ' ', fp);
632  fputs(fieldSep, fp);
633  }
634  fprintf(fp, "\n");
635 
636  /* Underline the attribute names */
637  for (i = 0; i < nFields; i++)
638  {
639  if (fillAlign)
640  fill(0, fLength[i], '-', fp);
641  fputs(fieldSep, fp);
642  }
643  fprintf(fp, "\n");
644  }
645 
646  /* next, print out the instances */
647  for (i = 0; i < nTuples; i++)
648  {
649  for (j = 0; j < nFields; j++)
650  {
651  fprintf(fp, "%s", PQgetvalue(res, i, j));
652  if (fillAlign)
653  fill(strlen(PQgetvalue(res, i, j)), fLength[j], ' ', fp);
654  fputs(fieldSep, fp);
655  }
656  fprintf(fp, "\n");
657  }
658 
659  if (!quiet)
660  fprintf(fp, "\nQuery returned %d row%s.\n", PQntuples(res),
661  (PQntuples(res) == 1) ? "" : "s");
662 
663  fflush(fp);
664 
665  free(fLength);
666 }
int PQgetlength(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3887
char * PQfname(const PGresult *res, int field_num)
Definition: fe-exec.c:3567
int PQnfields(const PGresult *res)
Definition: fe-exec.c:3489
static void fill(int length, int max, char filler, FILE *fp)
Definition: fe-print.c:755
#define DEFAULT_FIELD_SEP
#define malloc(a)
Definition: header.h:50
static void const char fflush(stdout)

References DEFAULT_FIELD_SEP, fflush(), fill(), fprintf, free, i, j, libpq_gettext, malloc, PQfname(), PQgetlength(), PQgetvalue(), PQnfields(), PQntuples(), res, and generate_unaccent_rules::stdout.

◆ PQdsplen()

int PQdsplen ( const char *  s,
int  encoding 
)

Definition at line 1229 of file fe-misc.c.

1230 {
1231  return pg_encoding_dsplen(encoding, s);
1232 }
int pg_encoding_dsplen(int encoding, const char *mbstr)
Definition: wchar.c:2090

References encoding, and pg_encoding_dsplen().

Referenced by get_prompt(), pg_wcsformat(), pg_wcssize(), pg_wcswidth(), and strlen_max_width().

◆ PQencryptPassword()

char* PQencryptPassword ( const char *  passwd,
const char *  user 
)

Definition at line 1233 of file fe-auth.c.

1234 {
1235  char *crypt_pwd;
1236  const char *errstr = NULL;
1237 
1238  crypt_pwd = malloc(MD5_PASSWD_LEN + 1);
1239  if (!crypt_pwd)
1240  return NULL;
1241 
1242  if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd, &errstr))
1243  {
1244  free(crypt_pwd);
1245  return NULL;
1246  }
1247 
1248  return crypt_pwd;
1249 }
#define MD5_PASSWD_LEN
Definition: md5.h:26
bool pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len, char *buf, const char **errstr)
Definition: md5_common.c:145

References free, malloc, MD5_PASSWD_LEN, pg_md5_encrypt(), and user.

◆ PQencryptPasswordConn()

char* PQencryptPasswordConn ( PGconn conn,
const char *  passwd,
const char *  user,
const char *  algorithm 
)

Definition at line 1276 of file fe-auth.c.

1278 {
1279 #define MAX_ALGORITHM_NAME_LEN 50
1280  char algobuf[MAX_ALGORITHM_NAME_LEN + 1];
1281  char *crypt_pwd = NULL;
1282 
1283  if (!conn)
1284  return NULL;
1285 
1287 
1288  /* If no algorithm was given, ask the server. */
1289  if (algorithm == NULL)
1290  {
1291  PGresult *res;
1292  char *val;
1293 
1294  res = PQexec(conn, "show password_encryption");
1295  if (res == NULL)
1296  {
1297  /* PQexec() should've set conn->errorMessage already */
1298  return NULL;
1299  }
1301  {
1302  /* PQexec() should've set conn->errorMessage already */
1303  PQclear(res);
1304  return NULL;
1305  }
1306  if (PQntuples(res) != 1 || PQnfields(res) != 1)
1307  {
1308  PQclear(res);
1309  libpq_append_conn_error(conn, "unexpected shape of result set returned for SHOW");
1310  return NULL;
1311  }
1312  val = PQgetvalue(res, 0, 0);
1313 
1314  if (strlen(val) > MAX_ALGORITHM_NAME_LEN)
1315  {
1316  PQclear(res);
1317  libpq_append_conn_error(conn, "\"password_encryption\" value too long");
1318  return NULL;
1319  }
1320  strcpy(algobuf, val);
1321  PQclear(res);
1322 
1323  algorithm = algobuf;
1324  }
1325 
1326  /*
1327  * Also accept "on" and "off" as aliases for "md5", because
1328  * password_encryption was a boolean before PostgreSQL 10. We refuse to
1329  * send the password in plaintext even if it was "off".
1330  */
1331  if (strcmp(algorithm, "on") == 0 ||
1332  strcmp(algorithm, "off") == 0)
1333  algorithm = "md5";
1334 
1335  /*
1336  * Ok, now we know what algorithm to use
1337  */
1338  if (strcmp(algorithm, "scram-sha-256") == 0)
1339  {
1340  const char *errstr = NULL;
1341 
1342  crypt_pwd = pg_fe_scram_build_secret(passwd,
1344  &errstr);
1345  if (!crypt_pwd)
1346  libpq_append_conn_error(conn, "could not encrypt password: %s", errstr);
1347  }
1348  else if (strcmp(algorithm, "md5") == 0)
1349  {
1350  crypt_pwd = malloc(MD5_PASSWD_LEN + 1);
1351  if (crypt_pwd)
1352  {
1353  const char *errstr = NULL;
1354 
1355  if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd, &errstr))
1356  {
1357  libpq_append_conn_error(conn, "could not encrypt password: %s", errstr);
1358  free(crypt_pwd);
1359  crypt_pwd = NULL;
1360  }
1361  }
1362  else
1363  libpq_append_conn_error(conn, "out of memory");
1364  }
1365  else
1366  {
1367  libpq_append_conn_error(conn, "unrecognized password encryption algorithm \"%s\"",
1368  algorithm);
1369  return NULL;
1370  }
1371 
1372  return crypt_pwd;
1373 }
char * pg_fe_scram_build_secret(const char *password, int iterations, const char **errstr)
#define MAX_ALGORITHM_NAME_LEN
int scram_sha_256_iterations
Definition: libpq-int.h:559

References conn, free, libpq_append_conn_error(), malloc, MAX_ALGORITHM_NAME_LEN, MD5_PASSWD_LEN, pg_fe_scram_build_secret(), pg_md5_encrypt(), PGRES_TUPLES_OK, PQclear(), pqClearConnErrorState, PQexec(), PQgetvalue(), PQnfields(), PQntuples(), PQresultStatus(), res, pg_conn::scram_sha_256_iterations, user, and val.

Referenced by main(), and PQchangePassword().

◆ PQendcopy()

int PQendcopy ( PGconn conn)

Definition at line 2949 of file fe-exec.c.

2950 {
2951  if (!conn)
2952  return 0;
2953 
2954  return pqEndcopy3(conn);
2955 }
int pqEndcopy3(PGconn *conn)

References conn, and pqEndcopy3().

Referenced by ecpg_check_PQresult(), initPopulateTable(), and libpqrcv_endstreaming().

◆ PQenterPipelineMode()

int PQenterPipelineMode ( PGconn conn)

Definition at line 3042 of file fe-exec.c.

3043 {
3044  if (!conn)
3045  return 0;
3046 
3047  /* succeed with no action if already in pipeline mode */
3049  return 1;
3050 
3051  if (conn->asyncStatus != PGASYNC_IDLE)
3052  {
3053  libpq_append_conn_error(conn, "cannot enter pipeline mode, connection not idle");
3054  return 0;
3055  }
3056 
3058 
3059  return 1;
3060 }

References pg_conn::asyncStatus, conn, libpq_append_conn_error(), PGASYNC_IDLE, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, and PQ_PIPELINE_ON.

Referenced by executeMetaCommand(), test_disallowed_in_pipeline(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), test_transaction(), and test_uniqviol().

◆ PQenv2encoding()

int PQenv2encoding ( void  )

Definition at line 1238 of file fe-misc.c.

1239 {
1240  char *str;
1241  int encoding = PG_SQL_ASCII;
1242 
1243  str = getenv("PGCLIENTENCODING");
1244  if (str && *str != '\0')
1245  {
1247  if (encoding < 0)
1249  }
1250  return encoding;
1251 }
const char * str
@ PG_SQL_ASCII
Definition: pg_wchar.h:226
#define pg_char_to_encoding
Definition: pg_wchar.h:629

References encoding, pg_char_to_encoding, PG_SQL_ASCII, and str.

Referenced by main().

◆ PQerrorMessage()

char* PQerrorMessage ( const PGconn conn)

Definition at line 7171 of file fe-connect.c.

7172 {
7173  if (!conn)
7174  return libpq_gettext("connection pointer is NULL\n");
7175 
7176  /*
7177  * The errorMessage buffer might be marked "broken" due to having
7178  * previously failed to allocate enough memory for the message. In that
7179  * case, tell the application we ran out of memory.
7180  */
7182  return libpq_gettext("out of memory\n");
7183 
7184  return conn->errorMessage.data;
7185 }
#define PQExpBufferBroken(str)
Definition: pqexpbuffer.h:59

References conn, PQExpBufferData::data, pg_conn::errorMessage, libpq_gettext, and PQExpBufferBroken.

Referenced by _doSetSessionAuth(), _printTableAccessMethodNoStorage(), _selectOutputSchema(), _selectTableAccessMethod(), _selectTablespace(), AcceptResult(), advanceConnectionState(), BaseBackup(), check_loadable_libraries(), check_prepare_conn(), CheckCopyStreamStop(), cluster_one_database(), compile_database_list(), compile_relation_list_one_db(), confirm_query_canceled_impl(), connect_database(), connect_pg_server(), ConnectDatabase(), connectDatabase(), connectToServer(), copy_connection(), CopyStreamPoll(), CopyStreamReceive(), CreateReplicationSlot(), dblink_connect(), dblink_error_message(), dblink_get_conn(), dblink_res_error(), dblink_send_query(), DescribeQuery(), die_on_query_failure(), do_connect(), do_lo_export(), do_lo_import(), do_lo_unlink(), doConnect(), DropReplicationSlot(), dump_lo_buf(), dumpLOs(), dumpTableData_copy(), ecpg_check_PQresult(), ecpg_raise_backend(), ECPGconnect(), EndDBCopyMode(), exec_command_password(), ExecQueryAndProcessResults(), executeCommand(), executeQuery(), executeQueryOrDie(), ExecuteSqlCommand(), ExecuteSqlCommandBuf(), executeStatement(), GetConnection(), GetSlotInformation(), GetTableInfo(), handleCopyIn(), handleCopyOut(), HandleEndOfCopyStream(), initPopulateTable(), libpqrcv_alter_slot(), libpqrcv_connect(), libpqrcv_create_slot(), libpqrcv_endstreaming(), libpqrcv_exec(), libpqrcv_identify_system(), libpqrcv_readtimelinehistoryfile(), libpqrcv_receive(), libpqrcv_send(), libpqrcv_startstreaming(), main(), my_truncate(), overwrite(), pgfdw_cancel_query_end(), pgfdw_report_error(), pickout(), PQcancelErrorMessage(), prepareCommand(), process_queued_fetch_requests(), process_result(), ProcessXLogDataMsg(), psql_get_variable(), readCommandResponse(), ReceiveCopyData(), RetrieveDataDirCreatePerm(), RetrieveWalSegSize(), run_command(), run_permutation(), run_reindex_command(), run_vacuum_command(), RunIdentifySystem(), send_cancellable_query_impl(), sendFeedback(), SendQuery(), sql_conn(), sql_exec(), start_postmaster(), StartRestoreLO(), storeQueryResult(), StreamLogicalLog(), TableCommandResultHandler(), test_cancel(), test_disallowed_in_pipeline(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), test_transaction(), test_uniqviol(), threadRun(), try_complete_step(), tryExecuteStatement(), vacuumlo(), verify_btree_slot_handler(), verify_heap_slot_handler(), and wait_for_connection_state().

◆ PQescapeBytea()

unsigned char* PQescapeBytea ( const unsigned char *  from,
size_t  from_length,
size_t *  to_length 
)

Definition at line 4469 of file fe-exec.c.

4470 {
4471  return PQescapeByteaInternal(NULL, from, from_length, to_length,
4473  false /* can't use hex */ );
4474 }
static unsigned char * PQescapeByteaInternal(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length, bool std_strings, bool use_hex)
Definition: fe-exec.c:4357
static bool static_std_strings
Definition: fe-exec.c:60

References PQescapeByteaInternal(), and static_std_strings.

◆ PQescapeByteaConn()

unsigned char* PQescapeByteaConn ( PGconn conn,
const unsigned char *  from,
size_t  from_length,
size_t *  to_length 
)

Definition at line 4453 of file fe-exec.c.

4456 {
4457  if (!conn)
4458  return NULL;
4459 
4460  if (conn->cmd_queue_head == NULL)
4462 
4463  return PQescapeByteaInternal(conn, from, from_length, to_length,
4464  conn->std_strings,
4465  (conn->sversion >= 90000));
4466 }
bool std_strings
Definition: libpq-int.h:512
PGcmdQueueEntry * cmd_queue_head
Definition: libpq-int.h:463

References pg_conn::cmd_queue_head, conn, pqClearConnErrorState, PQescapeByteaInternal(), pg_conn::std_strings, and pg_conn::sversion.

◆ PQescapeIdentifier()

char* PQescapeIdentifier ( PGconn conn,
const char *  str,
size_t  len 
)

Definition at line 4310 of file fe-exec.c.

4311 {
4312  return PQescapeInternal(conn, str, len, true);
4313 }
static char * PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident)
Definition: fe-exec.c:4182

References conn, len, PQescapeInternal(), and str.

Referenced by create_publication(), create_subscription(), drop_publication(), enable_subscription(), initCreatePKeys(), initCreateTables(), main(), PQchangePassword(), psql_get_variable(), stringlist_to_identifierstr(), and vacuumlo().

◆ PQescapeLiteral()

◆ PQescapeString()

size_t PQescapeString ( char *  to,
const char *  from,
size_t  length 
)

Definition at line 4167 of file fe-exec.c.

4168 {
4169  return PQescapeStringInternal(NULL, to, from, length, NULL,
4172 }
static size_t PQescapeStringInternal(PGconn *conn, char *to, const char *from, size_t length, int *error, int encoding, bool std_strings)
Definition: fe-exec.c:4071
static int static_client_encoding
Definition: fe-exec.c:59

References PQescapeStringInternal(), static_client_encoding, and static_std_strings.

Referenced by get_comma_elts(), and quote_postgres().

◆ PQescapeStringConn()

size_t PQescapeStringConn ( PGconn conn,
char *  to,
const char *  from,
size_t  length,
int *  error 
)

Definition at line 4145 of file fe-exec.c.

4148 {
4149  if (!conn)
4150  {
4151  /* force empty-string result */
4152  *to = '\0';
4153  if (error)
4154  *error = 1;
4155  return 0;
4156  }
4157 
4158  if (conn->cmd_queue_head == NULL)
4160 
4161  return PQescapeStringInternal(conn, to, from, length, error,
4163  conn->std_strings);
4164 }
static void error(void)
Definition: sql-dyntest.c:147

References pg_conn::client_encoding, pg_conn::cmd_queue_head, conn, error(), pqClearConnErrorState, PQescapeStringInternal(), and pg_conn::std_strings.

Referenced by AppendStringCommandOption(), appendStringLiteralConn(), check_loadable_libraries(), and do_lo_import().

◆ PQexec()

PGresult* PQexec ( PGconn conn,
const char *  query 
)

Definition at line 2262 of file fe-exec.c.

2263 {
2264  if (!PQexecStart(conn))
2265  return NULL;
2266  if (!PQsendQuery(conn, query))
2267  return NULL;
2268  return PQexecFinish(conn);
2269 }
int PQsendQuery(PGconn *conn, const char *query)
Definition: fe-exec.c:1416

References conn, PQexecFinish(), PQexecStart(), and PQsendQuery().

Referenced by _doSetSessionAuth(), _printTableAccessMethodNoStorage(), _selectOutputSchema(), _selectTableAccessMethod(), _selectTablespace(), check_and_drop_existing_subscriptions(), check_loadable_libraries(), check_prepare_conn(), check_publisher(), check_subscriber(), connect_database(), create_logical_replication_slot(), create_publication(), create_subscription(), CreateReplicationSlot(), deallocate_one(), DescribeQuery(), drop_existing_subscriptions(), drop_failover_replication_slots(), drop_publication(), drop_replication_slot(), DropReplicationSlot(), ecpg_autostart_transaction(), ecpg_execute(), ECPGsetcommit(), ECPGtrans(), enable_subscription(), executeCommand(), executeMaintenanceCommand(), executeQuery(), executeQueryOrDie(), ExecuteSqlCommand(), ExecuteSqlQuery(), ExecuteSqlStatement(), executeStatement(), generate_object_name(), get_create_object_cmd(), get_primary_sysid(), GetConnection(), GetSlotInformation(), GetTableInfo(), init_libpq_conn(), initPopulateTable(), libpq_traverse_files(), lo_initialize(), lockTableForWorker(), lookup_object_oid(), main(), PQchangePassword(), PQencryptPasswordConn(), PQsetClientEncoding(), PSQLexec(), ReceiveXlogStream(), RetrieveDataDirCreatePerm(), RetrieveWalSegSize(), run_permutation(), run_simple_command(), run_simple_query(), RunIdentifySystem(), SendQuery(), server_is_in_recovery(), set_replication_progress(), sql_conn(), sql_exec(), StreamLogicalLog(), test_disallowed_in_pipeline(), test_pipeline_abort(), test_prepared(), test_transaction(), test_uniqviol(), tryExecuteStatement(), and vacuumlo().

◆ PQexecParams()

PGresult* PQexecParams ( PGconn conn,
const char *  command,
int  nParams,
const Oid paramTypes,
const char *const *  paramValues,
const int *  paramLengths,
const int *  paramFormats,
int  resultFormat 
)

Definition at line 2276 of file fe-exec.c.

2284 {
2285  if (!PQexecStart(conn))
2286  return NULL;
2287  if (!PQsendQueryParams(conn, command,
2288  nParams, paramTypes, paramValues, paramLengths,
2289  paramFormats, resultFormat))
2290  return NULL;
2291  return PQexecFinish(conn);
2292 }
int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1492

References conn, PQexecFinish(), PQexecStart(), and PQsendQueryParams().

Referenced by ecpg_execute(), libpq_fetch_file(), main(), and wait_for_connection_state().

◆ PQexecPrepared()

PGresult* PQexecPrepared ( PGconn conn,
const char *  stmtName,
int  nParams,
const char *const *  paramValues,
const int *  paramLengths,
const int *  paramFormats,
int  resultFormat 
)

Definition at line 2323 of file fe-exec.c.

2330 {
2331  if (!PQexecStart(conn))
2332  return NULL;
2333  if (!PQsendQueryPrepared(conn, stmtName,
2334  nParams, paramValues, paramLengths,
2335  paramFormats, resultFormat))
2336  return NULL;
2337  return PQexecFinish(conn);
2338 }
int PQsendQueryPrepared(PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1633

References conn, PQexecFinish(), PQexecStart(), and PQsendQueryPrepared().

Referenced by ecpg_execute(), and try_complete_step().

◆ PQexitPipelineMode()

int PQexitPipelineMode ( PGconn conn)

Definition at line 3073 of file fe-exec.c.

3074 {
3075  if (!conn)
3076  return 0;
3077 
3079  (conn->asyncStatus == PGASYNC_IDLE ||
3081  conn->cmd_queue_head == NULL)
3082  return 1;
3083 
3084  switch (conn->asyncStatus)
3085  {
3086  case PGASYNC_READY:
3087  case PGASYNC_READY_MORE:
3088  /* there are some uncollected results */
3089  libpq_append_conn_error(conn, "cannot exit pipeline mode with uncollected results");
3090  return 0;
3091 
3092  case PGASYNC_BUSY:
3093  libpq_append_conn_error(conn, "cannot exit pipeline mode while busy");
3094  return 0;
3095 
3096  case PGASYNC_IDLE:
3097  case PGASYNC_PIPELINE_IDLE:
3098  /* OK */
3099  break;
3100 
3101  case PGASYNC_COPY_IN:
3102  case PGASYNC_COPY_OUT:
3103  case PGASYNC_COPY_BOTH:
3104  libpq_append_conn_error(conn, "cannot exit pipeline mode while in COPY");
3105  }
3106 
3107  /* still work to process */
3108  if (conn->cmd_queue_head != NULL)
3109  {
3110  libpq_append_conn_error(conn, "cannot exit pipeline mode with uncollected results");
3111  return 0;
3112  }
3113 
3116 
3117  /* Flush any pending data in out buffer */
3118  if (pqFlush(conn) < 0)
3119  return 0; /* error message is setup already */
3120  return 1;
3121 }
@ PGASYNC_COPY_OUT
Definition: libpq-int.h:229
@ PGASYNC_READY_MORE
Definition: libpq-int.h:225
@ PGASYNC_READY
Definition: libpq-int.h:223
@ PGASYNC_COPY_BOTH
Definition: libpq-int.h:230
@ PGASYNC_COPY_IN
Definition: libpq-int.h:228
@ PGASYNC_PIPELINE_IDLE
Definition: libpq-int.h:231

References pg_conn::asyncStatus, pg_conn::cmd_queue_head, conn, libpq_append_conn_error(), PGASYNC_BUSY, PGASYNC_COPY_BOTH, PGASYNC_COPY_IN, PGASYNC_COPY_OUT, PGASYNC_IDLE, PGASYNC_PIPELINE_IDLE, PGASYNC_READY, PGASYNC_READY_MORE, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, and pqFlush().

Referenced by discardUntilSync(), readCommandResponse(), test_disallowed_in_pipeline(), test_multi_pipelines(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), and test_transaction().

◆ PQfformat()

int PQfformat ( const PGresult res,
int  field_num 
)

Definition at line 3708 of file fe-exec.c.

3709 {
3710  if (!check_field_number(res, field_num))
3711  return 0;
3712  if (res->attDescs)
3713  return res->attDescs[field_num].format;
3714  else
3715  return 0;
3716 }
static int check_field_number(const PGresult *res, int field_num)
Definition: fe-exec.c:3510

References pg_result::attDescs, check_field_number(), pgresAttDesc::format, and res.

Referenced by ecpg_get_data(), ecpg_store_result(), and process_queued_fetch_requests().

◆ PQfinish()

void PQfinish ( PGconn conn)

Definition at line 4892 of file fe-connect.c.

4893 {
4894  if (conn)
4895  {
4897  freePGconn(conn);
4898  }
4899 }
static void freePGconn(PGconn *conn)
Definition: fe-connect.c:4648

References conn, freePGconn(), and pqClosePGconn().

Referenced by appendQualifiedRelation(), BaseBackup(), check_for_data_types_usage(), check_for_incompatible_polymorphics(), check_for_isn_and_int8_passing_mismatch(), check_for_pg_role_prefix(), check_for_prepared_transactions(), check_for_tables_with_oids(), check_for_user_defined_encoding_conversions(), check_for_user_defined_postfix_ops(), check_is_install_user(), check_loadable_libraries(), check_new_cluster_logical_replication_slots(), check_new_cluster_subscription_configuration(), check_old_cluster_subscription_state(), check_proper_datallowconn(), CheckConnection(), cluster_all_databases(), cluster_one_database(), connect_database(), ConnectDatabase(), connectDatabase(), connectToServer(), create_logical_replication_slots(), create_new_objects(), disconnect_atexit(), disconnect_database(), DisconnectDatabase(), disconnectDatabase(), do_connect(), doConnect(), dumpRoleGUCPrivs(), dumpRoleMembership(), dumpTablespaces(), ecpg_finish(), executeCommand(), executeQuery(), executeQueryOrDie(), exit_nicely(), expand_dbname_patterns(), finishCon(), get_db_infos(), get_loadable_libraries(), get_old_cluster_logical_slot_infos(), get_parallel_object_list(), get_rel_infos(), get_subscription_count(), get_tablespace_paths(), get_template0_info(), GetConnection(), libpqrcv_connect(), libpqrcv_disconnect(), libpqsrv_connect_internal(), libpqsrv_disconnect(), LogStreamerMain(), main(), old_9_6_invalidate_hash_indexes(), PQcancelFinish(), PQping(), PQpingParams(), ReconnectToServer(), reindex_all_databases(), reindex_one_database(), report_extension_updates(), run_reindex_command(), runInitSteps(), set_frozenxids(), set_locale_and_encoding(), sql_conn(), sql_exec(), start_postmaster(), StreamLog(), StreamLogicalLog(), vacuum_all_databases(), vacuum_one_database(), and vacuumlo().

◆ PQflush()

int PQflush ( PGconn conn)

◆ PQfmod()

int PQfmod ( const PGresult res,
int  field_num 
)

Definition at line 3741 of file fe-exec.c.

3742 {
3743  if (!check_field_number(res, field_num))
3744  return 0;
3745  if (res->attDescs)
3746  return res->attDescs[field_num].atttypmod;
3747  else
3748  return 0;
3749 }
int atttypmod
Definition: libpq-fe.h:280

References pg_result::attDescs, pgresAttDesc::atttypmod, check_field_number(), and res.

Referenced by DescribeQuery(), and ECPGget_desc().

◆ PQfn()

PGresult* PQfn ( PGconn conn,
int  fnid,
int *  result_buf,
int *  result_len,
int  result_is_int,
const PQArgBlock args,
int  nargs 
)

Definition at line 2980 of file fe-exec.c.

2987 {
2988  *result_len = 0;
2989 
2990  if (!conn)
2991  return NULL;
2992 
2993  /*
2994  * Since this is the beginning of a query cycle, reset the error state.
2995  * However, in pipeline mode with something already queued, the error
2996  * buffer belongs to that command and we shouldn't clear it.
2997  */
2998  if (conn->cmd_queue_head == NULL)
3000 
3002  {
3003  libpq_append_conn_error(conn, "%s not allowed in pipeline mode", "PQfn");
3004  return NULL;
3005  }
3006 
3009  {
3010  libpq_append_conn_error(conn, "connection in wrong state");
3011  return NULL;
3012  }
3013 
3014  return pqFunctionCall3(conn, fnid,
3015  result_buf, result_len,
3016  result_is_int,
3017  args, nargs);
3018 }
PGresult * pqFunctionCall3(PGconn *conn, Oid fnid, int *result_buf, int *actual_result_len, int result_is_int, const PQArgBlock *args, int nargs)
#define pgHavePendingResult(conn)
Definition: libpq-int.h:893

References generate_unaccent_rules::args, pg_conn::asyncStatus, pg_conn::cmd_queue_head, conn, libpq_append_conn_error(), PGASYNC_IDLE, pgHavePendingResult, PGINVALID_SOCKET, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, pqClearConnErrorState, pqFunctionCall3(), and pg_conn::sock.

Referenced by lo_close(), lo_creat(), lo_create(), lo_lseek(), lo_lseek64(), lo_open(), lo_read(), lo_tell(), lo_tell64(), lo_truncate(), lo_truncate64(), lo_unlink(), and lo_write().

◆ PQfname()

char* PQfname ( const PGresult res,
int  field_num 
)

◆ PQfnumber()

int PQfnumber ( const PGresult res,
const char *  field_name 
)

Definition at line 3589 of file fe-exec.c.

3590 {
3591  char *field_case;
3592  bool in_quotes;
3593  bool all_lower = true;
3594  const char *iptr;
3595  char *optr;
3596  int i;
3597 
3598  if (!res)
3599  return -1;
3600 
3601  /*
3602  * Note: it is correct to reject a zero-length input string; the proper
3603  * input to match a zero-length field name would be "".
3604  */
3605  if (field_name == NULL ||
3606  field_name[0] == '\0' ||
3607  res->attDescs == NULL)
3608  return -1;
3609 
3610  /*
3611  * Check if we can avoid the strdup() and related work because the
3612  * passed-in string wouldn't be changed before we do the check anyway.
3613  */
3614  for (iptr = field_name; *iptr; iptr++)
3615  {
3616  char c = *iptr;
3617 
3618  if (c == '"' || c != pg_tolower((unsigned char) c))
3619  {
3620  all_lower = false;
3621  break;
3622  }
3623  }
3624 
3625  if (all_lower)
3626  for (i = 0; i < res->numAttributes; i++)
3627  if (strcmp(field_name, res->attDescs[i].name) == 0)
3628  return i;
3629 
3630  /* Fall through to the normal check if that didn't work out. */
3631 
3632  /*
3633  * Note: this code will not reject partially quoted strings, eg
3634  * foo"BAR"foo will become fooBARfoo when it probably ought to be an error
3635  * condition.
3636  */
3637  field_case = strdup(field_name);
3638  if (field_case == NULL)
3639  return -1; /* grotty */
3640 
3641  in_quotes = false;
3642  optr = field_case;
3643  for (iptr = field_case; *iptr; iptr++)
3644  {
3645  char c = *iptr;
3646 
3647  if (in_quotes)
3648  {
3649  if (c == '"')
3650  {
3651  if (iptr[1] == '"')
3652  {
3653  /* doubled quotes become a single quote */
3654  *optr++ = '"';
3655  iptr++;
3656  }
3657  else
3658  in_quotes = false;
3659  }
3660  else
3661  *optr++ = c;
3662  }
3663  else if (c == '"')
3664  in_quotes = true;
3665  else
3666  {
3667  c = pg_tolower((unsigned char) c);
3668  *optr++ = c;
3669  }
3670  }
3671  *optr = '\0';
3672 
3673  for (i = 0; i < res->numAttributes; i++)
3674  {
3675  if (strcmp(field_case, res->attDescs[i].name) == 0)
3676  {
3677  free(field_case);
3678  return i;
3679  }
3680  }
3681  free(field_case);
3682  return -1;
3683 }
unsigned char pg_tolower(unsigned char ch)
Definition: pgstrcasecmp.c:122

References pg_result::attDescs, free, i, pgresAttDesc::name, pg_result::numAttributes, pg_tolower(), and res.

Referenced by append_depends_on_extension(), binary_upgrade_set_type_oids_by_type_oid(), buildMatViewRefreshDependencies(), check_for_data_types_usage(), check_for_incompatible_polymorphics(), check_for_isn_and_int8_passing_mismatch(), check_for_pg_role_prefix(), check_for_tables_with_oids(), check_for_user_defined_encoding_conversions(), check_for_user_defined_postfix_ops(), check_proper_datallowconn(), collectComments(), collectSecLabels(), describeOneTableDetails(), dropRoles(), dumpAgg(), dumpBaseType(), dumpCollation(), dumpCompositeType(), dumpCompositeTypeColComments(), dumpConversion(), dumpDatabase(), dumpDomain(), dumpEnumType(), dumpFunc(), dumpOpclass(), dumpOpfamily(), dumpOpr(), dumpRangeType(), dumpRoleMembership(), dumpRoles(), dumpTableSchema(), dumpTSConfig(), dumpUserMappings(), get_db_infos(), get_old_cluster_logical_slot_infos(), get_rel_infos(), get_tablespace_paths(), get_template0_info(), getAccessMethods(), getAggregates(), getCasts(), getCollations(), getConstraints(), getConversions(), getDefaultACLs(), getDependencies(), getDomainConstraints(), getEventTriggers(), getExtendedStatistics(), getExtensionMembership(), getExtensions(), getForeignDataWrappers(), getForeignServers(), getFuncs(), getIndexes(), getInherits(), getLOs(), getNamespaces(), getOpclasses(), getOperators(), getOpfamilies(), getPolicies(), getProcLangs(), getPublicationNamespaces(), getPublications(), getPublicationTables(), getRules(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), getTables(), getTransforms(), getTriggers(), getTSConfigurations(), getTSDictionaries(), getTSParsers(), getTSTemplates(), getTypes(), old_9_6_invalidate_hash_indexes(), processExtensionTables(), report_extension_updates(), set_frozenxids(), and show_binary_results().

◆ PQfreeCancel()

void PQfreeCancel ( PGcancel cancel)

Definition at line 417 of file fe-cancel.c.

418 {
419  free(cancel);
420 }

References free.

Referenced by PQrequestCancel(), ResetCancelConn(), set_archive_cancel_info(), SetCancelConn(), and test_cancel().

◆ PQfreemem()

◆ PQfsize()

int PQfsize ( const PGresult res,
int  field_num 
)

Definition at line 3730 of file fe-exec.c.

3731 {
3732  if (!check_field_number(res, field_num))
3733  return 0;
3734  if (res->attDescs)
3735  return res->attDescs[field_num].typlen;
3736  else
3737  return 0;
3738 }

References pg_result::attDescs, check_field_number(), res, and pgresAttDesc::typlen.

Referenced by ecpg_build_compat_sqlda(), and ECPGget_desc().

◆ PQftable()

Oid PQftable ( const PGresult res,
int  field_num 
)

Definition at line 3686 of file fe-exec.c.

3687 {
3688  if (!check_field_number(res, field_num))
3689  return InvalidOid;
3690  if (res->attDescs)
3691  return res->attDescs[field_num].tableid;
3692  else
3693  return InvalidOid;
3694 }

References pg_result::attDescs, check_field_number(), InvalidOid, res, and pgresAttDesc::tableid.

◆ PQftablecol()

int PQftablecol ( const PGresult res,
int  field_num 
)

Definition at line 3697 of file fe-exec.c.

3698 {
3699  if (!check_field_number(res, field_num))
3700  return 0;
3701  if (res->attDescs)
3702  return res->attDescs[field_num].columnid;
3703  else
3704  return 0;
3705 }
int columnid
Definition: libpq-fe.h:276

References pg_result::attDescs, check_field_number(), pgresAttDesc::columnid, and res.

◆ PQftype()

Oid PQftype ( const PGresult res,
int  field_num 
)

◆ PQgetCancel()

PGcancel* PQgetCancel ( PGconn conn)

Definition at line 349 of file fe-cancel.c.

350 {
351  PGcancel *cancel;
352 
353  if (!conn)
354  return NULL;
355 
356  if (conn->sock == PGINVALID_SOCKET)
357  return NULL;
358 
359  cancel = malloc(sizeof(PGcancel));
360  if (cancel == NULL)
361  return NULL;
362 
363  memcpy(&cancel->raddr, &conn->raddr, sizeof(SockAddr));
364  cancel->be_pid = conn->be_pid;
365  cancel->be_key = conn->be_key;
366  /* We use -1 to indicate an unset connection option */
367  cancel->pgtcp_user_timeout = -1;
368  cancel->keepalives = -1;
369  cancel->keepalives_idle = -1;
370  cancel->keepalives_interval = -1;
371  cancel->keepalives_count = -1;
372  if (conn->pgtcp_user_timeout != NULL)
373  {
375  &cancel->pgtcp_user_timeout,
376  conn, "tcp_user_timeout"))
377  goto fail;
378  }
379  if (conn->keepalives != NULL)
380  {
382  &cancel->keepalives,
383  conn, "keepalives"))
384  goto fail;
385  }
386  if (conn->keepalives_idle != NULL)
387  {
389  &cancel->keepalives_idle,
390  conn, "keepalives_idle"))
391  goto fail;
392  }
393  if (conn->keepalives_interval != NULL)
394  {
396  &cancel->keepalives_interval,
397  conn, "keepalives_interval"))
398  goto fail;
399  }
400  if (conn->keepalives_count != NULL)
401  {
403  &cancel->keepalives_count,
404  conn, "keepalives_count"))
405  goto fail;
406  }
407 
408  return cancel;
409 
410 fail:
411  free(cancel);
412  return NULL;
413 }
char * keepalives_idle
Definition: libpq-int.h:391
char * keepalives
Definition: libpq-int.h:390
char * keepalives_interval
Definition: libpq-int.h:392
char * pgtcp_user_timeout
Definition: libpq-int.h:378
char * keepalives_count
Definition: libpq-int.h:394

References pg_cancel::be_key, pg_conn::be_key, pg_cancel::be_pid, pg_conn::be_pid, conn, free, pg_cancel::keepalives, pg_conn::keepalives, pg_cancel::keepalives_count, pg_conn::keepalives_count, pg_cancel::keepalives_idle, pg_conn::keepalives_idle, pg_cancel::keepalives_interval, pg_conn::keepalives_interval, malloc, PGINVALID_SOCKET, pg_cancel::pgtcp_user_timeout, pg_conn::pgtcp_user_timeout, pqParseIntParam(), pg_cancel::raddr, pg_conn::raddr, and pg_conn::sock.

Referenced by PQrequestCancel(), set_archive_cancel_info(), SetCancelConn(), and test_cancel().

◆ PQgetCopyData()

int PQgetCopyData ( PGconn conn,
char **  buffer,
int  async 
)

Definition at line 2816 of file fe-exec.c.

2817 {
2818  *buffer = NULL; /* for all failure cases */
2819  if (!conn)
2820  return -2;
2821  if (conn->asyncStatus != PGASYNC_COPY_OUT &&
2823  {
2824  libpq_append_conn_error(conn, "no COPY in progress");
2825  return -2;
2826  }
2827  return pqGetCopyData3(conn, buffer, async);
2828 }
int pqGetCopyData3(PGconn *conn, char **buffer, int async)

References pg_conn::asyncStatus, conn, libpq_append_conn_error(), PGASYNC_COPY_BOTH, PGASYNC_COPY_OUT, and pqGetCopyData3().

Referenced by CopyStreamReceive(), dumpTableData_copy(), ecpg_process_output(), handleCopyOut(), libpqrcv_receive(), ReceiveCopyData(), and StreamLogicalLog().

◆ PQgetCurrentTimeUSec()

pg_usec_time_t PQgetCurrentTimeUSec ( void  )

Definition at line 1185 of file fe-misc.c.

1186 {
1187  struct timeval tval;
1188 
1189  gettimeofday(&tval, NULL);
1190  return (pg_usec_time_t) tval.tv_sec * 1000000 + tval.tv_usec;
1191 }
pg_int64 pg_usec_time_t
Definition: libpq-fe.h:205
int gettimeofday(struct timeval *tp, void *tzp)

References gettimeofday().

Referenced by pqConnectDBComplete(), PQsocketPoll(), and wait_until_connected().

◆ PQgetgssctx()

void* PQgetgssctx ( PGconn conn)

Definition at line 724 of file fe-secure-gssapi.c.

725 {
726  if (!conn)
727  return NULL;
728 
729  return conn->gctx;
730 }

References conn.

◆ PQgetisnull()

int PQgetisnull ( const PGresult res,
int  tup_num,
int  field_num 
)

Definition at line 3901 of file fe-exec.c.

3902 {
3903  if (!check_tuple_field_number(res, tup_num, field_num))
3904  return 1; /* pretend it is null */
3905  if (res->tuples[tup_num][field_num].len == NULL_LEN)
3906  return 1;
3907  else
3908  return 0;
3909 }
static int check_tuple_field_number(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3525
#define NULL_LEN
Definition: libpq-int.h:136

References check_tuple_field_number(), pgresAttValue::len, NULL_LEN, res, and pg_result::tuples.

Referenced by addFooterToPublicationDesc(), BaseBackup(), compile_database_list(), compile_relation_list_one_db(), describeOneTableDetails(), dumpAgg(), dumpBaseType(), dumpCollation(), dumpDatabase(), dumpDomain(), dumpFunc(), dumpRangeType(), dumpRoles(), dumpTableData_insert(), ecpg_get_data(), ecpg_set_compat_sqlda(), ecpg_set_native_sqlda(), ECPGget_desc(), ExecQueryTuples(), get_template0_info(), getAggregates(), getExtendedStatistics(), getForeignDataWrappers(), getForeignServers(), getFuncs(), getLOs(), getNamespaces(), getPolicies(), getProcLangs(), getPublicationTables(), GetSlotInformation(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), GetTableInfo(), getTables(), getTSDictionaries(), getTypes(), libpq_fetch_file(), libpq_traverse_files(), libpqrcv_create_slot(), libpqrcv_processTuples(), listTSConfigsVerbose(), listTSParsersVerbose(), make_tuple_from_result_row(), materializeResult(), postgresImportForeignSchema(), printCrosstab(), printQuery(), PrintResultInCrosstab(), process_queued_fetch_requests(), run_simple_query(), RunIdentifySystem(), sqlda_common_total_size(), StoreQueryTuple(), storeRow(), vacuum_one_database(), and verify_heap_slot_handler().

◆ PQgetlength()

int PQgetlength ( const PGresult res,
int  tup_num,
int  field_num 
)

Definition at line 3887 of file fe-exec.c.

3888 {
3889  if (!check_tuple_field_number(res, tup_num, field_num))
3890  return 0;
3891  if (res->tuples[tup_num][field_num].len != NULL_LEN)
3892  return res->tuples[tup_num][field_num].len;
3893  else
3894  return 0;
3895 }

References check_tuple_field_number(), pgresAttValue::len, NULL_LEN, res, and pg_result::tuples.

Referenced by createViewAsClause(), do_field(), ecpg_get_data(), ecpg_store_result(), ECPGget_desc(), libpq_fetch_file(), libpqrcv_readtimelinehistoryfile(), PQdisplayTuples(), process_queued_fetch_requests(), and show_binary_results().

◆ PQgetline()

int PQgetline ( PGconn conn,
char *  buffer,
int  length 
)

Definition at line 2854 of file fe-exec.c.

2855 {
2856  if (!buffer || length <= 0)
2857  return EOF;
2858  *buffer = '\0';
2859  /* length must be at least 3 to hold the \. terminator! */
2860  if (length < 3)
2861  return EOF;
2862 
2863  if (!conn)
2864  return EOF;
2865 
2866  return pqGetline3(conn, buffer, length);
2867 }
int pqGetline3(PGconn *conn, char *s, int maxlen)

References conn, and pqGetline3().

◆ PQgetlineAsync()

int PQgetlineAsync ( PGconn conn,
char *  buffer,
int  bufsize 
)

Definition at line 2901 of file fe-exec.c.

2902 {
2903  if (!conn)
2904  return -1;
2905 
2906  return pqGetlineAsync3(conn, buffer, bufsize);
2907 }
int pqGetlineAsync3(PGconn *conn, char *buffer, int bufsize)
#define bufsize
Definition: indent_globs.h:36

References bufsize, conn, and pqGetlineAsync3().

Referenced by pqGetline3().

◆ PQgetResult()

PGresult* PQgetResult ( PGconn conn)

Definition at line 2062 of file fe-exec.c.

2063 {
2064  PGresult *res;
2065 
2066  if (!conn)
2067  return NULL;
2068 
2069  /* Parse any available data, if our state permits. */
2070  parseInput(conn);
2071 
2072  /* If not ready to return something, block until we are. */
2073  while (conn->asyncStatus == PGASYNC_BUSY)
2074  {
2075  int flushResult;
2076 
2077  /*
2078  * If data remains unsent, send it. Else we might be waiting for the
2079  * result of a command the backend hasn't even got yet.
2080  */
2081  while ((flushResult = pqFlush(conn)) > 0)
2082  {
2083  if (pqWait(false, true, conn))
2084  {
2085  flushResult = -1;
2086  break;
2087  }
2088  }
2089 
2090  /*
2091  * Wait for some more data, and load it. (Note: if the connection has
2092  * been lost, pqWait should return immediately because the socket
2093  * should be read-ready, either with the last server data or with an
2094  * EOF indication. We expect therefore that this won't result in any
2095  * undue delay in reporting a previous write failure.)
2096  */
2097  if (flushResult ||
2098  pqWait(true, false, conn) ||
2099  pqReadData(conn) < 0)
2100  {
2101  /* Report the error saved by pqWait or pqReadData */
2104  return pqPrepareAsyncResult(conn);
2105  }
2106 
2107  /* Parse it. */
2108  parseInput(conn);
2109 
2110  /*
2111  * If we had a write error, but nothing above obtained a query result
2112  * or detected a read error, report the write error.
2113  */
2115  {
2118  return pqPrepareAsyncResult(conn);
2119  }
2120  }
2121 
2122  /* Return the appropriate thing. */
2123  switch (conn->asyncStatus)
2124  {
2125  case PGASYNC_IDLE:
2126  res = NULL; /* query is complete */
2127  break;
2128  case PGASYNC_PIPELINE_IDLE:
2130 
2131  /*
2132  * We're about to return the NULL that terminates the round of
2133  * results from the current query; prepare to send the results of
2134  * the next query, if any, when we're called next. If there's no
2135  * next element in the command queue, this gets us in IDLE state.
2136  */
2138  res = NULL; /* query is complete */
2139  break;
2140 
2141  case PGASYNC_READY:
2143 
2144  /*
2145  * Normally pqPrepareAsyncResult will have left conn->result
2146  * empty. Otherwise, "res" must be a not-full PGRES_TUPLES_CHUNK
2147  * result, which we want to return to the caller while staying in
2148  * PGASYNC_READY state. Then the next call here will return the
2149  * empty PGRES_TUPLES_OK result that was restored from
2150  * saved_result, after which we can proceed.
2151  */
2152  if (conn->result)
2153  {
2155  break;
2156  }
2157 
2158  /* Advance the queue as appropriate */
2159  pqCommandQueueAdvance(conn, false,
2161 
2163  {
2164  /*
2165  * We're about to send the results of the current query. Set
2166  * us idle now, and ...
2167  */
2169 
2170  /*
2171  * ... in cases when we're sending a pipeline-sync result,
2172  * move queue processing forwards immediately, so that next
2173  * time we're called, we're prepared to return the next result
2174  * received from the server. In all other cases, leave the
2175  * queue state change for next time, so that a terminating
2176  * NULL result is sent.
2177  *
2178  * (In other words: we don't return a NULL after a pipeline
2179  * sync.)
2180  */
2183  }
2184  else
2185  {
2186  /* Set the state back to BUSY, allowing parsing to proceed. */
2188  }
2189  break;
2190  case PGASYNC_READY_MORE:
2192  /* Set the state back to BUSY, allowing parsing to proceed. */
2194  break;
2195  case PGASYNC_COPY_IN:
2197  break;
2198  case PGASYNC_COPY_OUT:
2200  break;
2201  case PGASYNC_COPY_BOTH:
2203  break;
2204  default:
2205  libpq_append_conn_error(conn, "unexpected asyncStatus: %d", (int) conn->asyncStatus);
2207  conn->asyncStatus = PGASYNC_IDLE; /* try to restore valid state */
2209  break;
2210  }
2211 
2212  /* Time to fire PGEVT_RESULTCREATE events, if there are any */
2213  if (res && res->nEvents > 0)
2215 
2216  return res;
2217 }
static void pqSaveWriteError(PGconn *conn)
Definition: fe-exec.c:820
void pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, bool gotSync)
Definition: fe-exec.c:3142
void pqSaveErrorResult(PGconn *conn)
Definition: fe-exec.c:803
static PGresult * getCopyResult(PGconn *conn, ExecStatusType copytype)
Definition: fe-exec.c:2224
static void parseInput(PGconn *conn)
Definition: fe-exec.c:2020
static void pqPipelineProcessQueue(PGconn *conn)
Definition: fe-exec.c:3180
PGresult * pqPrepareAsyncResult(PGconn *conn)
Definition: fe-exec.c:851
int pqWait(int forRead, int forWrite, PGconn *conn)
Definition: fe-misc.c:978
int PQfireResultCreateEvents(PGconn *conn, PGresult *res)
Definition: libpq-events.c:185
bool write_failed
Definition: libpq-int.h:484
PGresult * result
Definition: libpq-int.h:552

References Assert, pg_conn::asyncStatus, conn, getCopyResult(), libpq_append_conn_error(), pg_result::nEvents, parseInput(), PGASYNC_BUSY, PGASYNC_COPY_BOTH, PGASYNC_COPY_IN, PGASYNC_COPY_OUT, PGASYNC_IDLE, PGASYNC_PIPELINE_IDLE, PGASYNC_READY, PGASYNC_READY_MORE, PGRES_COPY_BOTH, PGRES_COPY_IN, PGRES_COPY_OUT, PGRES_PIPELINE_SYNC, PGRES_TUPLES_CHUNK, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, pqCommandQueueAdvance(), PQfireResultCreateEvents(), pqFlush(), pqPipelineProcessQueue(), pqPrepareAsyncResult(), pqReadData(), pqSaveErrorResult(), pqSaveWriteError(), pqWait(), res, pg_conn::result, pg_result::resultStatus, and pg_conn::write_failed.

Referenced by advanceConnectionState(), BaseBackup(), ClearOrSaveAllResults(), confirm_query_canceled_impl(), consumeQueryResult(), discardUntilSync(), dumpTableData_copy(), ecpg_process_output(), EndDBCopyMode(), ExecQueryAndProcessResults(), handleCopyIn(), handleCopyOut(), HandleEndOfCopyStream(), libpqrcv_PQgetResult(), libpqsrv_get_result(), pgfdw_finish_pre_commit_cleanup(), pgfdw_get_cleanup_result(), PQconnectPoll(), pqEndcopy3(), PQexecFinish(), PQexecStart(), process_queued_fetch_requests(), process_result(), readCommandResponse(), ReceiveCopyData(), ReceiveXlogStream(), StreamLogicalLog(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), test_transaction(), test_uniqviol(), try_complete_step(), and wait_on_slots().

◆ PQgetssl()

void* PQgetssl ( PGconn conn)

Definition at line 1795 of file fe-secure-openssl.c.

1796 {
1797  if (!conn)
1798  return NULL;
1799  return conn->ssl;
1800 }

References conn.

◆ PQgetSSLKeyPassHook_OpenSSL()

PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL ( void  )

Definition at line 2088 of file fe-secure-openssl.c.

2089 {
2090  return PQsslKeyPassHook;
2091 }
static PQsslKeyPassHook_OpenSSL_type PQsslKeyPassHook

References PQsslKeyPassHook.

◆ PQgetvalue()

char* PQgetvalue ( const PGresult res,
int  tup_num,
int  field_num 
)

Definition at line 3876 of file fe-exec.c.

3877 {
3878  if (!check_tuple_field_number(res, tup_num, field_num))
3879  return NULL;
3880  return res->tuples[tup_num][field_num].value;
3881 }

References check_tuple_field_number(), res, pg_result::tuples, and pgresAttValue::value.

Referenced by _check_database_version(), add_tablespace_footer(), addFooterToPublicationDesc(), append_depends_on_extension(), appendQualifiedRelation(), BaseBackup(), binary_upgrade_set_type_oids_by_type_oid(), buildMatViewRefreshDependencies(), check_and_drop_existing_subscriptions(), check_for_data_types_usage(), check_for_incompatible_polymorphics(), check_for_isn_and_int8_passing_mismatch(), check_for_pg_role_prefix(), check_for_tables_with_oids(), check_for_user_defined_encoding_conversions(), check_for_user_defined_postfix_ops(), check_is_install_user(), check_new_cluster_logical_replication_slots(), check_new_cluster_subscription_configuration(), check_old_cluster_subscription_state(), check_proper_datallowconn(), check_publisher(), check_subscriber(), cluster_all_databases(), collectBinaryUpgradeClassOids(), collectComments(), collectRoleNames(), collectSecLabels(), compile_database_list(), compile_relation_list_one_db(), convertTSFunction(), create_logical_replication_slot(), createViewAsClause(), describeOneTableDetails(), describePublications(), describeRoles(), describeTableDetails(), do_field(), drop_failover_replication_slots(), dropDBs(), dropRoles(), dropTablespaces(), dumpAgg(), dumpBaseType(), dumpCollation(), dumpCompositeType(), dumpCompositeTypeColComments(), dumpConversion(), dumpDatabase(), dumpDatabaseConfig(), dumpDatabases(), dumpDomain(), dumpEnumType(), dumpForeignServer(), dumpFunc(), dumpOpclass(), dumpOpfamily(), dumpOpr(), dumpRangeType(), dumpRoleGUCPrivs(), dumpRoleMembership(), dumpRoles(), dumpRule(), dumpSearchPath(), dumpSequence(), dumpSequenceData(), dumpStatisticsExt(), dumpTable(), dumpTableAttach(), dumpTableData_insert(), dumpTableSchema(), dumpTablespaces(), dumpTSConfig(), dumpTSDictionary(), dumpUserConfig(), dumpUserMappings(), ecpg_get_data(), ecpg_set_compat_sqlda(), ecpg_set_native_sqlda(), ecpg_store_result(), emitShSecLabels(), exec_command_password(), ExecQueryTuples(), expand_dbname_patterns(), expand_extension_name_patterns(), expand_foreign_server_name_patterns(), expand_schema_name_patterns(), expand_table_name_patterns(), generate_object_name(), get_create_object_cmd(), get_db_infos(), get_language_name(), get_loadable_libraries(), get_next_possible_free_pg_type_oid(), get_old_cluster_logical_slot_infos(), get_parallel_object_list(), get_primary_sysid(), get_rel_infos(), get_remote_estimate(), get_subscription_count(), get_synchronized_snapshot(), get_tablespace_paths(), get_template0_info(), getAccessMethods(), getAdditionalACLs(), getAggregates(), getCasts(), getCollations(), getConstraints(), getConversions(), getDefaultACLs(), getDependencies(), getDomainConstraints(), getEventTriggers(), getExtendedStatistics(), getExtensionMembership(), getExtensions(), getForeignDataWrappers(), getForeignServers(), getFormattedTypeName(), getFuncs(), getIndexes(), getInherits(), getLOs(), getNamespaces(), getOpclasses(), getOperators(), getOpfamilies(), getPartitioningInfo(), getPolicies(), getProcLangs(), getPublicationNamespaces(), getPublications(), getPublicationTables(), getRules(), GetSlotInformation(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), GetTableInfo(), getTables(), getTransforms(), getTriggers(), getTSConfigurations(), getTSDictionaries(), getTSParsers(), getTSTemplates(), getTypes(), libpq_fetch_file(), libpq_traverse_files(), libpqrcv_create_slot(), libpqrcv_endstreaming(), libpqrcv_identify_system(), libpqrcv_processTuples(), libpqrcv_readtimelinehistoryfile(), listExtensionContents(), listSchemas(), listTSConfigsVerbose(), listTSParsersVerbose(), lo_initialize(), lookup_object_oid(), main(), make_tuple_from_result_row(), materializeResult(), old_9_6_invalidate_hash_indexes(), postgresAnalyzeForeignTable(), postgresGetAnalyzeInfoForForeignTable(), postgresImportForeignSchema(), PQconnectPoll(), PQdisplayTuples(), PQencryptPasswordConn(), PQprintTuples(), printCrosstab(), printQuery(), PrintResultInCrosstab(), process_queued_fetch_requests(), process_result(), processExtensionTables(), readCommandResponse(), ReadEndOfStreamingResult(), ReceiveXlogStream(), reindex_all_databases(), report_extension_updates(), RetrieveDataDirCreatePerm(), RetrieveWalSegSize(), run_simple_query(), RunIdentifySystem(), server_is_in_recovery(), set_frozenxids(), set_replication_progress(), show_binary_results(), sql_exec(), sqlda_common_total_size(), StoreQueryTuple(), storeRow(), test_pipeline_abort(), test_singlerowmode(), test_transaction(), try_complete_step(), vacuum_all_databases(), vacuum_one_database(), vacuumlo(), verify_heap_slot_handler(), and wait_for_connection_state().

◆ PQgssEncInUse()

int PQgssEncInUse ( PGconn conn)

Definition at line 736 of file fe-secure-gssapi.c.

737 {
738  if (!conn || !conn->gctx)
739  return 0;
740 
741  return conn->gssenc;
742 }

References conn.

Referenced by printGSSInfo().

◆ PQhost()

char* PQhost ( const PGconn conn)

Definition at line 7050 of file fe-connect.c.

7051 {
7052  if (!conn)
7053  return NULL;
7054 
7055  if (conn->connhost != NULL)
7056  {
7057  /*
7058  * Return the verbatim host value provided by user, or hostaddr in its
7059  * lack.
7060  */
7061  if (conn->connhost[conn->whichhost].host != NULL &&
7062  conn->connhost[conn->whichhost].host[0] != '\0')
7063  return conn->connhost[conn->whichhost].host;
7064  else if (conn->connhost[conn->whichhost].hostaddr != NULL &&
7065  conn->connhost[conn->whichhost].hostaddr[0] != '\0')
7066  return conn->connhost[conn->whichhost].hostaddr;
7067  }
7068 
7069  return "";
7070 }

References conn, pg_conn::connhost, pg_conn_host::host, pg_conn_host::hostaddr, and pg_conn::whichhost.

Referenced by do_connect(), exec_command_conninfo(), get_prompt(), libpqrcv_get_senderinfo(), main(), pg_GSS_load_servicename(), and SyncVariables().

◆ PQhostaddr()

char* PQhostaddr ( const PGconn conn)

Definition at line 7073 of file fe-connect.c.

7074 {
7075  if (!conn)
7076  return NULL;
7077 
7078  /* Return the parsed IP address */
7079  if (conn->connhost != NULL && conn->connip != NULL)
7080  return conn->connip;
7081 
7082  return "";
7083 }

References conn, pg_conn::connhost, and pg_conn::connip.

Referenced by do_connect(), and exec_command_conninfo().

◆ PQinitOpenSSL()

void PQinitOpenSSL ( int  do_ssl,
int  do_crypto 
)

Definition at line 127 of file fe-secure.c.

128 {
129 #ifdef USE_SSL
130  pgtls_init_library(do_ssl, do_crypto);
131 #endif
132 }
void pgtls_init_library(bool do_ssl, int do_crypto)

References pgtls_init_library().

◆ PQinitSSL()

void PQinitSSL ( int  do_init)

Definition at line 115 of file fe-secure.c.

116 {
117 #ifdef USE_SSL
119 #endif
120 }
static void do_init(void)
Definition: pg_ctl.c:902

References do_init(), and pgtls_init_library().

◆ PQisBusy()

int PQisBusy ( PGconn conn)

Definition at line 2031 of file fe-exec.c.

2032 {
2033  if (!conn)
2034  return false;
2035 
2036  /* Parse any available data, if our state permits. */
2037  parseInput(conn);
2038 
2039  /*
2040  * PQgetResult will return immediately in all states except BUSY. Also,
2041  * if we've detected read EOF and dropped the connection, we can expect
2042  * that PQgetResult will fail immediately. Note that we do *not* check
2043  * conn->write_failed here --- once that's become set, we know we have
2044  * trouble, but we need to keep trying to read until we have a complete
2045  * server message or detect read EOF.
2046  */
2048 }

References pg_conn::asyncStatus, conn, CONNECTION_BAD, parseInput(), PGASYNC_BUSY, and pg_conn::status.

Referenced by advanceConnectionState(), confirm_query_canceled_impl(), dblink_is_busy(), libpqrcv_PQgetResult(), libpqsrv_get_result(), pgfdw_get_cleanup_result(), PQconnectPoll(), pqEndcopy3(), test_disallowed_in_pipeline(), test_pipelined_insert(), test_uniqviol(), try_complete_step(), and wait_on_slots().

◆ PQisnonblocking()

int PQisnonblocking ( const PGconn conn)

Definition at line 3983 of file fe-exec.c.

3984 {
3985  if (!conn || conn->status == CONNECTION_BAD)
3986  return false;
3987  return pqIsnonblocking(conn);
3988 }

References conn, CONNECTION_BAD, pqIsnonblocking, and pg_conn::status.

Referenced by test_disallowed_in_pipeline(), and test_simple_pipeline().

◆ PQisthreadsafe()

int PQisthreadsafe ( void  )

Definition at line 3992 of file fe-exec.c.

3993 {
3994  return true;
3995 }

◆ PQlibVersion()

int PQlibVersion ( void  )

Definition at line 63 of file fe-misc.c.

64 {
65  return PG_VERSION_NUM;
66 }

◆ PQmakeEmptyPGresult()

PGresult* PQmakeEmptyPGresult ( PGconn conn,
ExecStatusType  status 
)

Definition at line 159 of file fe-exec.c.

160 {
161  PGresult *result;
162 
163  result = (PGresult *) malloc(sizeof(PGresult));
164  if (!result)
165  return NULL;
166 
167  result->ntups = 0;
168  result->numAttributes = 0;
169  result->attDescs = NULL;
170  result->tuples = NULL;
171  result->tupArrSize = 0;
172  result->numParameters = 0;
173  result->paramDescs = NULL;
174  result->resultStatus = status;
175  result->cmdStatus[0] = '\0';
176  result->binary = 0;
177  result->events = NULL;
178  result->nEvents = 0;
179  result->errMsg = NULL;
180  result->errFields = NULL;
181  result->errQuery = NULL;
182  result->null_field[0] = '\0';
183  result->curBlock = NULL;
184  result->curOffset = 0;
185  result->spaceLeft = 0;
186  result->memorySize = sizeof(PGresult);
187 
188  if (conn)
189  {
190  /* copy connection data we might need for operations on PGresult */
191  result->noticeHooks = conn->noticeHooks;
193 
194  /* consider copying conn's errorMessage */
195  switch (status)
196  {
197  case PGRES_EMPTY_QUERY:
198  case PGRES_COMMAND_OK:
199  case PGRES_TUPLES_OK:
200  case PGRES_COPY_OUT:
201  case PGRES_COPY_IN:
202  case PGRES_COPY_BOTH:
203  case PGRES_SINGLE_TUPLE:
204  case PGRES_TUPLES_CHUNK:
205  /* non-error cases */
206  break;
207  default:
208  /* we intentionally do not use or modify errorReported here */
209  pqSetResultError(result, &conn->errorMessage, 0);
210  break;
211  }
212 
213  /* copy events last; result must be valid if we need to PQclear */
214  if (conn->nEvents > 0)
215  {
216  result->events = dupEvents(conn->events, conn->nEvents,
217  &result->memorySize);
218  if (!result->events)
219  {
220  PQclear(result);
221  return NULL;
222  }
223  result->nEvents = conn->nEvents;
224  }
225  }
226  else
227  {
228  /* defaults... */
229  result->noticeHooks.noticeRec = NULL;
230  result->noticeHooks.noticeRecArg = NULL;
231  result->noticeHooks.noticeProc = NULL;
232  result->noticeHooks.noticeProcArg = NULL;
233  result->client_encoding = PG_SQL_ASCII;
234  }
235 
236  return result;
237 }
void pqSetResultError(PGresult *res, PQExpBuffer errorMessage, int offset)
Definition: fe-exec.c:692
struct pg_result PGresult
Definition: libpq-fe.h:181
void * noticeProcArg
Definition: libpq-int.h:158
PQnoticeReceiver noticeRec
Definition: libpq-int.h:155
PQnoticeProcessor noticeProc
Definition: libpq-int.h:157
void * noticeRecArg
Definition: libpq-int.h:156
int nEvents
Definition: libpq-int.h:432
PGNoticeHooks noticeHooks
Definition: libpq-int.h:428
PGEvent * events
Definition: libpq-int.h:431
size_t memorySize
Definition: libpq-int.h:215
int curOffset
Definition: libpq-int.h:212
char null_field[1]
Definition: libpq-int.h:204
char * errMsg
Definition: libpq-int.h:199
int numParameters
Definition: libpq-int.h:178
int spaceLeft
Definition: libpq-int.h:213
int tupArrSize
Definition: libpq-int.h:177
char * errQuery
Definition: libpq-int.h:201

References pg_result::attDescs, pg_result::binary, pg_result::client_encoding, pg_conn::client_encoding, pg_result::cmdStatus, conn, pg_result::curBlock, pg_result::curOffset, dupEvents(), pg_result::errFields, pg_result::errMsg, pg_conn::errorMessage, pg_result::errQuery, pg_result::events, pg_conn::events, malloc, pg_result::memorySize, pg_result::nEvents, pg_conn::nEvents, pg_result::noticeHooks, pg_conn::noticeHooks, PGNoticeHooks::noticeProc, PGNoticeHooks::noticeProcArg, PGNoticeHooks::noticeRec, PGNoticeHooks::noticeRecArg, pg_result::ntups, pg_result::null_field, pg_result::numAttributes, pg_result::numParameters, pg_result::paramDescs, PG_SQL_ASCII, PGRES_COMMAND_OK, PGRES_COPY_BOTH, PGRES_COPY_IN, PGRES_COPY_OUT, PGRES_EMPTY_QUERY, PGRES_SINGLE_TUPLE, PGRES_TUPLES_CHUNK, PGRES_TUPLES_OK, PQclear(), pqSetResultError(), pg_result::resultStatus, pg_result::spaceLeft, pg_result::tupArrSize, and pg_result::tuples.

Referenced by ECPGallocate_desc(), getCopyResult(), getCopyStart(), getParamDescriptions(), getRowDescriptions(), PQcopyResult(), pqFunctionCall3(), pqGetErrorNotice3(), pqInternalNotice(), pqParseInput3(), pqPipelineProcessQueue(), and pqPrepareAsyncResult().

◆ PQmblen()

int PQmblen ( const char *  s,
int  encoding 
)

Definition at line 1209 of file fe-misc.c.

1210 {
1211  return pg_encoding_mblen(encoding, s);
1212 }
int pg_encoding_mblen(int encoding, const char *mbstr)
Definition: wchar.c:2069

References encoding, and pg_encoding_mblen().

Referenced by appendStringLiteral(), get_prompt(), pg_wcsformat(), pg_wcssize(), pg_wcswidth(), and strlen_max_width().

◆ PQmblenBounded()

int PQmblenBounded ( const char *  s,
int  encoding 
)

Definition at line 1219 of file fe-misc.c.

1220 {
1221  return strnlen(s, pg_encoding_mblen(encoding, s));
1222 }
size_t strnlen(const char *str, size_t maxlen)
Definition: strnlen.c:26

References encoding, pg_encoding_mblen(), and strnlen().

Referenced by command_no_begin(), do_field(), patternToSQLRegex(), quote_if_needed(), reportErrorPosition(), skip_white_space(), splitTableColumnsSpec(), strip_quotes(), and strtokx().

◆ PQnfields()

◆ PQnotifies()

PGnotify* PQnotifies ( PGconn conn)

Definition at line 2667 of file fe-exec.c.

2668 {
2669  PGnotify *event;
2670 
2671  if (!conn)
2672  return NULL;
2673 
2674  /* Parse any available data to see if we can extract NOTIFY messages. */
2675  parseInput(conn);
2676 
2677  event = conn->notifyHead;
2678  if (event)
2679  {
2680  conn->notifyHead = event->next;
2681  if (!conn->notifyHead)
2682  conn->notifyTail = NULL;
2683  event->next = NULL; /* don't let app see the internal state */
2684  }
2685  return event;
2686 }
struct pgNotify * next
Definition: libpq-fe.h:201
PGnotify * notifyHead
Definition: libpq-int.h:450
PGnotify * notifyTail
Definition: libpq-int.h:451

References conn, pgNotify::next, pg_conn::notifyHead, pg_conn::notifyTail, and parseInput().

Referenced by dblink_get_notify(), ecpg_process_output(), main(), PrintNotifications(), and try_complete_step().

◆ PQnparams()

int PQnparams ( const PGresult res)

Definition at line 3915 of file fe-exec.c.

3916 {
3917  if (!res)
3918  return 0;
3919  return res->numParameters;
3920 }

References pg_result::numParameters, and res.

◆ PQntuples()

int PQntuples ( const PGresult res)

Definition at line 3481 of file fe-exec.c.

3482 {
3483  if (!res)
3484  return 0;
3485  return res->ntups;
3486 }

References pg_result::ntups, and res.

Referenced by add_tablespace_footer(), addFooterToPublicationDesc(), append_depends_on_extension(), appendQualifiedRelation(), BaseBackup(), buildMatViewRefreshDependencies(), check_and_drop_existing_subscriptions(), check_for_data_types_usage(), check_for_incompatible_polymorphics(), check_for_isn_and_int8_passing_mismatch(), check_for_pg_role_prefix(), check_for_prepared_transactions(), check_for_tables_with_oids(), check_for_user_defined_encoding_conversions(), check_for_user_defined_postfix_ops(), check_is_install_user(), check_new_cluster_logical_replication_slots(), check_new_cluster_subscription_configuration(), check_old_cluster_subscription_state(), check_proper_datallowconn(), cluster_all_databases(), collectBinaryUpgradeClassOids(), collectComments(), collectRoleNames(), collectSecLabels(), compile_database_list(), compile_relation_list_one_db(), create_publication(), CreateReplicationSlot(), createViewAsClause(), describeOneTableDetails(), describePublications(), describeRoles(), describeTableDetails(), drop_failover_replication_slots(), dropDBs(), DropReplicationSlot(), dropRoles(), dropTablespaces(), dumpCompositeType(), dumpCompositeTypeColComments(), dumpDatabase(), dumpDatabaseConfig(), dumpDatabases(), dumpEnumType(), dumpOpclass(), dumpOpfamily(), dumpRoleGUCPrivs(), dumpRoleMembership(), dumpRoles(), dumpRule(), dumpSequence(), dumpSequenceData(), dumpTable(), dumpTableData_insert(), dumpTablespaces(), dumpTSConfig(), dumpUserConfig(), dumpUserMappings(), ecpg_process_output(), ecpg_store_result(), ECPGget_desc(), emitShSecLabels(), ExecQueryAndProcessResults(), ExecQueryTuples(), execute_dml_stmt(), execute_foreign_modify(), ExecuteSqlQueryForSingleRow(), expand_dbname_patterns(), expand_extension_name_patterns(), expand_foreign_server_name_patterns(), expand_schema_name_patterns(), expand_table_name_patterns(), fetch_more_data(), generate_object_name(), get_create_object_cmd(), get_db_infos(), get_loadable_libraries(), get_old_cluster_logical_slot_infos(), get_parallel_object_list(), get_primary_sysid(), get_rel_infos(), get_tablespace_paths(), get_template0_info(), getAccessMethods(), getAdditionalACLs(), getAggregates(), getCasts(), getCollations(), getConstraints(), getConversions(), getDefaultACLs(), getDependencies(), getDomainConstraints(), getEventTriggers(), getExtendedStatistics(), getExtensionMembership(), getExtensions(), getForeignDataWrappers(), getForeignServers(), getFuncs(), getIndexes(), getInherits(), getLOs(), getNamespaces(), getOpclasses(), getOperators(), getOpfamilies(), getPartitioningInfo(), getPolicies(), getProcLangs(), getPublicationNamespaces(), getPublications(), getPublicationTables(), getRules(), GetSlotInformation(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), GetTableInfo(), getTables(), getTransforms(), getTriggers(), getTSConfigurations(), getTSDictionaries(), getTSParsers(), getTSTemplates(), getTypes(), libpq_fetch_file(), libpq_traverse_files(), libpqrcv_endstreaming(), libpqrcv_identify_system(), libpqrcv_processTuples(), libpqrcv_readtimelinehistoryfile(), listDbRoleSettings(), listExtensionContents(), listSchemas(), listTables(), listTSConfigsVerbose(), listTSParsersVerbose(), lo_initialize(), lookup_object_oid(), main(), make_tuple_from_result_row(), materializeResult(), old_9_6_invalidate_hash_indexes(), postgresAcquireSampleRowsFunc(), postgresAnalyzeForeignTable(), postgresGetAnalyzeInfoForForeignTable(), postgresImportForeignSchema(), PQconnectPoll(), PQdisplayTuples(), PQencryptPasswordConn(), PQprint(), PQprintTuples(), printCrosstab(), printQuery(), PrintResultInCrosstab(), process_queued_fetch_requests(), processExtensionTables(), readCommandResponse(), ReadEndOfStreamingResult(), ReceiveXlogStream(), reindex_all_databases(), report_extension_updates(), RetrieveDataDirCreatePerm(), RetrieveWalSegSize(), run_simple_query(), RunIdentifySystem(), set_frozenxids(), set_replication_progress(), show_binary_results(), sql_exec(), StoreQueryTuple(), storeRow(), test_pipeline_abort(), test_singlerowmode(), test_transaction(), try_complete_step(), vacuum_all_databases(), vacuum_one_database(), vacuumlo(), verify_btree_slot_handler(), verify_heap_slot_handler(), and wait_for_connection_state().

◆ PQoidStatus()

char* PQoidStatus ( const PGresult res)

Definition at line 3765 of file fe-exec.c.

3766 {
3767  /*
3768  * This must be enough to hold the result. Don't laugh, this is better
3769  * than what this function used to do.
3770  */
3771  static char buf[24];
3772 
3773  size_t len;
3774 
3775  if (!res || strncmp(res->cmdStatus, "INSERT ", 7) != 0)
3776  return "";
3777 
3778  len = strspn(res->cmdStatus + 7, "0123456789");
3779  if (len > sizeof(buf) - 1)
3780  len = sizeof(buf) - 1;
3781  memcpy(buf, res->cmdStatus + 7, len);
3782  buf[len] = '\0';
3783 
3784  return buf;
3785 }

References buf, pg_result::cmdStatus, len, and res.

◆ PQoidValue()

Oid PQoidValue ( const PGresult res)

Definition at line 3793 of file fe-exec.c.

3794 {
3795  char *endptr = NULL;
3796  unsigned long result;
3797 
3798  if (!res ||
3799  strncmp(res->cmdStatus, "INSERT ", 7) != 0 ||
3800  res->cmdStatus[7] < '0' ||
3801  res->cmdStatus[7] > '9')
3802  return InvalidOid;
3803 
3804  result = strtoul(res->cmdStatus + 7, &endptr, 10);
3805 
3806  if (!endptr || (*endptr != ' ' && *endptr != '\0'))
3807  return InvalidOid;
3808  else
3809  return (Oid) result;
3810 }

References pg_result::cmdStatus, InvalidOid, and res.

Referenced by ecpg_process_output(), and PrintQueryStatus().

◆ PQoptions()

char* PQoptions ( const PGconn conn)

Definition at line 7110 of file fe-connect.c.

7111 {
7112  if (!conn)
7113  return NULL;
7114  return conn->pgoptions;
7115 }
char * pgoptions
Definition: libpq-int.h:380

References conn, and pg_conn::pgoptions.

◆ PQparameterStatus()

const char* PQparameterStatus ( const PGconn conn,
const char *  paramName 
)

Definition at line 7136 of file fe-connect.c.

7137 {
7138  const pgParameterStatus *pstatus;
7139 
7140  if (!conn || !paramName)
7141  return NULL;
7142  for (pstatus = conn->pstatus; pstatus != NULL; pstatus = pstatus->next)
7143  {
7144  if (strcmp(pstatus->name, paramName) == 0)
7145  return pstatus->value;
7146  }
7147  return NULL;
7148 }
struct pgParameterStatus * next
Definition: libpq-int.h:277
pgParameterStatus * pstatus
Definition: libpq-int.h:510

References conn, pgParameterStatus::name, pgParameterStatus::next, pg_conn::pstatus, and pgParameterStatus::value.

Referenced by _check_database_version(), applyRemoteGucs(), BaseBackup(), CheckServerVersionForStreaming(), connectDatabase(), connection_warnings(), ecpg_build_params(), GetConnection(), is_superuser(), main(), printVersion(), session_username(), setup_connection(), standard_strings(), and SyncVariables().

◆ PQparamtype()

Oid PQparamtype ( const PGresult res,
int  param_num 
)

Definition at line 3926 of file fe-exec.c.

3927 {
3928  if (!check_param_number(res, param_num))
3929  return InvalidOid;
3930  if (res->paramDescs)
3931  return res->paramDescs[param_num].typid;
3932  else
3933  return InvalidOid;
3934 }
static int check_param_number(const PGresult *res, int param_num)
Definition: fe-exec.c:3548

References check_param_number(), InvalidOid, pg_result::paramDescs, res, and pgresParamDesc::typid.

◆ PQpass()

char* PQpass ( const PGconn conn)

Definition at line 7033 of file fe-connect.c.

7034 {
7035  char *password = NULL;
7036 
7037  if (!conn)
7038  return NULL;
7039  if (conn->connhost != NULL)
7041  if (password == NULL)
7042  password = conn->pgpass;
7043  /* Historically we've returned "" not NULL for no password specified */
7044  if (password == NULL)
7045  password = "";
7046  return password;
7047 }
char * pgpass
Definition: libpq-int.h:386

References conn, pg_conn::connhost, password, pg_conn_host::password, pg_conn::pgpass, and pg_conn::whichhost.

Referenced by ConnectDatabase(), and PQconnectionNeedsPassword().

◆ PQping()

PGPing PQping ( const char *  conninfo)

Definition at line 760 of file fe-connect.c.

761 {
762  PGconn *conn = PQconnectStart(conninfo);
763  PGPing ret;
764 
765  ret = internal_ping(conn);
766  PQfinish(conn);
767 
768  return ret;
769 }
static PGPing internal_ping(PGconn *conn)
Definition: fe-connect.c:4485

References conn, internal_ping(), PQconnectStart(), and PQfinish().

◆ PQpingParams()

PGPing PQpingParams ( const char *const *  keywords,
const char *const *  values,
int  expand_dbname 
)

Definition at line 707 of file fe-connect.c.

710 {
711  PGconn *conn = PQconnectStartParams(keywords, values, expand_dbname);
712  PGPing ret;
713 
714  ret = internal_ping(conn);
715  PQfinish(conn);
716 
717  return ret;
718 }

References conn, internal_ping(), PQconnectStartParams(), PQfinish(), and values.

Referenced by main(), and regression_main().

◆ PQpipelineStatus()

PGpipelineStatus PQpipelineStatus ( const PGconn conn)

◆ PQpipelineSync()

int PQpipelineSync ( PGconn conn)

Definition at line 3272 of file fe-exec.c.

3273 {
3274  return pqPipelineSyncInternal(conn, true);
3275 }
static int pqPipelineSyncInternal(PGconn *conn, bool immediate_flush)
Definition: fe-exec.c:3294

References conn, and pqPipelineSyncInternal().

Referenced by discardUntilSync(), executeMetaCommand(), test_multi_pipelines(), test_pipeline_abort(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), and test_transaction().

◆ PQport()

char* PQport ( const PGconn conn)

Definition at line 7086 of file fe-connect.c.

7087 {
7088  if (!conn)
7089  return NULL;
7090 
7091  if (conn->connhost != NULL)
7092  return conn->connhost[conn->whichhost].port;
7093 
7094  return "";
7095 }

References conn, pg_conn::connhost, pg_conn_host::port, and pg_conn::whichhost.

Referenced by do_connect(), exec_command_conninfo(), get_prompt(), libpqrcv_get_senderinfo(), main(), and SyncVariables().

◆ PQprepare()

PGresult* PQprepare ( PGconn conn,
const char *  stmtName,
const char *  query,
int  nParams,
const Oid paramTypes 
)

Definition at line 2306 of file fe-exec.c.

2309 {
2310  if (!PQexecStart(conn))
2311  return NULL;
2312  if (!PQsendPrepare(conn, stmtName, query, nParams, paramTypes))
2313  return NULL;
2314  return PQexecFinish(conn);
2315 }
int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
Definition: fe-exec.c:1536

References conn, PQexecFinish(), PQexecStart(), and PQsendPrepare().

Referenced by DescribeQuery(), init_libpq_conn(), main(), prepare_common(), prepareCommand(), and test_uniqviol().

◆ PQprint()

void PQprint ( FILE *  fout,
const PGresult res,
const PQprintOpt po 
)

Definition at line 68 of file fe-print.c.

69 {
70  int nFields;
71 
72  nFields = PQnfields(res);
73 
74  if (nFields > 0)
75  { /* only print rows with at least 1 field. */
76  int i,
77  j;
78  int nTups;
79  int *fieldMax = NULL; /* in case we don't use them */
80  unsigned char *fieldNotNum = NULL;
81  char *border = NULL;
82  char **fields = NULL;
83  const char **fieldNames = NULL;
84  int fieldMaxLen = 0;
85  int numFieldName;
86  int fs_len = strlen(po->fieldSep);
87  int total_line_length = 0;
88  bool usePipe = false;
89  char *pagerenv;
90 
91 #if !defined(WIN32)
92  sigset_t osigset;
93  bool sigpipe_masked = false;
94  bool sigpipe_pending;
95 #endif
96 
97 #ifdef TIOCGWINSZ
98  struct winsize screen_size;
99 #else
100  struct winsize
101  {
102  int ws_row;
103  int ws_col;
104  } screen_size;
105 #endif
106 
107  nTups = PQntuples(res);
108  fieldNames = (const char **) calloc(nFields, sizeof(char *));
109  fieldNotNum = (unsigned char *) calloc(nFields, 1);
110  fieldMax = (int *) calloc(nFields, sizeof(int));
111  if (!fieldNames || !fieldNotNum || !fieldMax)
112  {
113  fprintf(stderr, libpq_gettext("out of memory\n"));
114  goto exit;
115  }
116  for (numFieldName = 0;
117  po->fieldName && po->fieldName[numFieldName];
118  numFieldName++)
119  ;
120  for (j = 0; j < nFields; j++)
121  {
122  int len;
123  const char *s = (j < numFieldName && po->fieldName[j][0]) ?
124  po->fieldName[j] : PQfname(res, j);
125 
126  fieldNames[j] = s;
127  len = s ? strlen(s) : 0;
128  fieldMax[j] = len;
129  len += fs_len;
130  if (len > fieldMaxLen)
131  fieldMaxLen = len;
132  total_line_length += len;
133  }
134 
135  total_line_length += nFields * strlen(po->fieldSep) + 1;
136 
137  if (fout == NULL)
138  fout = stdout;
139  if (po->pager && fout == stdout && isatty(fileno(stdin)) &&
140  isatty(fileno(stdout)))
141  {
142  /*
143  * If we think there'll be more than one screen of output, try to
144  * pipe to the pager program.
145  */
146 #ifdef TIOCGWINSZ
147  if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 ||
148  screen_size.ws_col == 0 ||
149  screen_size.ws_row == 0)
150  {
151  screen_size.ws_row = 24;
152  screen_size.ws_col = 80;
153  }
154 #else
155  screen_size.ws_row = 24;
156  screen_size.ws_col = 80;
157 #endif
158 
159  /*
160  * Since this function is no longer used by psql, we don't examine
161  * PSQL_PAGER. It's possible that the hypothetical external users
162  * of the function would like that to happen, but in the name of
163  * backwards compatibility, we'll stick to just examining PAGER.
164  */
165  pagerenv = getenv("PAGER");
166  /* if PAGER is unset, empty or all-white-space, don't use pager */
167  if (pagerenv != NULL &&
168  strspn(pagerenv, " \t\r\n") != strlen(pagerenv) &&
169  !po->html3 &&
170  ((po->expanded &&
171  nTups * (nFields + 1) >= screen_size.ws_row) ||
172  (!po->expanded &&
173  nTups * (total_line_length / screen_size.ws_col + 1) *
174  (1 + (po->standard != 0)) >= screen_size.ws_row -
175  (po->header != 0) *
176  (total_line_length / screen_size.ws_col + 1) * 2
177  - (po->header != 0) * 2 /* row count and newline */
178  )))
179  {
180  fflush(NULL);
181  fout = popen(pagerenv, "w");
182  if (fout)
183  {
184  usePipe = true;
185 #ifndef WIN32
186  if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0)
187  sigpipe_masked = true;
188 #endif /* WIN32 */
189  }
190  else
191  fout = stdout;
192  }
193  }
194 
195  if (!po->expanded && (po->align || po->html3))
196  {
197  fields = (char **) calloc((size_t) nTups + 1,
198  nFields * sizeof(char *));
199  if (!fields)
200  {
201  fprintf(stderr, libpq_gettext("out of memory\n"));
202  goto exit;
203  }
204  }
205  else if (po->header && !po->html3)
206  {
207  if (po->expanded)
208  {
209  if (po->align)
210  fprintf(fout, libpq_gettext("%-*s%s Value\n"),
211  fieldMaxLen - fs_len, libpq_gettext("Field"), po->fieldSep);
212  else
213  fprintf(fout, libpq_gettext("%s%sValue\n"), libpq_gettext("Field"), po->fieldSep);
214  }
215  else
216  {
217  int len = 0;
218 
219  for (j = 0; j < nFields; j++)
220  {
221  const char *s = fieldNames[j];
222 
223  fputs(s, fout);
224  len += strlen(s) + fs_len;
225  if ((j + 1) < nFields)
226  fputs(po->fieldSep, fout);
227  }
228  fputc('\n', fout);
229  for (len -= fs_len; len--; fputc('-', fout));
230  fputc('\n', fout);
231  }
232  }
233  if (po->expanded && po->html3)
234  {
235  if (po->caption)
236  fprintf(fout, "<center><h2>%s</h2></center>\n", po->caption);
237  else
238  fprintf(fout,
239  "<center><h2>"
240  "Query retrieved %d rows * %d fields"
241  "</h2></center>\n",
242  nTups, nFields);
243  }
244  for (i = 0; i < nTups; i++)
245  {
246  if (po->expanded)
247  {
248  if (po->html3)
249  fprintf(fout,
250  "<table %s><caption align=\"top\">%d</caption>\n",
251  po->tableOpt ? po->tableOpt : "", i);
252  else
253  fprintf(fout, libpq_gettext("-- RECORD %d --\n"), i);
254  }
255  for (j = 0; j < nFields; j++)
256  {
257  if (!do_field(po, res, i, j, fs_len, fields, nFields,
258  fieldNames, fieldNotNum,
259  fieldMax, fieldMaxLen, fout))
260  goto exit;
261  }
262  if (po->html3 && po->expanded)
263  fputs("</table>\n", fout);
264  }
265  if (!po->expanded && (po->align || po->html3))
266  {
267  if (po->html3)
268  {
269  if (po->header)
270  {
271  if (po->caption)
272  fprintf(fout,
273  "<table %s><caption align=\"top\">%s</caption>\n",
274  po->tableOpt ? po->tableOpt : "",
275  po->caption);
276  else
277  fprintf(fout,
278  "<table %s><caption align=\"top\">"
279  "Retrieved %d rows * %d fields"
280  "</caption>\n",
281  po->tableOpt ? po->tableOpt : "", nTups, nFields);
282  }
283  else
284  fprintf(fout, "<table %s>", po->tableOpt ? po->tableOpt : "");
285  }
286  if (po->header)
287  border = do_header(fout, po, nFields, fieldMax, fieldNames,
288  fieldNotNum, fs_len, res);
289  for (i = 0; i < nTups; i++)
290  output_row(fout, po, nFields, fields,
291  fieldNotNum, fieldMax, border, i);
292  }
293  if (po->header && !po->html3)
294  fprintf(fout, "(%d row%s)\n\n", PQntuples(res),
295  (PQntuples(res) == 1) ? "" : "s");
296  if (po->html3 && !po->expanded)
297  fputs("</table>\n", fout);
298 
299 exit:
300  free(fieldMax);
301  free(fieldNotNum);
302  free(border);
303  if (fields)
304  {
305  /* if calloc succeeded, this shouldn't overflow size_t */
306  size_t numfields = ((size_t) nTups + 1) * (size_t) nFields;
307 
308  while (numfields-- > 0)
309  free(fields[numfields]);
310  free(fields);
311  }
312  free(fieldNames);
313  if (usePipe)
314  {
315 #ifdef WIN32
316  _pclose(fout);
317 #else
318  pclose(fout);
319 
320  /* we can't easily verify if EPIPE occurred, so say it did */
321  if (sigpipe_masked)
322  pq_reset_sigpipe(&osigset, sigpipe_pending, true);
323 #endif /* WIN32 */
324  }
325  }
326 }
static char * do_header(FILE *fout, const PQprintOpt *po, const int nFields, int *fieldMax, const char **fieldNames, unsigned char *fieldNotNum, const int fs_len, const PGresult *res)
Definition: fe-print.c:445
static bool do_field(const PQprintOpt *po, const PGresult *res, const int i, const int j, const int fs_len, char **fields, const int nFields, const char **fieldNames, unsigned char *fieldNotNum, int *fieldMax, const int fieldMaxLen, FILE *fout)
Definition: fe-print.c:330
static void output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields, unsigned char *fieldNotNum, int *fieldMax, char *border, const int row_index)
Definition: fe-print.c:531
void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, bool got_epipe)
Definition: fe-secure.c:569
int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending)
Definition: fe-secure.c:519
exit(1)
pqbool align
Definition: libpq-fe.h:217
pqbool pager
Definition: libpq-fe.h:221
pqbool standard
Definition: libpq-fe.h:218
pqbool html3
Definition: libpq-fe.h:219
char * caption
Definition: libpq-fe.h:224
pqbool header
Definition: libpq-fe.h:216
pqbool expanded
Definition: libpq-fe.h:220
char * fieldSep
Definition: libpq-fe.h:222
char ** fieldName
Definition: libpq-fe.h:225
char * tableOpt
Definition: libpq-fe.h:223

References _PQprintOpt::align, calloc, _PQprintOpt::caption, do_field(), do_header(), exit(), _PQprintOpt::expanded, fflush(), _PQprintOpt::fieldName, _PQprintOpt::fieldSep, fprintf, free, _PQprintOpt::header, _PQprintOpt::html3, i, j, len, libpq_gettext, output_row(), _PQprintOpt::pager, pq_block_sigpipe(), pq_reset_sigpipe(), PQfname(), PQnfields(), PQntuples(), res, _PQprintOpt::standard, generate_unaccent_rules::stdout, and _PQprintOpt::tableOpt.

Referenced by printResultSet().

◆ PQprintTuples()

void PQprintTuples ( const PGresult res,
FILE *  fout,
int  PrintAttNames,
int  TerseOutput,
int  colWidth 
)

Definition at line 671 of file fe-print.c.

677 {
678  int nFields;
679  int nTups;
680  int i,
681  j;
682  char formatString[80];
683  char *tborder = NULL;
684 
685  nFields = PQnfields(res);
686  nTups = PQntuples(res);
687 
688  if (colWidth > 0)
689  sprintf(formatString, "%%s %%-%ds", colWidth);
690  else
691  sprintf(formatString, "%%s %%s");
692 
693  if (nFields > 0)
694  { /* only print rows with at least 1 field. */
695 
696  if (!TerseOutput)
697  {
698  int width;
699 
700  width = nFields * 14;
701  tborder = (char *) malloc(width + 1);
702  if (!tborder)
703  {
704  fprintf(stderr, libpq_gettext("out of memory\n"));
705  return;
706  }
707  for (i = 0; i < width; i++)
708  tborder[i] = '-';
709  tborder[width] = '\0';
710  fprintf(fout, "%s\n", tborder);
711  }
712 
713  for (i = 0; i < nFields; i++)
714  {
715  if (PrintAttNames)
716  {
717  fprintf(fout, formatString,
718  TerseOutput ? "" : "|",
719  PQfname(res, i));
720  }
721  }
722 
723  if (PrintAttNames)
724  {
725  if (TerseOutput)
726  fprintf(fout, "\n");
727  else
728  fprintf(fout, "|\n%s\n", tborder);
729  }
730 
731  for (i = 0; i < nTups; i++)
732  {
733  for (j = 0; j < nFields; j++)
734  {
735  const char *pval = PQgetvalue(res, i, j);
736 
737  fprintf(fout, formatString,
738  TerseOutput ? "" : "|",
739  pval ? pval : "");
740  }
741  if (TerseOutput)
742  fprintf(fout, "\n");
743  else
744  fprintf(fout, "|\n%s\n", tborder);
745  }
746  }
747 
748  free(tborder);
749 }
#define sprintf
Definition: port.h:240

References fprintf, free, i, j, libpq_gettext, malloc, PQfname(), PQgetvalue(), PQnfields(), PQntuples(), res, and sprintf.

◆ PQprotocolVersion()

int PQprotocolVersion ( const PGconn conn)

Definition at line 7151 of file fe-connect.c.

7152 {
7153  if (!conn)
7154  return 0;
7155  if (conn->status == CONNECTION_BAD)
7156  return 0;
7157  return PG_PROTOCOL_MAJOR(conn->pversion);
7158 }
#define PG_PROTOCOL_MAJOR(v)
Definition: pqcomm.h:87

References conn, CONNECTION_BAD, PG_PROTOCOL_MAJOR, pg_conn::pversion, and pg_conn::status.

Referenced by handleCopyIn().

◆ PQputCopyData()

int PQputCopyData ( PGconn conn,
const char *  buffer,
int  nbytes 
)

Definition at line 2695 of file fe-exec.c.

2696 {
2697  if (!conn)
2698  return -1;
2699  if (conn->asyncStatus != PGASYNC_COPY_IN &&
2701  {
2702  libpq_append_conn_error(conn, "no COPY in progress");
2703  return -1;
2704  }
2705 
2706  /*
2707  * Process any NOTICE or NOTIFY messages that might be pending in the
2708  * input buffer. Since the server might generate many notices during the
2709  * COPY, we want to clean those out reasonably promptly to prevent
2710  * indefinite expansion of the input buffer. (Note: the actual read of
2711  * input data into the input buffer happens down inside pqSendSome, but
2712  * it's not authorized to get rid of the data again.)
2713  */
2714  parseInput(conn);
2715 
2716  if (nbytes > 0)
2717  {
2718  /*
2719  * Try to flush any previously sent data in preference to growing the
2720  * output buffer. If we can't enlarge the buffer enough to hold the
2721  * data, return 0 in the nonblock case, else hard error. (For
2722  * simplicity, always assume 5 bytes of overhead.)
2723  */
2724  if ((conn->outBufSize - conn->outCount - 5) < nbytes)
2725  {
2726  if (pqFlush(conn) < 0)
2727  return -1;
2728  if (pqCheckOutBufferSpace(conn->outCount + 5 + (size_t) nbytes,
2729  conn))
2730  return pqIsnonblocking(conn) ? 0 : -1;
2731  }
2732  /* Send the data (too simple to delegate to fe-protocol files) */
2733  if (pqPutMsgStart(PqMsg_CopyData, conn) < 0 ||
2734  pqPutnchar(buffer, nbytes, conn) < 0 ||
2735  pqPutMsgEnd(conn) < 0)
2736  return -1;
2737  }
2738  return 1;
2739 }
int pqCheckOutBufferSpace(size_t bytes_needed, PGconn *conn)
Definition: fe-misc.c:287
int pqPutMsgStart(char msg_type, PGconn *conn)
Definition: fe-misc.c:458
int pqPutnchar(const char *s, size_t len, PGconn *conn)
Definition: fe-misc.c:202
int pqPutMsgEnd(PGconn *conn)
Definition: fe-misc.c:517
#define PqMsg_CopyData
Definition: protocol.h:65
int outBufSize
Definition: libpq-int.h:530
int outCount
Definition: libpq-int.h:531

References pg_conn::asyncStatus, conn, libpq_append_conn_error(), pg_conn::outBufSize, pg_conn::outCount, parseInput(), PGASYNC_COPY_BOTH, PGASYNC_COPY_IN, pqCheckOutBufferSpace(), pqFlush(), pqIsnonblocking, PqMsg_CopyData, pqPutMsgEnd(), pqPutMsgStart(), and pqPutnchar().

Referenced by BaseBackup(), ExecuteSqlCommandBuf(), handleCopyIn(), libpqrcv_send(), PQputnbytes(), and sendFeedback().

◆ PQputCopyEnd()

int PQputCopyEnd ( PGconn conn,
const char *  errormsg 
)

Definition at line 2749 of file fe-exec.c.

2750 {
2751  if (!conn)
2752  return -1;
2753  if (conn->asyncStatus != PGASYNC_COPY_IN &&
2755  {
2756  libpq_append_conn_error(conn, "no COPY in progress");
2757  return -1;
2758  }
2759 
2760  /*
2761  * Send the COPY END indicator. This is simple enough that we don't
2762  * bother delegating it to the fe-protocol files.
2763  */
2764  if (errormsg)
2765  {
2766  /* Send COPY FAIL */
2767  if (pqPutMsgStart(PqMsg_CopyFail, conn) < 0 ||
2768  pqPuts(errormsg, conn) < 0 ||
2769  pqPutMsgEnd(conn) < 0)
2770  return -1;
2771  }
2772  else
2773  {
2774  /* Send COPY DONE */
2775  if (pqPutMsgStart(PqMsg_CopyDone, conn) < 0 ||
2776  pqPutMsgEnd(conn) < 0)
2777  return -1;
2778  }
2779 
2780  /*
2781  * If we sent the COPY command in extended-query mode, we must issue a
2782  * Sync as well.
2783  */
2784  if (conn->cmd_queue_head &&
2786  {
2787  if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
2788  pqPutMsgEnd(conn) < 0)
2789  return -1;
2790  }
2791 
2792  /* Return to active duty */
2795  else
2797 
2798  /* Try to flush data */
2799  if (pqFlush(conn) < 0)
2800  return -1;
2801 
2802  return 1;
2803 }
int pqPuts(const char *s, PGconn *conn)
Definition: fe-misc.c:152
@ PGQUERY_SIMPLE
Definition: libpq-int.h:326
#define PqMsg_CopyDone
Definition: protocol.h:64
#define PqMsg_Sync
Definition: protocol.h:27
#define PqMsg_CopyFail
Definition: protocol.h:29
PGQueryClass queryclass
Definition: libpq-int.h:339

References pg_conn::asyncStatus, pg_conn::cmd_queue_head, conn, libpq_append_conn_error(), PGASYNC_BUSY, PGASYNC_COPY_BOTH, PGASYNC_COPY_IN, PGASYNC_COPY_OUT, PGQUERY_SIMPLE, pqFlush(), PqMsg_CopyDone, PqMsg_CopyFail, PqMsg_Sync, pqPutMsgEnd(), pqPutMsgStart(), pqPuts(), and PGcmdQueueEntry::queryclass.

Referenced by BaseBackup(), CheckCopyStreamStop(), EndDBCopyMode(), handleCopyIn(), HandleEndOfCopyStream(), libpqrcv_endstreaming(), PQexecStart(), prepareToTerminate(), and ProcessXLogDataMsg().

◆ PQputline()

int PQputline ( PGconn conn,
const char *  string 
)

Definition at line 2918 of file fe-exec.c.

2919 {
2920  return PQputnbytes(conn, string, strlen(string));
2921 }
int PQputnbytes(PGconn *conn, const char *buffer, int nbytes)
Definition: fe-exec.c:2928

References conn, and PQputnbytes().

Referenced by initPopulateTable().

◆ PQputnbytes()

int PQputnbytes ( PGconn conn,
const char *  buffer,
int  nbytes 
)

Definition at line 2928 of file fe-exec.c.

2929 {
2930  if (PQputCopyData(conn, buffer, nbytes) > 0)
2931  return 0;
2932  else
2933  return EOF;
2934 }
int PQputCopyData(PGconn *conn, const char *buffer, int nbytes)
Definition: fe-exec.c:2695

References conn, and PQputCopyData().

Referenced by PQputline().

◆ PQregisterThreadLock()

pgthreadlock_t PQregisterThreadLock ( pgthreadlock_t  newhandler)

Definition at line 7774 of file fe-connect.c.

7775 {
7777 
7778  if (newhandler)
7779  pg_g_threadlock = newhandler;
7780  else
7782 
7783  return prev;
7784 }
static void default_threadlock(int acquire)
Definition: fe-connect.c:7757
pgthreadlock_t pg_g_threadlock
Definition: fe-connect.c:455
void(* pgthreadlock_t)(int acquire)
Definition: libpq-fe.h:434

References default_threadlock(), and pg_g_threadlock.

◆ PQrequestCancel()

int PQrequestCancel ( PGconn conn)

Definition at line 661 of file fe-cancel.c.

662 {
663  int r;
664  PGcancel *cancel;
665 
666  /* Check we have an open connection */
667  if (!conn)
668  return false;
669 
670  if (conn->sock == PGINVALID_SOCKET)
671  {
673  "PQrequestCancel() -- connection is not open\n",
676  conn->errorReported = 0;
677 
678  return false;
679  }
680 
681  cancel = PQgetCancel(conn);
682  if (cancel)
683  {
684  r = PQcancel(cancel, conn->errorMessage.data,
686  PQfreeCancel(cancel);
687  }
688  else
689  {
690  strlcpy(conn->errorMessage.data, "out of memory",
692  r = false;
693  }
694 
695  if (!r)
696  {
698  conn->errorReported = 0;
699  }
700 
701  return r;
702 }
PGcancel * PQgetCancel(PGconn *conn)
Definition: fe-cancel.c:349
int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize)
Definition: fe-cancel.c:463
void PQfreeCancel(PGcancel *cancel)
Definition: fe-cancel.c:417
int errorReported
Definition: libpq-int.h:634

References conn, PQExpBufferData::data, pg_conn::errorMessage, pg_conn::errorReported, PQExpBufferData::len, PQExpBufferData::maxlen, PGINVALID_SOCKET, PQcancel(), PQfreeCancel(), PQgetCancel(), pg_conn::sock, and strlcpy().

Referenced by test_cancel().

◆ PQreset()

void PQreset ( PGconn conn)

Definition at line 4906 of file fe-connect.c.

4907 {
4908  if (conn)
4909  {
4911 
4913  {
4914  /*
4915  * Notify event procs of successful reset.
4916  */
4917  int i;
4918 
4919  for (i = 0; i < conn->nEvents; i++)
4920  {
4921  PGEventConnReset evt;
4922 
4923  evt.conn = conn;
4924  (void) conn->events[i].proc(PGEVT_CONNRESET, &evt,
4925  conn->events[i].passThrough);
4926  }
4927  }
4928  }
4929 }
@ PGEVT_CONNRESET
Definition: libpq-events.h:30

References conn, PGEventConnReset::conn, pg_conn::events, i, pg_conn::nEvents, PGEvent::passThrough, PGEVT_CONNRESET, pqClosePGconn(), pqConnectDBComplete(), pqConnectDBStart(), and PGEvent::proc.

Referenced by CheckConnection().

◆ PQresetPoll()

PostgresPollingStatusType PQresetPoll ( PGconn conn)

Definition at line 4958 of file fe-connect.c.

4959 {
4960  if (conn)
4961  {
4963 
4964  if (status == PGRES_POLLING_OK)
4965  {
4966  /*
4967  * Notify event procs of successful reset.
4968  */
4969  int i;
4970 
4971  for (i = 0; i < conn->nEvents; i++)
4972  {
4973  PGEventConnReset evt;
4974 
4975  evt.conn = conn;
4976  (void) conn->events[i].proc(PGEVT_CONNRESET, &evt,
4977  conn->events[i].passThrough);
4978  }
4979  }
4980 
4981  return status;
4982  }
4983 
4984  return PGRES_POLLING_FAILED;
4985 }

References conn, PGEventConnReset::conn, pg_conn::events, i, pg_conn::nEvents, PGEvent::passThrough, PGEVT_CONNRESET, PGRES_POLLING_FAILED, PGRES_POLLING_OK, PQconnectPoll(), and PGEvent::proc.

◆ PQresetStart()

int PQresetStart ( PGconn conn)

Definition at line 4939 of file fe-connect.c.

4940 {
4941  if (conn)
4942  {
4944 
4945  return pqConnectDBStart(conn);
4946  }
4947 
4948  return 0;
4949 }

References conn, pqClosePGconn(), and pqConnectDBStart().

◆ PQresStatus()

char* PQresStatus ( ExecStatusType  status)

Definition at line 3419 of file fe-exec.c.

3420 {
3421  if ((unsigned int) status >= lengthof(pgresStatus))
3422  return libpq_gettext("invalid ExecStatusType code");
3423  return pgresStatus[status];
3424 }
char *const pgresStatus[]
Definition: fe-exec.c:32

References lengthof, libpq_gettext, and pgresStatus.

Referenced by BaseBackup(), process_result(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), test_transaction(), and try_complete_step().

◆ PQresultAlloc()

void* PQresultAlloc ( PGresult res,
size_t  nBytes 
)

Definition at line 543 of file fe-exec.c.

544 {
545  /* Fail if argument is NULL or OOM_result */
546  if (!res || (const PGresult *) res == &OOM_result)
547  return NULL;
548 
549  return pqResultAlloc(res, nBytes, true);
550 }
void * pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary)
Definition: fe-exec.c:563

References OOM_result, pqResultAlloc(), and res.

Referenced by PQsetResultAttrs().

◆ PQresultErrorField()

char* PQresultErrorField ( const PGresult res,
int  fieldcode 
)

Definition at line 3466 of file fe-exec.c.

3467 {
3468  PGMessageField *pfield;
3469 
3470  if (!res)
3471  return NULL;
3472  for (pfield = res->errFields; pfield != NULL; pfield = pfield->next)
3473  {
3474  if (pfield->code == fieldcode)
3475  return pfield->contents;
3476  }
3477  return NULL;
3478 }
struct pgMessageField * next
Definition: libpq-int.h:147
char contents[FLEXIBLE_ARRAY_MEMBER]
Definition: libpq-int.h:149

References pgMessageField::code, pgMessageField::contents, pg_result::errFields, pgMessageField::next, and res.

Referenced by BaseBackup(), confirm_query_canceled_impl(), CreateReplicationSlot(), dblink_res_error(), ecpg_raise_backend(), ECPGnoticeReceiver(), GetTableInfo(), libpqrcv_exec(), minimal_error_message(), pgfdw_report_error(), pgpassfileWarning(), pqBuildErrorMessage3(), PQconnectPoll(), readCommandResponse(), SetResultVariables(), should_processing_continue(), TableCommandResultHandler(), test_pipeline_abort(), and try_complete_step().

◆ PQresultErrorMessage()

◆ PQresultMemorySize()

size_t PQresultMemorySize ( const PGresult res)

Definition at line 663 of file fe-exec.c.

664 {
665  if (!res)
666  return 0;
667  return res->memorySize;
668 }

References pg_result::memorySize, and res.

◆ PQresultStatus()

ExecStatusType PQresultStatus ( const PGresult res)

Definition at line 3411 of file fe-exec.c.

3412 {
3413  if (!res)
3414  return PGRES_FATAL_ERROR;
3415  return res->resultStatus;
3416 }

References PGRES_FATAL_ERROR, res, and pg_result::resultStatus.

Referenced by _doSetSessionAuth(), _printTableAccessMethodNoStorage(), _selectOutputSchema(), _selectTableAccessMethod(), _selectTablespace(), AcceptResult(), advanceConnectionState(), BaseBackup(), check_and_drop_existing_subscriptions(), check_loadable_libraries(), check_prepare_conn(), check_publisher(), check_subscriber(), ClearOrSaveResult(), close_cursor(), compile_database_list(), compile_relation_list_one_db(), confirm_query_canceled_impl(), connect_database(), create_cursor(), create_logical_replication_slot(), create_publication(), create_subscription(), CreateReplicationSlot(), dblink_close(), dblink_exec(), dblink_fetch(), dblink_open(), dblink_record_internal(), deallocate_query(), DescribeQuery(), discardUntilSync(), do_sql_command_end(), drop_existing_subscriptions(), drop_failover_replication_slots(), drop_publication(), drop_replication_slot(), DropReplicationSlot(), dumpTableData_copy(), ecpg_check_PQresult(), ecpg_process_output(), enable_subscription(), EndDBCopyMode(), exec_command_password(), ExecQueryAndProcessResults(), execute_dml_stmt(), execute_foreign_modify(), executeCommand(), executeMaintenanceCommand(), executeQuery(), executeQueryOrDie(), ExecuteSqlCommand(), ExecuteSqlQuery(), ExecuteSqlStatement(), executeStatement(), fetch_more_data(), generate_object_name(), get_create_object_cmd(), get_primary_sysid(), get_remote_estimate(), GetConnection(), GetSlotInformation(), GetTableInfo(), handleCopyIn(), handleCopyOut(), HandleCopyResult(), HandleEndOfCopyStream(), init_libpq_conn(), initPopulateTable(), libpq_fetch_file(), libpq_traverse_files(), libpqrcv_alter_slot(), libpqrcv_connect(), libpqrcv_create_slot(), libpqrcv_endstreaming(), libpqrcv_exec(), libpqrcv_identify_system(), libpqrcv_PQexec(), libpqrcv_readtimelinehistoryfile(), libpqrcv_receive(), libpqrcv_startstreaming(), libpqsrv_get_result_last(), lo_close(), lo_creat(), lo_create(), lo_lseek(), lo_lseek64(), lo_open(), lo_read(), lo_tell(), lo_tell64(), lo_truncate(), lo_truncate64(), lo_unlink(), lo_write(), lockTableForWorker(), lookup_object_oid(), main(), materializeResult(), pgfdw_exec_cleanup_query_end(), postgresAcquireSampleRowsFunc(), postgresAnalyzeForeignTable(), postgresGetAnalyzeInfoForForeignTable(), postgresImportForeignSchema(), postgresReScanForeignScan(), PQconnectPoll(), PQencryptPasswordConn(), prepare_foreign_modify(), prepareCommand(), PrintQueryResult(), PrintQueryStatus(), PrintResultInCrosstab(), process_queued_fetch_requests(), process_result(), readCommandResponse(), ReceiveCopyData(), ReceiveXlogStream(), RetrieveDataDirCreatePerm(), RetrieveWalSegSize(), run_permutation(), run_simple_command(), run_simple_query(), RunIdentifySystem(), SendQuery(), server_is_in_recovery(), set_replication_progress(), should_processing_continue(), sql_conn(), sql_exec(), storeQueryResult(), StreamLogicalLog(), TableCommandResultHandler(), test_disallowed_in_pipeline(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_prepared(), test_simple_pipeline(), test_singlerowmode(), test_transaction(), test_uniqviol(), try_complete_step(), tryExecuteStatement(), vacuumlo(), verify_btree_slot_handler(), verify_heap_slot_handler(), and wait_for_connection_state().

◆ PQresultVerboseErrorMessage()

char* PQresultVerboseErrorMessage ( const PGresult res,
PGVerbosity  verbosity,
PGContextVisibility  show_context 
)

Definition at line 3435 of file fe-exec.c.

3438 {
3439  PQExpBufferData workBuf;
3440 
3441  /*
3442  * Because the caller is expected to free the result string, we must
3443  * strdup any constant result. We use plain strdup and document that
3444  * callers should expect NULL if out-of-memory.
3445  */
3446  if (!res ||
3449  return strdup(libpq_gettext("PGresult is not an error result\n"));
3450 
3451  initPQExpBuffer(&workBuf);
3452 
3453  pqBuildErrorMessage3(&workBuf, res, verbosity, show_context);
3454 
3455  /* If insufficient memory to format the message, fail cleanly */
3456  if (PQExpBufferDataBroken(workBuf))
3457  {
3458  termPQExpBuffer(&workBuf);
3459  return strdup(libpq_gettext("out of memory\n"));
3460  }
3461 
3462  return workBuf.data;
3463 }
void pqBuildErrorMessage3(PQExpBuffer msg, const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context)

References PQExpBufferData::data, initPQExpBuffer(), libpq_gettext, PGRES_FATAL_ERROR, PGRES_NONFATAL_ERROR, pqBuildErrorMessage3(), PQExpBufferDataBroken, res, pg_result::resultStatus, and termPQExpBuffer().

Referenced by exec_command_errverbose().

◆ PQsendClosePortal()

int PQsendClosePortal ( PGconn conn,
const char *  portal 
)

Definition at line 2569 of file fe-exec.c.

2570 {
2571  return PQsendTypedCommand(conn, PqMsg_Close, 'P', portal);
2572 }

References conn, PqMsg_Close, and PQsendTypedCommand().

Referenced by test_prepared().

◆ PQsendClosePrepared()

int PQsendClosePrepared ( PGconn conn,
const char *  stmt 
)

Definition at line 2556 of file fe-exec.c.

2557 {
2558  return PQsendTypedCommand(conn, PqMsg_Close, 'S', stmt);
2559 }

References conn, PqMsg_Close, PQsendTypedCommand(), and stmt.

Referenced by test_prepared().

◆ PQsendDescribePortal()

int PQsendDescribePortal ( PGconn conn,
const char *  portal 
)

Definition at line 2504 of file fe-exec.c.

2505 {
2506  return PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal);
2507 }

References conn, PqMsg_Describe, and PQsendTypedCommand().

Referenced by test_prepared().

◆ PQsendDescribePrepared()

int PQsendDescribePrepared ( PGconn conn,
const char *  stmt 
)

Definition at line 2491 of file fe-exec.c.

2492 {
2493  return PQsendTypedCommand(conn, PqMsg_Describe, 'S', stmt);
2494 }

References conn, PqMsg_Describe, PQsendTypedCommand(), and stmt.

Referenced by test_prepared().

◆ PQsendFlushRequest()

int PQsendFlushRequest ( PGconn conn)

Definition at line 3371 of file fe-exec.c.

3372 {
3373  if (!conn)
3374  return 0;
3375 
3376  /* Don't try to send if we know there's no live connection. */
3377  if (conn->status != CONNECTION_OK)
3378  {
3379  libpq_append_conn_error(conn, "no connection to the server");
3380  return 0;
3381  }
3382 
3383  /* Can't send while already busy, either, unless enqueuing for later */
3384  if (conn->asyncStatus != PGASYNC_IDLE &&
3386  {
3387  libpq_append_conn_error(conn, "another command is already in progress");
3388  return 0;
3389  }
3390 
3391  if (pqPutMsgStart(PqMsg_Flush, conn) < 0 ||
3392  pqPutMsgEnd(conn) < 0)
3393  {
3394  return 0;
3395  }
3396 
3397  /*
3398  * Give the data a push (in pipeline mode, only if we're past the size
3399  * threshold). In nonblock mode, don't complain if we're unable to send
3400  * it all; PQgetResult() will do any additional flushing needed.
3401  */
3402  if (pqPipelineFlush(conn) < 0)
3403  return 0;
3404 
3405  return 1;
3406 }
static int pqPipelineFlush(PGconn *conn)
Definition: fe-exec.c:4016
#define PqMsg_Flush
Definition: protocol.h:24

References pg_conn::asyncStatus, conn, CONNECTION_OK, libpq_append_conn_error(), PGASYNC_IDLE, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, PqMsg_Flush, pqPipelineFlush(), pqPutMsgEnd(), pqPutMsgStart(), and pg_conn::status.

Referenced by test_nosync(), test_pipeline_idle(), test_singlerowmode(), and test_uniqviol().

◆ PQsendPipelineSync()

int PQsendPipelineSync ( PGconn conn)

Definition at line 3282 of file fe-exec.c.

3283 {
3284  return pqPipelineSyncInternal(conn, false);
3285 }

References conn, and pqPipelineSyncInternal().

Referenced by executeMetaCommand(), and test_multi_pipelines().

◆ PQsendPrepare()

int PQsendPrepare ( PGconn conn,
const char *  stmtName,
const char *  query,
int  nParams,
const Oid paramTypes 
)

Definition at line 1536 of file fe-exec.c.

1539 {
1540  PGcmdQueueEntry *entry = NULL;
1541 
1542  if (!PQsendQueryStart(conn, true))
1543  return 0;
1544 
1545  /* check the arguments */
1546  if (!stmtName)
1547  {
1548  libpq_append_conn_error(conn, "statement name is a null pointer");
1549  return 0;
1550  }
1551  if (!query)
1552  {
1553  libpq_append_conn_error(conn, "command string is a null pointer");
1554  return 0;
1555  }
1556  if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1557  {
1558  libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1560  return 0;
1561  }
1562 
1563  entry = pqAllocCmdQueueEntry(conn);
1564  if (entry == NULL)
1565  return 0; /* error msg already set */
1566 
1567  /* construct the Parse message */
1568  if (pqPutMsgStart(PqMsg_Parse, conn) < 0 ||
1569  pqPuts(stmtName, conn) < 0 ||
1570  pqPuts(query, conn) < 0)
1571  goto sendFailed;
1572 
1573  if (nParams > 0 && paramTypes)
1574  {
1575  int i;
1576 
1577  if (pqPutInt(nParams, 2, conn) < 0)
1578  goto sendFailed;
1579  for (i = 0; i < nParams; i++)
1580  {
1581  if (pqPutInt(paramTypes[i], 4, conn) < 0)
1582  goto sendFailed;
1583  }
1584  }
1585  else
1586  {
1587  if (pqPutInt(0, 2, conn) < 0)
1588  goto sendFailed;
1589  }
1590  if (pqPutMsgEnd(conn) < 0)
1591  goto sendFailed;
1592 
1593  /* Add a Sync, unless in pipeline mode. */
1595  {
1596  if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
1597  pqPutMsgEnd(conn) < 0)
1598  goto sendFailed;
1599  }
1600 
1601  /* remember we are doing just a Parse */
1602  entry->queryclass = PGQUERY_PREPARE;
1603 
1604  /* and remember the query text too, if possible */
1605  /* if insufficient memory, query just winds up NULL */
1606  entry->query = strdup(query);
1607 
1608  /*
1609  * Give the data a push (in pipeline mode, only if we're past the size
1610  * threshold). In nonblock mode, don't complain if we're unable to send
1611  * it all; PQgetResult() will do any additional flushing needed.
1612  */
1613  if (pqPipelineFlush(conn) < 0)
1614  goto sendFailed;
1615 
1616  /* OK, it's launched! */
1617  pqAppendCmdQueueEntry(conn, entry);
1618 
1619  return 1;
1620 
1621 sendFailed:
1622  pqRecycleCmdQueueEntry(conn, entry);
1623  /* error message should be set up already */
1624  return 0;
1625 }
static void pqAppendCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry)
Definition: fe-exec.c:1339
static PGcmdQueueEntry * pqAllocCmdQueueEntry(PGconn *conn)
Definition: fe-exec.c:1306
static bool PQsendQueryStart(PGconn *conn, bool newQuery)
Definition: fe-exec.c:1673
static void pqRecycleCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry)
Definition: fe-exec.c:1386
int pqPutInt(int value, size_t bytes, PGconn *conn)
Definition: fe-misc.c:253
#define PQ_QUERY_PARAM_MAX_LIMIT
Definition: libpq-fe.h:473
@ PGQUERY_PREPARE
Definition: libpq-int.h:328
#define PqMsg_Parse
Definition: protocol.h:25

References conn, i, libpq_append_conn_error(), PGQUERY_PREPARE, pg_conn::pipelineStatus, PQ_PIPELINE_OFF, PQ_QUERY_PARAM_MAX_LIMIT, pqAllocCmdQueueEntry(), pqAppendCmdQueueEntry(), PqMsg_Parse, PqMsg_Sync, pqPipelineFlush(), pqPutInt(), pqPutMsgEnd(), pqPutMsgStart(), pqPuts(), pqRecycleCmdQueueEntry(), PQsendQueryStart(), PGcmdQueueEntry::query, and PGcmdQueueEntry::queryclass.

Referenced by PQprepare(), prepare_foreign_modify(), test_pipelined_insert(), test_prepared(), and test_transaction().

◆ PQsendQuery()

◆ PQsendQueryParams()

int PQsendQueryParams ( PGconn conn,
const char *  command,
int  nParams,
const Oid paramTypes,
const char *const *  paramValues,
const int *  paramLengths,
const int *  paramFormats,
int  resultFormat 
)

Definition at line 1492 of file fe-exec.c.

1500 {
1501  if (!PQsendQueryStart(conn, true))
1502  return 0;
1503 
1504  /* check the arguments */
1505  if (!command)
1506  {
1507  libpq_append_conn_error(conn, "command string is a null pointer");
1508  return 0;
1509  }
1510  if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1511  {
1512  libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1514  return 0;
1515  }
1516 
1517  return PQsendQueryGuts(conn,
1518  command,
1519  "", /* use unnamed statement */
1520  nParams,
1521  paramTypes,
1522  paramValues,
1523  paramLengths,
1524  paramFormats,
1525  resultFormat);
1526 }
static int PQsendQueryGuts(PGconn *conn, const char *command, const char *stmtName, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1757

References conn, libpq_append_conn_error(), PQ_QUERY_PARAM_MAX_LIMIT, PQsendQueryGuts(), and PQsendQueryStart().

Referenced by create_cursor(), ExecQueryAndProcessResults(), execute_dml_stmt(), libpqsrv_exec_params(), PQexecParams(), send_cancellable_query_impl(), sendCommand(), test_multi_pipelines(), test_nosync(), test_pipeline_abort(), test_pipeline_idle(), test_pipelined_insert(), test_simple_pipeline(), test_singlerowmode(), and test_transaction().

◆ PQsendQueryPrepared()

int PQsendQueryPrepared ( PGconn conn,
const char *  stmtName,
int  nParams,
const char *const *  paramValues,
const int *  paramLengths,
const int *  paramFormats,
int  resultFormat 
)

Definition at line 1633 of file fe-exec.c.

1640 {
1641  if (!PQsendQueryStart(conn, true))
1642  return 0;
1643 
1644  /* check the arguments */
1645  if (!stmtName)
1646  {
1647  libpq_append_conn_error(conn, "statement name is a null pointer");
1648  return 0;
1649  }
1650  if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1651  {
1652  libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1654  return 0;
1655  }
1656 
1657  return PQsendQueryGuts(conn,
1658  NULL, /* no command to parse */
1659  stmtName,
1660  nParams,
1661  NULL, /* no param types */
1662  paramValues,
1663  paramLengths,
1664  paramFormats,
1665  resultFormat);
1666 }

References conn, libpq_append_conn_error(), PQ_QUERY_PARAM_MAX_LIMIT, PQsendQueryGuts(), and PQsendQueryStart().

Referenced by execute_foreign_modify(), PQexecPrepared(), process_queued_fetch_requests(), sendCommand(), test_pipelined_insert(), test_transaction(), and test_uniqviol().

◆ PQserverVersion()

◆ PQsetChunkedRowsMode()

int PQsetChunkedRowsMode ( PGconn conn,
int  chunkSize 
)

Definition at line 1965 of file fe-exec.c.

1966 {
1967  if (chunkSize > 0 && canChangeResultMode(conn))
1968  {
1969  conn->partialResMode = true;
1970  conn->singleRowMode = false;
1971  conn->maxChunkSize = chunkSize;
1972  return 1;
1973  }
1974  else
1975  return 0;
1976 }
static bool canChangeResultMode(PGconn *conn)
Definition: fe-exec.c:1925
int maxChunkSize
Definition: libpq-int.h:446
bool singleRowMode
Definition: libpq-int.h:445
bool partialResMode
Definition: libpq-int.h:444

References canChangeResultMode(), conn, pg_conn::maxChunkSize, pg_conn::partialResMode, and pg_conn::singleRowMode.

Referenced by ExecQueryAndProcessResults(), and test_singlerowmode().

◆ PQsetClientEncoding()

int PQsetClientEncoding ( PGconn conn,
const char *  encoding 
)

Definition at line 7267 of file fe-connect.c.

7268 {
7269  char qbuf[128];
7270  static const char query[] = "set client_encoding to '%s'";
7271  PGresult *res;
7272  int status;
7273 
7274  if (!conn || conn->status != CONNECTION_OK)
7275  return -1;
7276 
7277  if (!encoding)
7278  return -1;
7279 
7280  /* Resolve special "auto" value from the locale */
7281  if (strcmp(encoding, "auto") == 0)
7283 
7284  /* check query buffer overflow */
7285  if (sizeof(qbuf) < (sizeof(query) + strlen(encoding)))
7286  return -1;
7287 
7288  /* ok, now send a query */
7289  sprintf(qbuf, query, encoding);
7290  res = PQexec(conn, qbuf);
7291 
7292  if (res == NULL)
7293  return -1;
7295  status = -1;
7296  else
7297  {
7298  /*
7299  * We rely on the backend to report the parameter value, and we'll
7300  * change state at that time.
7301  */
7302  status = 0; /* everything is ok */
7303  }
7304  PQclear(res);
7305  return status;
7306 }
#define pg_encoding_to_char
Definition: pg_wchar.h:630
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
Definition: chklocale.c:428

References conn, CONNECTION_OK, encoding, pg_encoding_to_char, pg_get_encoding_from_locale(), PGRES_COMMAND_OK, PQclear(), PQexec(), res, pg_result::resultStatus, sprintf, and pg_conn::status.

Referenced by dblink_connect(), dblink_get_conn(), exec_command_encoding(), main(), and setup_connection().

◆ PQsetdbLogin()

PGconn* PQsetdbLogin ( const char *  pghost,
const char *  pgport,
const char *  pgoptions,
const char *  pgtty,
const char *  dbName,
const char *  login,
const char *  pwd 
)

Definition at line 1919 of file fe-connect.c.

1922 {
1923  PGconn *conn;
1924 
1925  /*
1926  * Allocate memory for the conn structure. Note that we also expect this
1927  * to initialize conn->errorMessage to empty. All subsequent steps during
1928  * connection initialization will only append to that buffer.
1929  */
1930  conn = pqMakeEmptyPGconn();
1931  if (conn == NULL)
1932  return NULL;
1933 
1934  /*
1935  * If the dbName parameter contains what looks like a connection string,
1936  * parse it into conn struct using connectOptions1.
1937  */
1939  {
1940  if (!connectOptions1(conn, dbName))
1941  return conn;
1942  }
1943  else
1944  {
1945  /*
1946  * Old-style path: first, parse an empty conninfo string in order to
1947  * set up the same defaults that PQconnectdb() would use.
1948  */
1949  if (!connectOptions1(conn, ""))
1950  return conn;
1951 
1952  /* Insert dbName parameter value into struct */
1953  if (dbName && dbName[0] != '\0')
1954  {
1955  free(conn->dbName);
1956  conn->dbName = strdup(dbName);
1957  if (!conn->dbName)
1958  goto oom_error;
1959  }
1960  }
1961 
1962  /*
1963  * Insert remaining parameters into struct, overriding defaults (as well
1964  * as any conflicting data from dbName taken as a conninfo).
1965  */
1966  if (pghost && pghost[0] != '\0')
1967  {
1968  free(conn->pghost);
1969  conn->pghost = strdup(pghost);
1970  if (!conn->pghost)
1971  goto oom_error;
1972  }
1973 
1974  if (pgport && pgport[0] != '\0')
1975  {
1976  free(conn->pgport);
1977  conn->pgport = strdup(pgport);
1978  if (!conn->pgport)
1979  goto oom_error;
1980  }
1981 
1982  if (pgoptions && pgoptions[0] != '\0')
1983  {
1984  free(conn->pgoptions);
1985  conn->pgoptions = strdup(pgoptions);
1986  if (!conn->pgoptions)
1987  goto oom_error;
1988  }
1989 
1990  if (login && login[0] != '\0')
1991  {
1992  free(conn->pguser);
1993  conn->pguser = strdup(login);
1994  if (!conn->pguser)
1995  goto oom_error;
1996  }
1997 
1998  if (pwd && pwd[0] != '\0')
1999  {
2000  free(conn->pgpass);
2001  conn->pgpass = strdup(pwd);
2002  if (!conn->pgpass)
2003  goto oom_error;
2004  }
2005 
2006  /*
2007  * Compute derived options
2008  */
2009  if (!pqConnectOptions2(conn))
2010  return conn;
2011 
2012  /*
2013  * Connect to the database
2014  */
2015  if (pqConnectDBStart(conn))
2016  (void) pqConnectDBComplete(conn);
2017 
2018  return conn;
2019 
2020 oom_error:
2022  libpq_append_conn_error(conn, "out of memory");
2023  return conn;
2024 }
static bool recognized_connection_string(const char *connstr)
Definition: fe-connect.c:5856
static const char * pghost
Definition: pgbench.c:294
static const char * pgport
Definition: pgbench.c:295
static const char * dbName
Definition: pgbench.c:297
char * pghost
Definition: libpq-int.h:367
char * pguser
Definition: libpq-int.h:385
char * pgport
Definition: libpq-int.h:375

References conn, CONNECTION_BAD, connectOptions1(), dbName, pg_conn::dbName, free, libpq_append_conn_error(), pghost, pg_conn::pghost, pg_conn::pgoptions, pg_conn::pgpass, pgport, pg_conn::pgport, pg_conn::pguser, pqConnectDBComplete(), pqConnectDBStart(), pqConnectOptions2(), pqMakeEmptyPGconn(), recognized_connection_string(), and pg_conn::status.

◆ PQsetErrorContextVisibility()

PGContextVisibility PQsetErrorContextVisibility ( PGconn conn,
PGContextVisibility  show_context 
)

Definition at line 7321 of file fe-connect.c.

7322 {
7323  PGContextVisibility old;
7324 
7325  if (!conn)
7326  return PQSHOW_CONTEXT_ERRORS;
7327  old = conn->show_context;
7328  conn->show_context = show_context;
7329  return old;
7330 }
PGContextVisibility show_context
Definition: libpq-int.h:516

References conn, PQSHOW_CONTEXT_ERRORS, and pg_conn::show_context.

Referenced by show_context_hook(), and SyncVariables().

◆ PQsetErrorVerbosity()

PGVerbosity PQsetErrorVerbosity ( PGconn conn,
PGVerbosity  verbosity 
)

Definition at line 7309 of file fe-connect.c.

7310 {
7311  PGVerbosity old;
7312 
7313  if (!conn)
7314  return PQERRORS_DEFAULT;
7315  old = conn->verbosity;
7316  conn->verbosity = verbosity;
7317  return old;
7318 }
PGVerbosity verbosity
Definition: libpq-int.h:515

References conn, PQERRORS_DEFAULT, and pg_conn::verbosity.

Referenced by main(), SyncVariables(), and verbosity_hook().

◆ PQsetnonblocking()

int PQsetnonblocking ( PGconn conn,
int  arg 
)

Definition at line 3944 of file fe-exec.c.

3945 {
3946  bool barg;
3947 
3948  if (!conn || conn->status == CONNECTION_BAD)
3949  return -1;
3950 
3951  barg = (arg ? true : false);
3952 
3953  /* early out if the socket is already in the state requested */
3954  if (barg == conn->nonblocking)
3955  return 0;
3956 
3957  /*
3958  * to guarantee constancy for flushing/query/result-polling behavior we
3959  * need to flush the send queue at this point in order to guarantee proper
3960  * behavior. this is ok because either they are making a transition _from_
3961  * or _to_ blocking mode, either way we can block them.
3962  *
3963  * Clear error state in case pqFlush adds to it, unless we're actively
3964  * pipelining, in which case it seems best not to.
3965  */
3966  if (conn->cmd_queue_head == NULL)
3968 
3969  /* if we are going from blocking to non-blocking flush here */
3970  if (pqFlush(conn))
3971  return -1;
3972 
3973  conn->nonblocking = barg;
3974 
3975  return 0;
3976 }
return true
Definition: isn.c:126
void * arg
bool nonblocking
Definition: libpq-int.h:441

References arg, pg_conn::cmd_queue_head, conn, CONNECTION_BAD, pg_conn::nonblocking, pqClearConnErrorState, pqFlush(), pg_conn::status, and true.

Referenced by test_cancel(), test_pipelined_insert(), and test_uniqviol().

◆ PQsetNoticeProcessor()

PQnoticeProcessor PQsetNoticeProcessor ( PGconn conn,
PQnoticeProcessor  proc,
void *  arg 
)

Definition at line 7350 of file fe-connect.c.

7351 {
7352  PQnoticeProcessor old;
7353 
7354  if (conn == NULL)
7355  return NULL;
7356 
7357  old = conn->noticeHooks.noticeProc;
7358  if (proc)
7359  {
7360  conn->noticeHooks.noticeProc = proc;
7362  }
7363  return old;
7364 }
void(* PQnoticeProcessor)(void *arg, const char *message)
Definition: libpq-fe.h:209

References arg, conn, pg_conn::noticeHooks, PGNoticeHooks::noticeProc, and PGNoticeHooks::noticeProcArg.

Referenced by ConnectDatabase(), do_connect(), main(), and test_pipeline_idle().

◆ PQsetNoticeReceiver()

PQnoticeReceiver PQsetNoticeReceiver ( PGconn conn,
PQnoticeReceiver  proc,
void *  arg 
)

Definition at line 7333 of file fe-connect.c.

7334 {
7335  PQnoticeReceiver old;
7336 
7337  if (conn == NULL)
7338  return NULL;
7339 
7340  old = conn->noticeHooks.noticeRec;
7341  if (proc)
7342  {
7343  conn->noticeHooks.noticeRec = proc;
7345  }
7346  return old;
7347 }
void(* PQnoticeReceiver)(void *arg, const PGresult *res)
Definition: libpq-fe.h:208

References arg, conn, pg_conn::noticeHooks, PGNoticeHooks::noticeRec, and PGNoticeHooks::noticeRecArg.

Referenced by ECPGconnect().

◆ PQsetResultAttrs()

int PQsetResultAttrs ( PGresult res,
int  numAttributes,
PGresAttDesc attDescs 
)

Definition at line 249 of file fe-exec.c.

250 {
251  int i;
252 
253  /* Fail if argument is NULL or OOM_result */
254  if (!res || (const PGresult *) res == &OOM_result)
255  return false;
256 
257  /* If attrs already exist, they cannot be overwritten. */
258  if (res->numAttributes > 0)
259  return false;
260 
261  /* ignore no-op request */
262  if (numAttributes <= 0 || !attDescs)
263  return true;
264 
265  res->attDescs = (PGresAttDesc *)
266  PQresultAlloc(res, numAttributes * sizeof(PGresAttDesc));
267 
268  if (!res->attDescs)
269  return false;
270 
271  res->numAttributes = numAttributes;
272  memcpy(res->attDescs, attDescs, numAttributes * sizeof(PGresAttDesc));
273 
274  /* deep-copy the attribute names, and determine format */
275  res->binary = 1;
276  for (i = 0; i < res->numAttributes; i++)
277  {
278  if (res->attDescs[i].name)
280  else
282 
283  if (!res->attDescs[i].name)
284  return false;
285 
286  if (res->attDescs[i].format == 0)
287  res->binary = 0;
288  }
289 
290  return true;
291 }
char * pqResultStrdup(PGresult *res, const char *str)
Definition: fe-exec.c:675
void * PQresultAlloc(PGresult *res, size_t nBytes)
Definition: fe-exec.c:543

References pg_result::attDescs, pg_result::binary, pgresAttDesc::format, i, pgresAttDesc::name, pg_result::null_field, pg_result::numAttributes, OOM_result, PQresultAlloc(), pqResultStrdup(), and res.

Referenced by PQcopyResult().

◆ PQsetSingleRowMode()

int PQsetSingleRowMode ( PGconn conn)

Definition at line 1948 of file fe-exec.c.

1949 {
1951  {
1952  conn->partialResMode = true;
1953  conn->singleRowMode = true;
1954  conn->maxChunkSize = 1;
1955  return 1;
1956  }
1957  else
1958  return 0;
1959 }

References canChangeResultMode(), conn, pg_conn::maxChunkSize, pg_conn::partialResMode, and pg_conn::singleRowMode.

Referenced by process_queued_fetch_requests(), storeQueryResult(), test_pipeline_abort(), and test_singlerowmode().

◆ PQsetSSLKeyPassHook_OpenSSL()

void PQsetSSLKeyPassHook_OpenSSL ( PQsslKeyPassHook_OpenSSL_type  hook)

Definition at line 2094 of file fe-secure-openssl.c.

2095 {
2096  PQsslKeyPassHook = hook;
2097 }

References PQsslKeyPassHook.

◆ PQsetTraceFlags()

void PQsetTraceFlags ( PGconn conn,
int  flags 
)

Definition at line 64 of file fe-trace.c.

65 {
66  if (conn == NULL)
67  return;
68  /* If PQtrace() failed, do nothing. */
69  if (conn->Pfdebug == NULL)
70  return;
71  conn->traceFlags = flags;
72 }
FILE * Pfdebug
Definition: libpq-int.h:424
int traceFlags
Definition: libpq-int.h:425

References conn, pg_conn::Pfdebug, and pg_conn::traceFlags.

Referenced by main().

◆ PQsetvalue()

int PQsetvalue ( PGresult res,
int  tup_num,
int  field_num,
char *  value,
int  len 
)

Definition at line 452 of file fe-exec.c.

453 {
454  PGresAttValue *attval;
455  const char *errmsg = NULL;
456 
457  /* Fail if argument is NULL or OOM_result */
458  if (!res || (const PGresult *) res == &OOM_result)
459  return false;
460 
461  /* Invalid field_num? */
462  if (!check_field_number(res, field_num))
463  return false;
464 
465  /* Invalid tup_num, must be <= ntups */
466  if (tup_num < 0 || tup_num > res->ntups)
467  {
469  "row number %d is out of range 0..%d",
470  tup_num, res->ntups);
471  return false;
472  }
473 
474  /* need to allocate a new tuple? */
475  if (tup_num == res->ntups)
476  {
477  PGresAttValue *tup;
478  int i;
479 
480  tup = (PGresAttValue *)
482  true);
483 
484  if (!tup)
485  goto fail;
486 
487  /* initialize each column to NULL */
488  for (i = 0; i < res->numAttributes; i++)
489  {
490  tup[i].len = NULL_LEN;
491  tup[i].value = res->null_field;
492  }
493 
494  /* add it to the array */
495  if (!pqAddTuple(res, tup, &errmsg))
496  goto fail;
497  }
498 
499  attval = &res->tuples[tup_num][field_num];
500 
501  /* treat either NULL_LEN or NULL value pointer as a NULL field */
502  if (len == NULL_LEN || value == NULL)
503  {
504  attval->len = NULL_LEN;
505  attval->value = res->null_field;
506  }
507  else if (len <= 0)
508  {
509  attval->len = 0;
510  attval->value = res->null_field;
511  }
512  else
513  {
514  attval->value = (char *) pqResultAlloc(res, len + 1, true);
515  if (!attval->value)
516  goto fail;
517  attval->len = len;
518  memcpy(attval->value, value, len);
519  attval->value[len] = '\0';
520  }
521 
522  return true;
523 
524  /*
525  * Report failure via pqInternalNotice. If preceding code didn't provide
526  * an error message, assume "out of memory" was meant.
527  */
528 fail:
529  if (!errmsg)
530  errmsg = libpq_gettext("out of memory");
532 
533  return false;
534 }
static bool pqAddTuple(PGresult *res, PGresAttValue *tup, const char **errmsgp)
Definition: fe-exec.c:993
static struct @155 value

References check_field_number(), errmsg(), i, pgresAttValue::len, len, libpq_gettext, pg_result::noticeHooks, pg_result::ntups, pg_result::null_field, NULL_LEN, pg_result::numAttributes, OOM_result, pqAddTuple(), pqInternalNotice(), pqResultAlloc(), res, pg_result::tuples, value, and pgresAttValue::value.

Referenced by PQcopyResult().

◆ PQsocket()

◆ PQsocketPoll()

int PQsocketPoll ( int  sock,
int  forRead,
int  forWrite,
pg_usec_time_t  end_time 
)

Definition at line 1091 of file fe-misc.c.

1092 {
1093  /* We use poll(2) if available, otherwise select(2) */
1094 #ifdef HAVE_POLL
1095  struct pollfd input_fd;
1096  int timeout_ms;
1097 
1098  if (!forRead && !forWrite)
1099  return 0;
1100 
1101  input_fd.fd = sock;
1102  input_fd.events = POLLERR;
1103  input_fd.revents = 0;
1104 
1105  if (forRead)
1106  input_fd.events |= POLLIN;
1107  if (forWrite)
1108  input_fd.events |= POLLOUT;
1109 
1110  /* Compute appropriate timeout interval */
1111  if (end_time == -1)
1112  timeout_ms = -1;
1113  else if (end_time == 0)
1114  timeout_ms = 0;
1115  else
1116  {
1118 
1119  if (end_time > now)
1120  timeout_ms = (end_time - now) / 1000;
1121  else
1122  timeout_ms = 0;
1123  }
1124 
1125  return poll(&input_fd, 1, timeout_ms);
1126 #else /* !HAVE_POLL */
1127 
1128  fd_set input_mask;
1129  fd_set output_mask;
1130  fd_set except_mask;
1131  struct timeval timeout;
1132  struct timeval *ptr_timeout;
1133 
1134  if (!forRead && !forWrite)
1135  return 0;
1136 
1137  FD_ZERO(&input_mask);
1138  FD_ZERO(&output_mask);
1139  FD_ZERO(&except_mask);
1140  if (forRead)
1141  FD_SET(sock, &input_mask);
1142 
1143  if (forWrite)
1144  FD_SET(sock, &output_mask);
1145  FD_SET(sock, &except_mask);
1146 
1147  /* Compute appropriate timeout interval */
1148  if (end_time == -1)
1149  ptr_timeout = NULL;
1150  else if (end_time == 0)
1151  {
1152  timeout.tv_sec = 0;
1153  timeout.tv_usec = 0;
1154  ptr_timeout = &timeout;
1155  }
1156  else
1157  {
1159 
1160  if (end_time > now)
1161  {
1162  timeout.tv_sec = (end_time - now) / 1000000;
1163  timeout.tv_usec = (end_time - now) % 1000000;
1164  }
1165  else
1166  {
1167  timeout.tv_sec = 0;
1168  timeout.tv_usec = 0;
1169  }
1170  ptr_timeout = &timeout;
1171  }
1172 
1173  return select(sock + 1, &input_mask, &output_mask,
1174  &except_mask, ptr_timeout);
1175 #endif /* HAVE_POLL */
1176 }
Datum now(PG_FUNCTION_ARGS)
Definition: timestamp.c:1619
pg_usec_time_t PQgetCurrentTimeUSec(void)
Definition: fe-misc.c:1185
static int64 end_time
Definition: pgbench.c:175
#define select(n, r, w, e, timeout)
Definition: win32_port.h:500

References end_time, now(), PQgetCurrentTimeUSec(), and select.

Referenced by pqSocketCheck(), and wait_until_connected().

◆ PQsslAttribute()

const char* PQsslAttribute ( PGconn conn,
const char *  attribute_name 
)

Definition at line 1840 of file fe-secure-openssl.c.

1841 {
1842  if (!conn)
1843  {
1844  /* PQsslAttribute(NULL, "library") reports the default SSL library */
1845  if (strcmp(attribute_name, "library") == 0)
1846  return "OpenSSL";
1847  return NULL;
1848  }
1849 
1850  /* All attributes read as NULL for a non-encrypted connection */
1851  if (conn->ssl == NULL)
1852  return NULL;
1853 
1854  if (strcmp(attribute_name, "library") == 0)
1855  return "OpenSSL";
1856 
1857  if (strcmp(attribute_name, "key_bits") == 0)
1858  {
1859  static char sslbits_str[12];
1860  int sslbits;
1861 
1862  SSL_get_cipher_bits(conn->ssl, &sslbits);
1863  snprintf(sslbits_str, sizeof(sslbits_str), "%d", sslbits);
1864  return sslbits_str;
1865  }
1866 
1867  if (strcmp(attribute_name, "cipher") == 0)
1868  return SSL_get_cipher(conn->ssl);
1869 
1870  if (strcmp(attribute_name, "compression") == 0)
1871  return SSL_get_current_compression(conn->ssl) ? "on" : "off";
1872 
1873  if (strcmp(attribute_name, "protocol") == 0)
1874  return SSL_get_version(conn->ssl);
1875 
1876  if (strcmp(attribute_name, "alpn") == 0)
1877  {
1878  const unsigned char *data;
1879  unsigned int len;
1880  static char alpn_str[256]; /* alpn doesn't support longer than 255
1881  * bytes */
1882 
1883  SSL_get0_alpn_selected(conn->ssl, &data, &len);
1884  if (data == NULL || len == 0 || len > sizeof(alpn_str) - 1)
1885  return "";
1886  memcpy(alpn_str, data, len);
1887  alpn_str[len] = 0;
1888  return alpn_str;
1889  }
1890 
1891  return NULL; /* unknown attribute */
1892 }
const void * data

References conn, data, len, and snprintf.

Referenced by print_ssl_library(), and printSSLInfo().

◆ PQsslAttributeNames()

const char* const* PQsslAttributeNames ( PGconn conn)

Definition at line 1813 of file fe-secure-openssl.c.

1814 {
1815  static const char *const openssl_attrs[] = {
1816  "library",
1817  "key_bits",
1818  "cipher",
1819  "compression",
1820  "protocol",
1821  "alpn",
1822  NULL
1823  };
1824  static const char *const empty_attrs[] = {NULL};
1825 
1826  if (!conn)
1827  {
1828  /* Return attributes of default SSL library */
1829  return openssl_attrs;
1830  }
1831 
1832  /* No attrs for unencrypted connection */
1833  if (conn->ssl == NULL)
1834  return empty_attrs;
1835 
1836  return openssl_attrs;
1837 }

References conn.

◆ PQsslInUse()

int PQsslInUse ( PGconn conn)

Definition at line 103 of file fe-secure.c.

104 {
105  if (!conn)
106  return 0;
107  return conn->ssl_in_use;
108 }

References conn, and pg_conn::ssl_in_use.

Referenced by printSSLInfo().

◆ PQsslStruct()

void* PQsslStruct ( PGconn conn,
const char *  struct_name 
)

Definition at line 1803 of file fe-secure-openssl.c.

1804 {
1805  if (!conn)
1806  return NULL;
1807  if (strcmp(struct_name, "OpenSSL") == 0)
1808  return conn->ssl;
1809  return NULL;
1810 }

References conn.

◆ PQstatus()

◆ PQtrace()

void PQtrace ( PGconn conn,
FILE *  debug_port 
)

Definition at line 35 of file fe-trace.c.

36 {
37  if (conn == NULL)
38  return;
39  PQuntrace(conn);
40  if (debug_port == NULL)
41  return;
42 
43  conn->Pfdebug = debug_port;
44  conn->traceFlags = 0;
45 }
void PQuntrace(PGconn *conn)
Definition: fe-trace.c:49

References conn, pg_conn::Pfdebug, PQuntrace(), and pg_conn::traceFlags.

Referenced by main().

◆ PQtransactionStatus()

◆ PQtty()

char* PQtty ( const PGconn conn)

Definition at line 7102 of file fe-connect.c.

7103 {
7104  if (!conn)
7105  return NULL;
7106  return "";
7107 }

References conn.

◆ PQunescapeBytea()

unsigned char* PQunescapeBytea ( const unsigned char *  strtext,
size_t *  retbuflen 
)

Definition at line 4494 of file fe-exec.c.

4495 {
4496  size_t strtextlen,
4497  buflen;
4498  unsigned char *buffer,
4499  *tmpbuf;
4500  size_t i,
4501  j;
4502 
4503  if (strtext == NULL)
4504  return NULL;
4505 
4506  strtextlen = strlen((const char *) strtext);
4507 
4508  if (strtext[0] == '\\' && strtext[1] == 'x')
4509  {
4510  const unsigned char *s;
4511  unsigned char *p;
4512 
4513  buflen = (strtextlen - 2) / 2;
4514  /* Avoid unportable malloc(0) */
4515  buffer = (unsigned char *) malloc(buflen > 0 ? buflen : 1);
4516  if (buffer == NULL)
4517  return NULL;
4518 
4519  s = strtext + 2;
4520  p = buffer;
4521  while (*s)
4522  {
4523  char v1,
4524  v2;
4525 
4526  /*
4527  * Bad input is silently ignored. Note that this includes
4528  * whitespace between hex pairs, which is allowed by byteain.
4529  */
4530  v1 = get_hex(*s++);
4531  if (!*s || v1 == (char) -1)
4532  continue;
4533  v2 = get_hex(*s++);
4534  if (v2 != (char) -1)
4535  *p++ = (v1 << 4) | v2;
4536  }
4537 
4538  buflen = p - buffer;
4539  }
4540  else
4541  {
4542  /*
4543  * Length of input is max length of output, but add one to avoid
4544  * unportable malloc(0) if input is zero-length.
4545  */
4546  buffer = (unsigned char *) malloc(strtextlen + 1);
4547  if (buffer == NULL)
4548  return NULL;
4549 
4550  for (i = j = 0; i < strtextlen;)
4551  {
4552  switch (strtext[i])
4553  {
4554  case '\\':
4555  i++;
4556  if (strtext[i] == '\\')
4557  buffer[j++] = strtext[i++];
4558  else
4559  {
4560  if ((ISFIRSTOCTDIGIT(strtext[i])) &&
4561  (ISOCTDIGIT(strtext[i + 1])) &&
4562  (ISOCTDIGIT(strtext[i + 2])))
4563  {
4564  int byte;
4565 
4566  byte = OCTVAL(strtext[i++]);
4567  byte = (byte << 3) + OCTVAL(strtext[i++]);
4568  byte = (byte << 3) + OCTVAL(strtext[i++]);
4569  buffer[j++] = byte;
4570  }
4571  }
4572 
4573  /*
4574  * Note: if we see '\' followed by something that isn't a
4575  * recognized escape sequence, we loop around having done
4576  * nothing except advance i. Therefore the something will
4577  * be emitted as ordinary data on the next cycle. Corner
4578  * case: '\' at end of string will just be discarded.
4579  */
4580  break;
4581 
4582  default:
4583  buffer[j++] = strtext[i++];
4584  break;
4585  }
4586  }
4587  buflen = j; /* buflen is the length of the dequoted data */
4588  }
4589 
4590  /* Shrink the buffer to be no larger than necessary */
4591  /* +1 avoids unportable behavior when buflen==0 */
4592  tmpbuf = realloc(buffer, buflen + 1);
4593 
4594  /* It would only be a very brain-dead realloc that could fail, but... */
4595  if (!tmpbuf)
4596  {
4597  free(buffer);
4598  return NULL;
4599  }
4600 
4601  *retbuflen = buflen;
4602  return tmpbuf;
4603 }
static char get_hex(char c)
Definition: fe-exec.c:4330
#define ISOCTDIGIT(CH)
Definition: fe-exec.c:4478
#define OCTVAL(CH)
Definition: fe-exec.c:4479
#define ISFIRSTOCTDIGIT(CH)
Definition: fe-exec.c:4477
#define realloc(a, b)
Definition: header.h:60
static StringInfoData tmpbuf
Definition: walsender.c:170

References free, get_hex(), i, ISFIRSTOCTDIGIT, ISOCTDIGIT, j, malloc, OCTVAL, realloc, and tmpbuf.

◆ PQuntrace()

void PQuntrace ( PGconn conn)

Definition at line 49 of file fe-trace.c.

50 {
51  if (conn == NULL)
52  return;
53  if (conn->Pfdebug)
54  {
56  conn->Pfdebug = NULL;
57  }
58 
59  conn->traceFlags = 0;
60 }

References conn, fflush(), pg_conn::Pfdebug, and pg_conn::traceFlags.

Referenced by PQtrace().

◆ PQuser()

char* PQuser ( const PGconn conn)

Definition at line 7025 of file fe-connect.c.

7026 {
7027  if (!conn)
7028  return NULL;
7029  return conn->pguser;
7030 }

References conn, and pg_conn::pguser.

Referenced by do_connect(), exec_command_conninfo(), get_prompt(), main(), session_username(), and SyncVariables().