libpq-int.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  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.  * Copyright (c) 1994, Regents of the University of California
  13.  *
  14.  * $Id: libpq-int.h,v 1.9 1999/05/25 22:43:49 momjian Exp $
  15.  *
  16.  *-------------------------------------------------------------------------
  17.  */
  18. #ifndef LIBPQ_INT_H
  19. #define LIBPQ_INT_H
  20. /* We assume libpq-fe.h has already been included. */
  21. /* ----------------
  22.  * include stuff common to fe and be
  23.  * ----------------
  24.  */
  25. #include "libpq/pqcomm.h"
  26. #include "lib/dllist.h"
  27. /* libpq supports this version of the frontend/backend protocol.
  28.  *
  29.  * NB: we used to use PG_PROTOCOL_LATEST from the backend pqcomm.h file,
  30.  * but that's not really the right thing: just recompiling libpq
  31.  * against a more recent backend isn't going to magically update it
  32.  * for most sorts of protocol changes. So, when you change libpq
  33.  * to support a different protocol revision, you have to change this
  34.  * constant too.  PG_PROTOCOL_EARLIEST and PG_PROTOCOL_LATEST in
  35.  * pqcomm.h describe what the backend knows, not what libpq knows.
  36.  */
  37. #define PG_PROTOCOL_LIBPQ PG_PROTOCOL(2,0)
  38. /*
  39.  * POSTGRES backend dependent Constants.
  40.  */
  41. /* ERROR_MSG_LENGTH should really be the same as ELOG_MAXLEN in utils/elog.h*/
  42. #define ERROR_MSG_LENGTH 4096
  43. #define CMDSTATUS_LEN 40
  44. /*
  45.  * PGresult and the subsidiary types PGresAttDesc, PGresAttValue
  46.  * represent the result of a query (or more precisely, of a single SQL
  47.  * command --- a query string given to PQexec can contain multiple commands).
  48.  * Note we assume that a single command can return at most one tuple group,
  49.  * hence there is no need for multiple descriptor sets.
  50.  */
  51. /* Subsidiary-storage management structure for PGresult.
  52.  * See space management routines in fe-exec.c for details.
  53.  * Note that space[k] refers to the k'th byte starting from the physical
  54.  * head of the block.
  55.  */
  56. typedef union pgresult_data PGresult_data;
  57. union pgresult_data
  58. {
  59. PGresult_data *next; /* link to next block, or NULL */
  60. char space[1]; /* dummy for accessing block as bytes */
  61. };
  62. /* Data about a single attribute (column) of a query result */
  63. typedef struct pgresAttDesc
  64. {
  65. char    *name; /* type name */
  66. Oid typid; /* type id */
  67. int typlen; /* type size */
  68. int atttypmod; /* type-specific modifier info */
  69. } PGresAttDesc;
  70. /* Data for a single attribute of a single tuple */
  71. /* We use char* for Attribute values.
  72.    The value pointer always points to a null-terminated area; we add a
  73.    null (zero) byte after whatever the backend sends us.  This is only
  74.    particularly useful for ASCII tuples ... with a binary value, the
  75.    value might have embedded nulls, so the application can't use C string
  76.    operators on it.  But we add a null anyway for consistency.
  77.    Note that the value itself does not contain a length word.
  78.    A NULL attribute is a special case in two ways: its len field is NULL_LEN
  79.    and its value field points to null_field in the owning PGresult.  All the
  80.    NULL attributes in a query result point to the same place (there's no need
  81.    to store a null string separately for each one).
  82.  */
  83. #define NULL_LEN (-1) /* pg_result len for NULL value */
  84. typedef struct pgresAttValue
  85. {
  86. int len; /* length in bytes of the value */
  87. char    *value; /* actual value, plus terminating zero
  88.  * byte */
  89. } PGresAttValue;
  90. struct pg_result
  91. {
  92. int ntups;
  93. int numAttributes;
  94. PGresAttDesc *attDescs;
  95. PGresAttValue **tuples; /* each PGresTuple is an array of
  96.  * PGresAttValue's */
  97. int tupArrSize; /* size of tuples array allocated */
  98. ExecStatusType resultStatus;
  99. char cmdStatus[CMDSTATUS_LEN]; /* cmd status from the
  100.  * last insert query */
  101. int binary; /* binary tuple values if binary == 1,
  102.  * otherwise ASCII */
  103. PGconn    *conn; /* connection we did the query on, if any */
  104. char    *errMsg; /* error message, or NULL if no error */
  105. /* All NULL attributes in the query result point to this null string */
  106. char null_field[1];
  107. /*
  108.  * Space management information.  Note that attDescs and errMsg, if
  109.  * not null, point into allocated blocks.  But tuples points to a
  110.  * separately malloc'd block, so that we can realloc it.
  111.  */
  112. PGresult_data *curBlock; /* most recently allocated block */
  113. int curOffset; /* start offset of free space in block */
  114. int spaceLeft; /* number of free bytes remaining in block */
  115. };
  116. /* PGAsyncStatusType defines the state of the query-execution state machine */
  117. typedef enum
  118. {
  119. PGASYNC_IDLE, /* nothing's happening, dude */
  120. PGASYNC_BUSY, /* query in progress */
  121. PGASYNC_READY, /* result ready for PQgetResult */
  122. PGASYNC_COPY_IN, /* Copy In data transfer in progress */
  123. PGASYNC_COPY_OUT /* Copy Out data transfer in progress */
  124. } PGAsyncStatusType;
  125. /* large-object-access data ... allocated only if large-object code is used. */
  126. typedef struct pgLobjfuncs
  127. {
  128. Oid fn_lo_open; /* OID of backend function lo_open */
  129. Oid fn_lo_close; /* OID of backend function lo_close */
  130. Oid fn_lo_creat; /* OID of backend function lo_creat */
  131. Oid fn_lo_unlink; /* OID of backend function lo_unlink */
  132. Oid fn_lo_lseek; /* OID of backend function lo_lseek */
  133. Oid fn_lo_tell; /* OID of backend function lo_tell */
  134. Oid fn_lo_read; /* OID of backend function LOread */
  135. Oid fn_lo_write; /* OID of backend function LOwrite */
  136. } PGlobjfuncs;
  137. /* PGconn stores all the state data associated with a single connection
  138.  * to a backend.
  139.  */
  140. struct pg_conn
  141. {
  142. /* Saved values of connection options */
  143. char    *pghost; /* the machine on which the server is
  144.  * running */
  145. char    *pgport; /* the server's communication port */
  146. char    *pgtty; /* tty on which the backend messages is
  147.  * displayed (NOT ACTUALLY USED???) */
  148. char    *pgoptions; /* options to start the backend with */
  149. char    *dbName; /* database name */
  150. char    *pguser; /* Postgres username and password, if any */
  151. char    *pgpass;
  152. /* Optional file to write trace info to */
  153. FILE    *Pfdebug;
  154. /* Callback procedure for notice/error message processing */
  155. PQnoticeProcessor noticeHook;
  156. void    *noticeArg;
  157. /* Status indicators */
  158. ConnStatusType status;
  159. PGAsyncStatusType asyncStatus;
  160. Dllist    *notifyList; /* Notify msgs not yet handed to
  161.  * application */
  162. /* Connection data */
  163. int sock; /* Unix FD for socket, -1 if not connected */
  164. SockAddr laddr; /* Local address */
  165. SockAddr raddr; /* Remote address */
  166. int raddr_len; /* Length of remote address */
  167. /* Miscellaneous stuff */
  168. int be_pid; /* PID of backend --- needed for cancels */
  169. int be_key; /* key of backend --- needed for cancels */
  170. char salt[2]; /* password salt received from backend */
  171. PGlobjfuncs *lobjfuncs; /* private state for large-object access
  172.  * fns */
  173. /* Buffer for data received from backend and not yet processed */
  174. char    *inBuffer; /* currently allocated buffer */
  175. int inBufSize; /* allocated size of buffer */
  176. int inStart; /* offset to first unconsumed data in
  177.  * buffer */
  178. int inCursor; /* next byte to tentatively consume */
  179. int inEnd; /* offset to first position after avail
  180.  * data */
  181. /* Buffer for data not yet sent to backend */
  182. char    *outBuffer; /* currently allocated buffer */
  183. int outBufSize; /* allocated size of buffer */
  184. int outCount; /* number of chars waiting in buffer */
  185. /* Status for asynchronous result construction */
  186. PGresult   *result; /* result being constructed */
  187. PGresAttValue *curTuple; /* tuple currently being read */
  188. /* Message space.  Placed last for code-size reasons. */
  189. char errorMessage[ERROR_MSG_LENGTH];
  190. };
  191. /* ----------------
  192.  * Internal functions of libpq
  193.  * Functions declared here need to be visible across files of libpq,
  194.  * but are not intended to be called by applications.  We use the
  195.  * convention "pqXXX" for internal functions, vs. the "PQxxx" names
  196.  * used for application-visible routines.
  197.  * ----------------
  198.  */
  199. /* === in fe-connect.c === */
  200. extern int pqPacketSend(PGconn *conn, const char *buf, size_t len);
  201. /* === in fe-exec.c === */
  202. extern void pqSetResultError(PGresult *res, const char *msg);
  203. extern void *pqResultAlloc(PGresult *res, int nBytes, int isBinary);
  204. extern char *pqResultStrdup(PGresult *res, const char *str);
  205. extern void pqClearAsyncResult(PGconn *conn);
  206. /* === in fe-misc.c === */
  207.  /*
  208.   * "Get" and "Put" routines return 0 if successful, EOF if not. Note that
  209.   * for Get, EOF merely means the buffer is exhausted, not that there is
  210.   * necessarily any error.
  211.   */
  212. extern int pqGetc(char *result, PGconn *conn);
  213. extern int pqGets(char *s, int maxlen, PGconn *conn);
  214. extern int pqPuts(const char *s, PGconn *conn);
  215. extern int pqGetnchar(char *s, int len, PGconn *conn);
  216. extern int pqPutnchar(const char *s, int len, PGconn *conn);
  217. extern int pqGetInt(int *result, int bytes, PGconn *conn);
  218. extern int pqPutInt(int value, int bytes, PGconn *conn);
  219. extern int pqReadData(PGconn *conn);
  220. extern int pqFlush(PGconn *conn);
  221. extern int pqWait(int forRead, int forWrite, PGconn *conn);
  222. /* max length of message to send  */
  223. #define MAX_MESSAGE_LEN MAX_QUERY_SIZE
  224. /* maximum number of fields in a tuple */
  225. #define MAX_FIELDS 512
  226. /* bits in a byte */
  227. #define BYTELEN 8
  228. /* fall back options if they are not specified by arguments or defined
  229.    by environment variables */
  230. #define DefaultHost "localhost"
  231. #define DefaultTty ""
  232. #define DefaultOption ""
  233. #define DefaultAuthtype   ""
  234. #define DefaultPassword   ""
  235. /* supply an implementation of strerror() macro if system doesn't have it */
  236. #ifndef strerror
  237. #if defined(sun) && defined(sparc) && !defined(__SVR4)
  238. extern char *sys_errlist[];
  239. #define strerror(A) (sys_errlist[(A)])
  240. #endif  /* sunos4 */
  241. #endif  /* !strerror */
  242. #endif  /* LIBPQ_INT_H */