typedefstruct PGEvent
{
PGEventProc proc; /* the function to call on events */ char *name; /* used only for error messages */ void *passThrough; /* pointer supplied at registration time */ void *data; /* optional state (instance) data */ bool resultInitialized; /* T if RESULTCREATE/COPY succeeded */
} PGEvent;
struct pg_result
{ int ntups; int numAttributes;
PGresAttDesc *attDescs;
PGresAttValue **tuples; /* each PGresult tuple is an array of
* PGresAttValue's */ int tupArrSize; /* allocated size of tuples array */ int numParameters;
PGresParamDesc *paramDescs;
ExecStatusType resultStatus; char cmdStatus[CMDSTATUS_LEN]; /* cmd status from the query */ int binary; /* binary tuple values if binary == 1,
* otherwise text */
/* *ThesefieldsarecopiedfromtheoriginatingPGconn,sothatoperations *onthePGresultdon'thavetoreferencethePGconn.
*/
PGNoticeHooks noticeHooks;
PGEvent *events; int nEvents; int client_encoding; /* encoding id */
/* *Errorinformation(allNULLifnotanerrorresult).errMsgisthe *"overall"errormessagereturnedbyPQresultErrorMessage.Ifwehave *per-fieldinfothenitisstoredinalinkedlist.
*/ char *errMsg; /* error message, or NULL if no error */
PGMessageField *errFields; /* message broken into fields */ char *errQuery; /* text of triggering query, if available */
/* All NULL attributes in the query result point to this null string */ char null_field[1];
/* *Spacemanagementinformation.NotethatattDescsanderrorstuff,if *notnull,pointintoallocatedblocks.Buttuplespointstoa *separatelymalloc'dblock,sothatwecanreallocit.
*/
PGresult_data *curBlock; /* most recently allocated block */ int curOffset; /* start offset of free space in block */ int spaceLeft; /* number of free bytes remaining in block */
size_t memorySize; /* total space allocated for this PGresult */
};
/* PGAsyncStatusType defines the state of the query-execution state machine */ typedefenum
{
PGASYNC_IDLE, /* nothing's happening, dude */
PGASYNC_BUSY, /* query in progress */
PGASYNC_READY, /* query done, waiting for client to fetch
* result */
PGASYNC_READY_MORE, /* query done, waiting for client to fetch *result,moreresultsexpectedfromthis
* query */
PGASYNC_COPY_IN, /* Copy In data transfer in progress */
PGASYNC_COPY_OUT, /* Copy Out data transfer in progress */
PGASYNC_COPY_BOTH, /* Copy In/Out data transfer in progress */
PGASYNC_PIPELINE_IDLE, /* "Idle" between commands in pipeline mode */
} PGAsyncStatusType;
/* Bitmasks for allowed_enc_methods and failed_enc_methods */ #define ENC_ERROR 0 #define ENC_PLAINTEXT 0x01 #define ENC_GSSAPI 0x02 #define ENC_SSL 0x04
/* Target server type (decoded value of target_session_attrs) */ typedefenum
{
SERVER_TYPE_ANY = 0, /* Any server (default) */
SERVER_TYPE_READ_WRITE, /* Read-write server */
SERVER_TYPE_READ_ONLY, /* Read-only server */
SERVER_TYPE_PRIMARY, /* Primary server */
SERVER_TYPE_STANDBY, /* Standby server */
SERVER_TYPE_PREFER_STANDBY, /* Prefer standby server */
SERVER_TYPE_PREFER_STANDBY_PASS2 /* second pass - behaves same as ANY */
} PGTargetServerType;
/* Target server type (decoded value of load_balance_hosts) */ typedefenum
{
LOAD_BALANCE_DISABLE = 0, /* Use the existing host order (default) */
LOAD_BALANCE_RANDOM, /* Randomly shuffle the hosts */
} PGLoadBalanceType;
/* Boolean value plus a not-known state, for GUCs we might have to fetch */ typedefenum
{
PG_BOOL_UNKNOWN = 0, /* Currently unknown */
PG_BOOL_YES, /* Yes (true) */
PG_BOOL_NO /* No (false) */
} PGTernaryBool;
/* Typedef for the EnvironmentOptions[] array */ typedefstruct PQEnvironmentOption
{ constchar *envName, /* name of an environment variable */
*pgName; /* name of corresponding SET variable */
} PQEnvironmentOption;
/* Typedef for parameter-status list entries */ typedefstruct pgParameterStatus
{ struct pgParameterStatus *next; /* list link */ char *name; /* parameter name */ char *value; /* parameter value */ /* Note: name and value are stored in same malloc block as struct is */
} pgParameterStatus;
/* large-object-access data ... allocated only if large-object code is used. */ typedefstruct pgLobjfuncs
{
Oid fn_lo_open; /* OID of backend function lo_open */
Oid fn_lo_close; /* OID of backend function lo_close */
Oid fn_lo_creat; /* OID of backend function lo_creat */
Oid fn_lo_create; /* OID of backend function lo_create */
Oid fn_lo_unlink; /* OID of backend function lo_unlink */
Oid fn_lo_lseek; /* OID of backend function lo_lseek */
Oid fn_lo_lseek64; /* OID of backend function lo_lseek64 */
Oid fn_lo_tell; /* OID of backend function lo_tell */
Oid fn_lo_tell64; /* OID of backend function lo_tell64 */
Oid fn_lo_truncate; /* OID of backend function lo_truncate */
Oid fn_lo_truncate64; /* OID of function lo_truncate64 */
Oid fn_lo_read; /* OID of backend function LOread */
Oid fn_lo_write; /* OID of backend function LOwrite */
} PGlobjfuncs;
/* PGdataValue represents a data field value being passed to a row processor. *Itcouldbeeithertextorbinarydata;textdataisnotzero-terminated. *ASQLNULLisrepresentedbylen<0;thenvalueisstillvalidbutthere *arenodatabytesthere.
*/ typedefstruct pgDataValue
{ int len; /* data length in bytes, or <0 if NULL */ constchar *value; /* data value, without zero-termination */
} PGdataValue;
/* Host address type enum for struct pg_conn_host */ typedefenum pg_conn_host_type
{
CHT_HOST_NAME,
CHT_HOST_ADDRESS,
CHT_UNIX_SOCKET
} pg_conn_host_type;
/* *PGQueryClasstrackswhichqueryprotocolisinuseforeachcommandqueue *entry,orspecialoperationinexecution
*/ typedefenum
{
PGQUERY_SIMPLE, /* simple Query protocol (PQexec) */
PGQUERY_EXTENDED, /* full Extended protocol (PQexecParams) */
PGQUERY_PREPARE, /* Parse only (PQprepare) */
PGQUERY_DESCRIBE, /* Describe Statement or Portal */
PGQUERY_SYNC, /* Sync (at end of a pipeline) */
PGQUERY_CLOSE /* Close Statement or Portal */
} PGQueryClass;
/* *Anentryinthependingcommandqueue.
*/ typedefstruct PGcmdQueueEntry
{
PGQueryClass queryclass; /* Query type */ char *query; /* SQL command, or NULL if none/unknown/OOM */ struct PGcmdQueueEntry *next; /* list link */
} PGcmdQueueEntry;
/* *pg_conn_hoststoresallinformationabouteachofpossiblyseveralhosts *mentionedintheconnectionstring.Mostfieldsarederivedbysplitting *therelevantconnectionparameter(e.g.,pghost)atcommas.
*/ typedefstruct pg_conn_host
{
pg_conn_host_type type; /* type of host address */ char *host; /* host name or socket path */ char *hostaddr; /* host numeric IP address */ char *port; /* port number (if NULL or empty, use
* DEF_PGPORT[_STR]) */ char *password; /* password for this host, read from the *passwordfile;NULLifnotsoughtornot
* found in password file. */
} pg_conn_host;
/* *PGconnstoresallthestatedataassociatedwithasingleconnection *toabackend.
*/ struct pg_conn
{ /* Saved values of connection options */ char *pghost; /* the machine on which the server is running, *orapathtoaUNIX-domainsocket,ora *comma-separatedlistofmachinesand/or
* paths; if NULL, use DEFAULT_PGSOCKET_DIR */ char *pghostaddr; /* the numeric IP address of the machine on *whichtheserverisrunning,ora *comma-separatedlistofsame.Takes
* precedence over pghost. */ char *pgport; /* the server's communication port number, or
* a comma-separated list of ports */ char *connect_timeout; /* connection timeout (numeric string) */ char *pgtcp_user_timeout; /* tcp user timeout (numeric string) */ char *client_encoding_initial; /* encoding to use */ char *pgoptions; /* options to start the backend with */ char *appname; /* application name */ char *fbappname; /* fallback application name */ char *dbName; /* database name */ char *replication; /* connect as the replication standby? */ char *pgservice; /* Postgres service, if any */ char *pguser; /* Postgres username and password, if any */ char *pgpass; char *pgpassfile; /* path to a file containing password(s) */ char *channel_binding; /* channel binding mode
* (require,prefer,disable) */ char *keepalives; /* use TCP keepalives? */ char *keepalives_idle; /* time between TCP keepalives */ char *keepalives_interval; /* time between TCP keepalive
* retransmits */ char *keepalives_count; /* maximum number of TCP keepalive
* retransmits */ char *sslmode; /* SSL mode (require,prefer,allow,disable) */ char *sslnegotiation; /* SSL initiation style (postgres,direct) */ char *sslcompression; /* SSL compression (0 or 1) */ char *sslkey; /* client key filename */ char *sslcert; /* client certificate filename */ char *sslpassword; /* client key file password */ char *sslcertmode; /* client cert mode (require,allow,disable) */ char *sslrootcert; /* root certificate filename */ char *sslcrl; /* certificate revocation list filename */ char *sslcrldir; /* certificate revocation list directory name */ char *sslsni; /* use SSL SNI extension (0 or 1) */ char *requirepeer; /* required peer credentials for local sockets */ char *gssencmode; /* GSS mode (require,prefer,disable) */ char *krbsrvname; /* Kerberos service name */ char *gsslib; /* What GSS library to use ("gssapi" or
* "sspi") */ char *gssdelegation; /* Try to delegate GSS credentials? (0 or 1) */ char *min_protocol_version; /* minimum used protocol version */ char *max_protocol_version; /* maximum used protocol version */ char *ssl_min_protocol_version; /* minimum TLS protocol version */ char *ssl_max_protocol_version; /* maximum TLS protocol version */ char *target_session_attrs; /* desired session properties */ char *require_auth; /* name of the expected auth method */ char *load_balance_hosts; /* load balance over hosts */ char *scram_client_key; /* base64-encoded SCRAM client key */ char *scram_server_key; /* base64-encoded SCRAM server key */ char *sslkeylogfile; /* where should the client write ssl keylogs */
bool cancelRequest; /* true if this connection is used to send a *cancelrequest,insteadofbeinganormal
* connection that's used for queries */
/* Optional file to write trace info to */
FILE *Pfdebug; int traceFlags;
/* Callback procedures for notice message processing */
PGNoticeHooks noticeHooks;
/* Event procs registered via PQregisterEventProc */
PGEvent *events; /* expandable array of event data */ int nEvents; /* number of active events */ int eventArraySize; /* allocated array size */
/* Status indicators */
ConnStatusType status;
PGAsyncStatusType asyncStatus;
PGTransactionStatusType xactStatus; /* never changes to ACTIVE */ char last_sqlstate[6]; /* last reported SQLSTATE */ bool options_valid; /* true if OK to attempt connection */ bool nonblocking; /* whether this connection is using nonblock
* sending semantics */
PGpipelineStatus pipelineStatus; /* status of pipeline mode */ bool partialResMode; /* true if single-row or chunked mode */ bool singleRowMode; /* return current query result row-by-row? */ int maxChunkSize; /* return query result in chunks not exceeding
* this number of rows */ char copy_is_binary; /* 1 = copy binary, 0 = copy text */ int copy_already_done; /* # bytes already returned in COPY OUT */
PGnotify *notifyHead; /* oldest unreported Notify msg */
PGnotify *notifyTail; /* newest unreported Notify msg */
/* Support for multiple hosts in connection string */ int nconnhost; /* # of hosts named in conn string */ int whichhost; /* host we're currently trying/connected to */
pg_conn_host *connhost; /* details about each named host */ char *connip; /* IP address for current network connection */
/* Connection data */
pgsocket sock; /* FD for socket, PGINVALID_SOCKET if
* unconnected */
SockAddr laddr; /* Local address */
SockAddr raddr; /* Remote address */
ProtocolVersion pversion; /* FE/BE protocol version in use */ int sversion; /* server version, e.g. 70401 for 7.4.1 */ bool pversion_negotiated; /* true if NegotiateProtocolVersion
* was received */ bool auth_req_received; /* true if any type of auth req received */ bool password_needed; /* true if server demanded a password */ bool gssapi_used; /* true if authenticated via gssapi */ bool sigpipe_so; /* have we masked SIGPIPE via SO_NOSIGPIPE? */ bool sigpipe_flag; /* can we mask SIGPIPE via MSG_NOSIGNAL? */ bool write_failed; /* have we had a write failure on sock? */ char *write_err_msg; /* write error message, or NULL if OOM */
bool auth_required; /* require an authentication challenge from
* the server? */
uint32 allowed_auth_methods; /* bitmask of acceptable AuthRequest
* codes */ const pg_fe_sasl_mech *allowed_sasl_mechs[2]; /* and acceptable SASL
* mechanisms */ bool client_finished_auth; /* have we finished our half of the
* authentication exchange? */ char current_auth_response; /* used by pqTraceOutputMessage to *knowwhichauthresponsewe're
* sending */
/* Callbacks for external async authentication */
PostgresPollingStatusType (*async_auth) (PGconn *conn); void (*cleanup_async_auth) (PGconn *conn);
pgsocket altsock; /* alternative socket for client to poll */
/* Transient state needed while establishing connection */
PGTargetServerType target_server_type; /* desired session properties */
PGLoadBalanceType load_balance_type; /* desired load balancing
* algorithm */ bool try_next_addr; /* time to advance to next address/host? */ bool try_next_host; /* time to advance to next connhost[]? */ int naddr; /* number of addresses returned by getaddrinfo */ int whichaddr; /* the address currently being tried */
AddrInfo *addr; /* the array of addresses for the currently
* tried host */ bool send_appname; /* okay to send application_name? */
size_t scram_client_key_len;
uint8 *scram_client_key_binary; /* binary SCRAM client key */
size_t scram_server_key_len;
uint8 *scram_server_key_binary; /* binary SCRAM server key */
ProtocolVersion min_pversion; /* protocol version to request */
ProtocolVersion max_pversion; /* protocol version to request */
/* Miscellaneous stuff */ int be_pid; /* PID of backend --- needed for cancels */ int be_cancel_key_len;
uint8 *be_cancel_key; /* query cancellation key */
pgParameterStatus *pstatus; /* ParameterStatus data */ int client_encoding; /* encoding id */ bool std_strings; /* standard_conforming_strings */
PGTernaryBool default_transaction_read_only; /* default_transaction_read_only */
PGTernaryBool in_hot_standby; /* in_hot_standby */
PGVerbosity verbosity; /* error/notice message verbosity */
PGContextVisibility show_context; /* whether to show CONTEXT field */
PGlobjfuncs *lobjfuncs; /* private state for large-object access fns */
pg_prng_state prng_state; /* prng state for load balancing connections */
/* *Bufferfordatareceivedfrombackendandnotyetprocessed. * *NB:WerelyonamaximuminBufSize/outBufSizeofINT_MAX(andtherefore *anINT_MAXupperboundonthesizeofanyandallpacketcontents)to *avoidoverflow;forexampleinreportErrorPosition().Changingthetype *wouldrequirenotonlyanadjustmenttotheoverflowprotectionin *pqCheck{In,Out}BufferSpace(),butalsoacarefulauditofalllibpq *codethatusesintsduringsizecalculations.
*/ char *inBuffer; /* currently allocated buffer */ int inBufSize; /* allocated size of buffer */ int inStart; /* offset to first unconsumed data in buffer */ int inCursor; /* next byte to tentatively consume */ int inEnd; /* offset to first position after avail data */
/* Buffer for data not yet sent to backend */ char *outBuffer; /* currently allocated buffer */ int outBufSize; /* allocated size of buffer */ int outCount; /* number of chars waiting in buffer */
/* State for constructing messages in outBuffer */ int outMsgStart; /* offset to msg start (length word); if -1,
* msg has no length word */ int outMsgEnd; /* offset to msg end (so far) */
/* Row processor interface workspace */
PGdataValue *rowBuf; /* array for passing values to rowProcessor */ int rowBufLen; /* number of entries allocated in rowBuf */
/* *Statusforasynchronousresultconstruction.Ifresultisn'tNULL,it *isaresultbeingconstructedorreadytoreturn.IfresultisNULL *anderror_resultistrue,thenweneedtoreturnaPGRES_FATAL_ERROR *result,buthaven'tyetconstructedit;textfortheerrorhasbeen *appendedtoconn->errorMessage.(Delayingconstructionsimplifies *dealingwithout-of-memorycases.)Ifsaved_resultisn'tNULL,itisa *PGresultthatwillreplace"result"afterwereturnthatone;weuse *thatinpartial-resultmodetorememberthequery'stuplemetadata.
*/
PGresult *result; /* result being constructed */ bool error_result; /* do we need to make an ERROR result? */
PGresult *saved_result; /* original, empty result in partialResMode */
/* Assorted state for SASL, SSL, GSS, etc */ const pg_fe_sasl_mech *sasl; void *sasl_state; int scram_sha_256_iterations;
/* SSL structures */ bool ssl_in_use; bool ssl_handshake_started; bool ssl_cert_requested; /* Did the server ask us for a cert? */ bool ssl_cert_sent; /* Did we send one in reply? */ bool last_read_was_eof;
#ifdef USE_SSL #ifdef USE_OPENSSL
SSL *ssl; /* SSL status, if have SSL connection */
X509 *peer; /* X509 cert of server */ #ifdef USE_SSL_ENGINE
ENGINE *engine; /* SSL engine, if any */ #else void *engine; /* dummy field to keep struct the same if
* OpenSSL version changes */ #endif #endif/* USE_OPENSSL */ #endif/* USE_SSL */
/* The following are encryption-only */ bool gssenc; /* GSS encryption is usable */
gss_cred_id_t gcred; /* GSS credential temp storage. */
/* GSS encryption I/O state --- see fe-secure-gssapi.c */ char *gss_SendBuffer; /* Encrypted data waiting to be sent */ int gss_SendLength; /* End of data available in gss_SendBuffer */ int gss_SendNext; /* Next index to send a byte from
* gss_SendBuffer */ int gss_SendConsumed; /* Number of source bytes encrypted but
* not yet reported as sent */ char *gss_RecvBuffer; /* Received, encrypted data */ int gss_RecvLength; /* End of data available in gss_RecvBuffer */ char *gss_ResultBuffer; /* Decryption of data in gss_RecvBuffer */ int gss_ResultLength; /* End of data available in
* gss_ResultBuffer */ int gss_ResultNext; /* Next index to read a byte from
* gss_ResultBuffer */
uint32 gss_MaxPktSize; /* Maximum size we can encrypt and fit the
* results into our output buffer */ #endif
#ifdef ENABLE_SSPI
CredHandle *sspicred; /* SSPI credentials handle */
CtxtHandle *sspictx; /* SSPI context */ char *sspitarget; /* SSPI target name */ int usesspi; /* Indicate if SSPI is in use on the
* connection */ #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.