Annotation of parser3/src/sql/pgsql/PgSQL32/include/libpq-int.h, revision 1.1
1.1 ! parser 1: /*-------------------------------------------------------------------------
! 2: *
! 3: * libpq-int.h
! 4: * This file contains internal definitions meant to be used only by
! 5: * the frontend libpq library, not by applications that call it.
! 6: *
! 7: * An application can include this file if it wants to bypass the
! 8: * official API defined by libpq-fe.h, but code that does so is much
! 9: * more likely to break across PostgreSQL releases than code that uses
! 10: * only the official API.
! 11: *
! 12: * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
! 13: * Portions Copyright (c) 1994, Regents of the University of California
! 14: *
! 15: * $Id: libpq-int.h,v 1.33 2001/03/22 04:01:27 momjian Exp $
! 16: *
! 17: *-------------------------------------------------------------------------
! 18: */
! 19:
! 20: #ifndef LIBPQ_INT_H
! 21: #define LIBPQ_INT_H
! 22:
! 23: /* We assume libpq-fe.h has already been included. */
! 24: #include "postgres_fe.h"
! 25:
! 26: /* include stuff common to fe and be */
! 27: #include "libpq/pqcomm.h"
! 28: #include "lib/dllist.h"
! 29: /* include stuff found in fe only */
! 30: #include "pqexpbuffer.h"
! 31:
! 32: #ifdef USE_SSL
! 33: #include <openssl/ssl.h>
! 34: #include <openssl/err.h>
! 35: #endif
! 36:
! 37: /* libpq supports this version of the frontend/backend protocol.
! 38: *
! 39: * NB: we used to use PG_PROTOCOL_LATEST from the backend pqcomm.h file,
! 40: * but that's not really the right thing: just recompiling libpq
! 41: * against a more recent backend isn't going to magically update it
! 42: * for most sorts of protocol changes. So, when you change libpq
! 43: * to support a different protocol revision, you have to change this
! 44: * constant too. PG_PROTOCOL_EARLIEST and PG_PROTOCOL_LATEST in
! 45: * pqcomm.h describe what the backend knows, not what libpq knows.
! 46: */
! 47:
! 48: #define PG_PROTOCOL_LIBPQ PG_PROTOCOL(2,0)
! 49:
! 50: /*
! 51: * POSTGRES backend dependent Constants.
! 52: */
! 53:
! 54: #define PQERRORMSG_LENGTH 1024
! 55: #define CMDSTATUS_LEN 40
! 56:
! 57: /*
! 58: * PGresult and the subsidiary types PGresAttDesc, PGresAttValue
! 59: * represent the result of a query (or more precisely, of a single SQL
! 60: * command --- a query string given to PQexec can contain multiple commands).
! 61: * Note we assume that a single command can return at most one tuple group,
! 62: * hence there is no need for multiple descriptor sets.
! 63: */
! 64:
! 65: /* Subsidiary-storage management structure for PGresult.
! 66: * See space management routines in fe-exec.c for details.
! 67: * Note that space[k] refers to the k'th byte starting from the physical
! 68: * head of the block --- it's a union, not a struct!
! 69: */
! 70: typedef union pgresult_data PGresult_data;
! 71:
! 72: union pgresult_data
! 73: {
! 74: PGresult_data *next; /* link to next block, or NULL */
! 75: char space[1]; /* dummy for accessing block as bytes */
! 76: };
! 77:
! 78: /* Data about a single attribute (column) of a query result */
! 79:
! 80: typedef struct pgresAttDesc
! 81: {
! 82: char *name; /* type name */
! 83: Oid typid; /* type id */
! 84: int typlen; /* type size */
! 85: int atttypmod; /* type-specific modifier info */
! 86: } PGresAttDesc;
! 87:
! 88: /* Data for a single attribute of a single tuple */
! 89:
! 90: /* We use char* for Attribute values.
! 91: The value pointer always points to a null-terminated area; we add a
! 92: null (zero) byte after whatever the backend sends us. This is only
! 93: particularly useful for ASCII tuples ... with a binary value, the
! 94: value might have embedded nulls, so the application can't use C string
! 95: operators on it. But we add a null anyway for consistency.
! 96: Note that the value itself does not contain a length word.
! 97:
! 98: A NULL attribute is a special case in two ways: its len field is NULL_LEN
! 99: and its value field points to null_field in the owning PGresult. All the
! 100: NULL attributes in a query result point to the same place (there's no need
! 101: to store a null string separately for each one).
! 102: */
! 103:
! 104: #define NULL_LEN (-1) /* pg_result len for NULL value */
! 105:
! 106: typedef struct pgresAttValue
! 107: {
! 108: int len; /* length in bytes of the value */
! 109: char *value; /* actual value, plus terminating zero
! 110: * byte */
! 111: } PGresAttValue;
! 112:
! 113: struct pg_result
! 114: {
! 115: int ntups;
! 116: int numAttributes;
! 117: PGresAttDesc *attDescs;
! 118: PGresAttValue **tuples; /* each PGresTuple is an array of
! 119: * PGresAttValue's */
! 120: int tupArrSize; /* size of tuples array allocated */
! 121: ExecStatusType resultStatus;
! 122: char cmdStatus[CMDSTATUS_LEN]; /* cmd status from the
! 123: * last query */
! 124: int binary; /* binary tuple values if binary == 1,
! 125: * otherwise ASCII */
! 126:
! 127: /*
! 128: * The conn link in PGresult is no longer used by any libpq code. It
! 129: * should be removed entirely, because it could be a dangling link
! 130: * (the application could keep the PGresult around longer than it
! 131: * keeps the PGconn!) But there may be apps out there that depend on
! 132: * it, so we will leave it here at least for a release or so.
! 133: */
! 134: PGconn *xconn; /* connection we did the query on, if any */
! 135:
! 136: /*
! 137: * These fields are copied from the originating PGconn, so that
! 138: * operations on the PGresult don't have to reference the PGconn.
! 139: */
! 140: PQnoticeProcessor noticeHook; /* notice/error message processor */
! 141: void *noticeArg;
! 142: int client_encoding;/* encoding id */
! 143:
! 144:
! 145: char *errMsg; /* error message, or NULL if no error */
! 146:
! 147: /* All NULL attributes in the query result point to this null string */
! 148: char null_field[1];
! 149:
! 150: /*
! 151: * Space management information. Note that attDescs and errMsg, if
! 152: * not null, point into allocated blocks. But tuples points to a
! 153: * separately malloc'd block, so that we can realloc it.
! 154: */
! 155: PGresult_data *curBlock; /* most recently allocated block */
! 156: int curOffset; /* start offset of free space in block */
! 157: int spaceLeft; /* number of free bytes remaining in block */
! 158: };
! 159:
! 160: /* PGAsyncStatusType defines the state of the query-execution state machine */
! 161: typedef enum
! 162: {
! 163: PGASYNC_IDLE, /* nothing's happening, dude */
! 164: PGASYNC_BUSY, /* query in progress */
! 165: PGASYNC_READY, /* result ready for PQgetResult */
! 166: PGASYNC_COPY_IN, /* Copy In data transfer in progress */
! 167: PGASYNC_COPY_OUT /* Copy Out data transfer in progress */
! 168: } PGAsyncStatusType;
! 169:
! 170: /* PGSetenvStatusType defines the state of the PQSetenv state machine */
! 171: typedef enum
! 172: {
! 173: SETENV_STATE_OPTION_SEND, /* About to send an Environment Option */
! 174: SETENV_STATE_OPTION_WAIT, /* Waiting for above send to complete */
! 175: /* these next two are only used in MULTIBYTE mode */
! 176: SETENV_STATE_ENCODINGS_SEND,/* About to send an "encodings" query */
! 177: SETENV_STATE_ENCODINGS_WAIT,/* Waiting for query to complete */
! 178: SETENV_STATE_IDLE
! 179: } PGSetenvStatusType;
! 180:
! 181: /* large-object-access data ... allocated only if large-object code is used. */
! 182: typedef struct pgLobjfuncs
! 183: {
! 184: Oid fn_lo_open; /* OID of backend function lo_open */
! 185: Oid fn_lo_close; /* OID of backend function lo_close */
! 186: Oid fn_lo_creat; /* OID of backend function lo_creat */
! 187: Oid fn_lo_unlink; /* OID of backend function lo_unlink */
! 188: Oid fn_lo_lseek; /* OID of backend function lo_lseek */
! 189: Oid fn_lo_tell; /* OID of backend function lo_tell */
! 190: Oid fn_lo_read; /* OID of backend function LOread */
! 191: Oid fn_lo_write; /* OID of backend function LOwrite */
! 192: } PGlobjfuncs;
! 193:
! 194: /* PGconn stores all the state data associated with a single connection
! 195: * to a backend.
! 196: */
! 197: struct pg_conn
! 198: {
! 199: /* Saved values of connection options */
! 200: char *pghost; /* the machine on which the server is
! 201: * running */
! 202: char *pghostaddr; /* the IPv4 address of the machine on
! 203: * which the server is running, in IPv4
! 204: * numbers-and-dots notation. Takes
! 205: * precedence over above. */
! 206: char *pgport; /* the server's communication port */
! 207: char *pgunixsocket; /* the Unix-domain socket that the server
! 208: * is listening on; if NULL, uses a
! 209: * default constructed from pgport */
! 210: char *pgtty; /* tty on which the backend messages is
! 211: * displayed (NOT ACTUALLY USED???) */
! 212: char *pgoptions; /* options to start the backend with */
! 213: char *dbName; /* database name */
! 214: char *pguser; /* Postgres username and password, if any */
! 215: char *pgpass;
! 216:
! 217: /* Optional file to write trace info to */
! 218: FILE *Pfdebug;
! 219:
! 220: /* Callback procedure for notice/error message processing */
! 221: PQnoticeProcessor noticeHook;
! 222: void *noticeArg;
! 223:
! 224: /* Status indicators */
! 225: ConnStatusType status;
! 226: PGAsyncStatusType asyncStatus;
! 227: Dllist *notifyList; /* Notify msgs not yet handed to
! 228: * application */
! 229:
! 230: /* Connection data */
! 231: int sock; /* Unix FD for socket, -1 if not connected */
! 232: SockAddr laddr; /* Local address */
! 233: SockAddr raddr; /* Remote address */
! 234: int raddr_len; /* Length of remote address */
! 235:
! 236: /* Miscellaneous stuff */
! 237: int be_pid; /* PID of backend --- needed for cancels */
! 238: int be_key; /* key of backend --- needed for cancels */
! 239: char salt[2]; /* password salt received from backend */
! 240: PGlobjfuncs *lobjfuncs; /* private state for large-object access
! 241: * fns */
! 242:
! 243: /* Buffer for data received from backend and not yet processed */
! 244: char *inBuffer; /* currently allocated buffer */
! 245: int inBufSize; /* allocated size of buffer */
! 246: int inStart; /* offset to first unconsumed data in
! 247: * buffer */
! 248: int inCursor; /* next byte to tentatively consume */
! 249: int inEnd; /* offset to first position after avail
! 250: * data */
! 251:
! 252: int nonblocking; /* whether this connection is using a
! 253: * blocking socket to the backend or not */
! 254:
! 255: /* Buffer for data not yet sent to backend */
! 256: char *outBuffer; /* currently allocated buffer */
! 257: int outBufSize; /* allocated size of buffer */
! 258: int outCount; /* number of chars waiting in buffer */
! 259:
! 260: /* Status for asynchronous result construction */
! 261: PGresult *result; /* result being constructed */
! 262: PGresAttValue *curTuple; /* tuple currently being read */
! 263:
! 264: /* Status for sending environment info. Used during PQSetenv only. */
! 265: PGSetenvStatusType setenv_state;
! 266: const struct EnvironmentOptions *next_eo;
! 267:
! 268: #ifdef USE_SSL
! 269: bool allow_ssl_try; /* Allowed to try SSL negotiation */
! 270: bool require_ssl; /* Require SSL to make connection */
! 271: SSL *ssl; /* SSL status, if have SSL connection */
! 272: #endif
! 273:
! 274: /* Buffer for current error message */
! 275: PQExpBufferData errorMessage; /* expansible string */
! 276:
! 277: /* Buffer for receiving various parts of messages */
! 278: PQExpBufferData workBuffer; /* expansible string */
! 279:
! 280: int client_encoding;/* encoding id */
! 281: };
! 282:
! 283: /* String descriptions of the ExecStatusTypes.
! 284: * direct use of this array is deprecated; call PQresStatus() instead.
! 285: */
! 286: extern char *const pgresStatus[];
! 287:
! 288: /* ----------------
! 289: * Internal functions of libpq
! 290: * Functions declared here need to be visible across files of libpq,
! 291: * but are not intended to be called by applications. We use the
! 292: * convention "pqXXX" for internal functions, vs. the "PQxxx" names
! 293: * used for application-visible routines.
! 294: * ----------------
! 295: */
! 296:
! 297: /* === in fe-connect.c === */
! 298:
! 299: extern int pqPacketSend(PGconn *conn, const char *buf, size_t len);
! 300:
! 301: /* === in fe-exec.c === */
! 302:
! 303: extern void pqSetResultError(PGresult *res, const char *msg);
! 304: extern void *pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary);
! 305: extern char *pqResultStrdup(PGresult *res, const char *str);
! 306: extern void pqClearAsyncResult(PGconn *conn);
! 307:
! 308: /* === in fe-misc.c === */
! 309:
! 310: /*
! 311: * "Get" and "Put" routines return 0 if successful, EOF if not. Note that
! 312: * for Get, EOF merely means the buffer is exhausted, not that there is
! 313: * necessarily any error.
! 314: */
! 315: extern int pqGetc(char *result, PGconn *conn);
! 316: extern int pqGets(PQExpBuffer buf, PGconn *conn);
! 317: extern int pqPuts(const char *s, PGconn *conn);
! 318: extern int pqGetnchar(char *s, size_t len, PGconn *conn);
! 319: extern int pqPutnchar(const char *s, size_t len, PGconn *conn);
! 320: extern int pqGetInt(int *result, size_t bytes, PGconn *conn);
! 321: extern int pqPutInt(int value, size_t bytes, PGconn *conn);
! 322: extern int pqReadData(PGconn *conn);
! 323: extern int pqFlush(PGconn *conn);
! 324: extern int pqWait(int forRead, int forWrite, PGconn *conn);
! 325: extern int pqReadReady(PGconn *conn);
! 326: extern int pqWriteReady(PGconn *conn);
! 327:
! 328: /* bits in a byte */
! 329: #define BYTELEN 8
! 330:
! 331: /* fall back options if they are not specified by arguments or defined
! 332: by environment variables */
! 333: #define DefaultHost "localhost"
! 334: #define DefaultTty ""
! 335: #define DefaultOption ""
! 336: #define DefaultAuthtype ""
! 337: #define DefaultPassword ""
! 338:
! 339: /*
! 340: * this is so that we can check is a connection is non-blocking internally
! 341: * without the overhead of a function call
! 342: */
! 343: #define pqIsnonblocking(conn) ((conn)->nonblocking)
! 344:
! 345: #endif /* LIBPQ_INT_H */
E-mail: