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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * libpq.h
  4.  *   POSTGRES LIBPQ buffer structure definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: libpq.h,v 1.31.2.1 1999/07/30 19:36:33 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef LIBPQ_H
  14. #define LIBPQ_H
  15. #include <sys/types.h>
  16. #include <netinet/in.h>
  17. #include "libpq/libpq-be.h"
  18. #include "tcop/dest.h"
  19. #include "utils/exc.h"
  20. /* ----------------
  21.  * PQArgBlock
  22.  * Information (pointer to array of this structure) required
  23.  * for the PQfn() call.
  24.  * ----------------
  25.  */
  26. typedef struct
  27. {
  28. int len;
  29. int isint;
  30. union
  31. {
  32. int    *ptr; /* can't use void (dec compiler barfs)  */
  33. int integer;
  34. } u;
  35. } PQArgBlock;
  36. /* ----------------
  37.  * TypeBlock
  38.  * Information about an attribute.
  39.  * ----------------
  40.  */
  41. #define NameLength NAMEDATALEN
  42. typedef struct TypeBlock
  43. {
  44. char name[NAMEDATALEN]; /* name of the attribute */
  45. int typid; /* typid of the type */
  46. int typlen; /* typlen of the type */
  47. } TypeBlock;
  48. /* ----------------
  49.  * TupleBlock
  50.  * Data of a tuple.
  51.  * ----------------
  52.  */
  53. #define TupleBlockSize 100
  54. typedef struct TupleBlock
  55. {
  56. char   **values[TupleBlockSize]; /* an array of tuples */
  57. int    *lengths[TupleBlockSize]; /* an array of length vec.
  58.  * foreach tuple */
  59. struct TupleBlock *next; /* next tuple block */
  60. int tuple_index; /* current tuple index */
  61. } TupleBlock;
  62. /* ----------------
  63.  * GroupBuffer
  64.  * A group of tuples with the same attributes.
  65.  * ----------------
  66.  */
  67. typedef struct GroupBuffer
  68. {
  69. int no_tuples; /* number of tuples in this group */
  70. int no_fields; /* number of attributes */
  71. TypeBlock  *types; /* types of the attributes */
  72. TupleBlock *tuples; /* tuples in this group */
  73. struct GroupBuffer *next; /* next group */
  74. } GroupBuffer;
  75. /* ----------------
  76.  * PortalBuffer
  77.  * Data structure of a portal buffer.
  78.  * ----------------
  79.  */
  80. typedef struct PortalBuffer
  81. {
  82. int rule_p; /* 1 if this is an asynchronized portal. */
  83. int no_tuples; /* number of tuples in this portal buffer */
  84. int no_groups; /* number of tuple groups */
  85. GroupBuffer *groups; /* linked list of tuple groups */
  86. } PortalBuffer;
  87. /* ----------------
  88.  * PortalEntry
  89.  * an entry in the global portal table
  90.  *
  91.  * Note: the portalcxt is only meaningful for PQcalls made from
  92.  *  within a postgres backend.  frontend apps should ignore it.
  93.  * ----------------
  94.  */
  95. #define PortalNameLength 32
  96. typedef struct PortalEntry
  97. {
  98. char name[PortalNameLength]; /* name of this portal */
  99. PortalBuffer *portal; /* tuples contained in this portal */
  100. Pointer portalcxt; /* memory context (for backend) */
  101. Pointer result; /* result for PQexec */
  102. } PortalEntry;
  103. #define PORTALS_INITIAL_SIZE 32
  104. #define PORTALS_GROW_BY  32
  105. /* in portalbuf.c */
  106. extern PortalEntry **portals;
  107. extern size_t portals_array_size;
  108. /*
  109.  * Exceptions.
  110.  */
  111. #define libpq_raise(X, Y) ExcRaise((Exception *)(X), (ExcDetail) (Y),
  112.    (ExcData)0, (ExcMessage) 0)
  113. /* in portal.c */
  114. extern Exception MemoryError,
  115. PortalError,
  116. PostquelError,
  117. ProtocolError;
  118. /*
  119.  * POSTGRES backend dependent Constants.
  120.  */
  121. /* ERROR_MSG_LENGTH should really be the same as ELOG_MAXLEN in utils/elog.h*/
  122. #define ERROR_MSG_LENGTH 4096
  123. #define COMMAND_LENGTH 20
  124. #define REMARK_LENGTH 80
  125. extern char PQerrormsg[ERROR_MSG_LENGTH]; /* in portal.c */
  126. /*
  127.  * External functions.
  128.  */
  129. /*
  130.  * prototypes for functions in portal.c
  131.  */
  132. extern void pqdebug(char *target, char *msg);
  133. extern void pqdebug2(char *target, char *msg1, char *msg2);
  134. extern void PQtrace(void);
  135. extern void PQuntrace(void);
  136. extern int PQnportals(int rule_p);
  137. extern void PQpnames(char **pnames, int rule_p);
  138. extern PortalBuffer *PQparray(char *pname);
  139. extern int PQrulep(PortalBuffer *portal);
  140. extern int PQntuples(PortalBuffer *portal);
  141. extern int PQninstances(PortalBuffer *portal);
  142. extern int PQngroups(PortalBuffer *portal);
  143. extern int PQntuplesGroup(PortalBuffer *portal, int group_index);
  144. extern int PQninstancesGroup(PortalBuffer *portal, int group_index);
  145. extern int PQnfieldsGroup(PortalBuffer *portal, int group_index);
  146. extern int PQfnumberGroup(PortalBuffer *portal, int group_index, char *field_name);
  147. extern char *PQfnameGroup(PortalBuffer *portal, int group_index, int field_number);
  148. extern int PQftypeGroup(PortalBuffer *portal, int group_index,
  149.  int field_number);
  150. extern int PQfsizeGroup(PortalBuffer *portal, int group_index,
  151.  int field_number);
  152. extern GroupBuffer *PQgroup(PortalBuffer *portal, int tuple_index);
  153. extern int PQgetgroup(PortalBuffer *portal, int tuple_index);
  154. extern int PQnfields(PortalBuffer *portal, int tuple_index);
  155. extern int PQfnumber(PortalBuffer *portal, int tuple_index, char *field_name);
  156. extern char *PQfname(PortalBuffer *portal, int tuple_index, int field_number);
  157. extern int PQftype(PortalBuffer *portal, int tuple_index, int field_number);
  158. extern int PQfsize(PortalBuffer *portal, int tuple_index, int field_number);
  159. extern int PQsametype(PortalBuffer *portal, int tuple_index1, int tuple_index2);
  160. extern char *PQgetvalue(PortalBuffer *portal, int tuple_index, int field_number);
  161. extern char *PQgetAttr(PortalBuffer *portal, int tuple_index, int field_number);
  162. extern int PQgetlength(PortalBuffer *portal, int tuple_index, int field_number);
  163. extern void PQclear(char *pname);
  164. /*
  165.  * prototypes for functions in portalbuf.c
  166.  */
  167. extern caddr_t pbuf_alloc(size_t size);
  168. extern void pbuf_free(caddr_t pointer);
  169. extern PortalBuffer *pbuf_addPortal(void);
  170. extern GroupBuffer *pbuf_addGroup(PortalBuffer *portal);
  171. extern TypeBlock *pbuf_addTypes(int n);
  172. extern TupleBlock *pbuf_addTuples(void);
  173. extern char **pbuf_addTuple(int n);
  174. extern int *pbuf_addTupleValueLengths(int n);
  175. extern char *pbuf_addValues(int n);
  176. extern PortalEntry *pbuf_addEntry(void);
  177. extern void pbuf_freeEntry(int i);
  178. extern void pbuf_freeTypes(TypeBlock *types);
  179. extern void pbuf_freeTuples(TupleBlock *tuples, int no_tuples, int no_fields);
  180. extern void pbuf_freeGroup(GroupBuffer *group);
  181. extern void pbuf_freePortal(PortalBuffer *portal);
  182. extern int pbuf_getIndex(char *pname);
  183. extern void pbuf_setportalinfo(PortalEntry *entry, char *pname);
  184. extern PortalEntry *pbuf_setup(char *pname);
  185. extern void pbuf_close(char *pname);
  186. extern GroupBuffer *pbuf_findGroup(PortalBuffer *portal, int group_index);
  187. extern int pbuf_findFnumber(GroupBuffer *group, char *field_name);
  188. extern void pbuf_checkFnumber(GroupBuffer *group, int field_number);
  189. extern char *pbuf_findFname(GroupBuffer *group, int field_number);
  190. /* in be-dumpdata.c */
  191. extern void be_portalinit(void);
  192. extern void be_portalpush(PortalEntry *entry);
  193. extern PortalEntry *be_portalpop(void);
  194. extern PortalEntry *be_currentportal(void);
  195. extern PortalEntry *be_newportal(void);
  196. extern void be_typeinit(PortalEntry *entry, TupleDesc attrs,
  197. int natts);
  198. extern void be_printtup(HeapTuple tuple, TupleDesc typeinfo,
  199. DestReceiver *self);
  200. /* in be-pqexec.c */
  201. extern char *PQfn(int fnid, int *result_buf, int result_len, int result_is_int,
  202.  PQArgBlock *args, int nargs);
  203. extern char *PQexec(char *query);
  204. extern int pqtest_PQexec(char *q);
  205. extern int pqtest_PQfn(char *q);
  206. extern int32 pqtest(struct varlena * vlena);
  207. /*
  208.  * prototypes for functions in pqcomm.c
  209.  */
  210. extern int StreamServerPort(char *hostName, unsigned short portName, int *fdP);
  211. extern int StreamConnection(int server_fd, Port *port);
  212. extern void StreamClose(int sock);
  213. extern void pq_init(void);
  214. extern int pq_getport(void);
  215. extern void pq_close(void);
  216. extern int pq_getbytes(char *s, size_t len);
  217. extern int pq_getstring(char *s, size_t len);
  218. extern int pq_peekbyte(void);
  219. extern int pq_putbytes(const char *s, size_t len);
  220. extern int pq_flush(void);
  221. extern int pq_putmessage(char msgtype, const char *s, size_t len);
  222. extern void pq_startcopyout(void);
  223. extern void pq_endcopyout(bool errorAbort);
  224. #endif  /* LIBPQ_H */