libpq.h 7.7 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * libpq.h
4
 *	  POSTGRES LIBPQ buffer structure definitions.
5 6 7 8
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
9
 * $Id: libpq.h,v 1.28 1999/04/25 03:19:13 tgl Exp $
10 11 12 13 14 15
 *
 *-------------------------------------------------------------------------
 */
#ifndef LIBPQ_H
#define LIBPQ_H

16 17
#include <sys/types.h>

18 19 20
#include <netinet/in.h>

#include "libpq/libpq-be.h"
21
#include "tcop/dest.h"
22

23

24
/* ----------------
25
 * PQArgBlock 
26 27
 *		Information (pointer to array of this structure) required
 *		for the PQfn() call.
28 29
 * ----------------
 */
30 31
typedef struct
{
32 33
	int			len;
	int			isint;
34 35
	union
	{
36 37 38
		int		   *ptr;		/* can't use void (dec compiler barfs)	 */
		int			integer;
	}			u;
39
} PQArgBlock;
40 41

/* ----------------
42
 * TypeBlock 
43
 *		Information about an attribute.
44 45
 * ----------------
 */
46
#define NameLength NAMEDATALEN
47

48 49
typedef struct TypeBlock
{
50
	char		name[NAMEDATALEN];		/* name of the attribute */
51
	int			typid;			/* typid of the type */
52
	int			typlen;			/* typlen of the type */
53
} TypeBlock;
54 55

/* ----------------
56
 * TupleBlock 
57
 *		Data of a tuple.
58 59 60 61
 * ----------------
 */
#define TupleBlockSize 100

62 63
typedef struct TupleBlock
{
64 65
	char	  **values[TupleBlockSize]; /* an array of tuples */
	int		   *lengths[TupleBlockSize];		/* an array of length vec.
66 67
												 * foreach tuple */
	struct TupleBlock *next;	/* next tuple block */
68
	int			tuple_index;	/* current tuple index */
69
} TupleBlock;
70 71

/* ----------------
72
 * GroupBuffer 
73
 *		A group of tuples with the same attributes.
74 75
 * ----------------
 */
76 77
typedef struct GroupBuffer
{
78 79 80 81
	int			no_tuples;		/* number of tuples in this group */
	int			no_fields;		/* number of attributes */
	TypeBlock  *types;			/* types of the attributes */
	TupleBlock *tuples;			/* tuples in this group */
82
	struct GroupBuffer *next;	/* next group */
83
} GroupBuffer;
84 85

/* ----------------
86
 * PortalBuffer 
87
 *		Data structure of a portal buffer.
88 89
 * ----------------
 */
90 91
typedef struct PortalBuffer
{
92 93 94 95
	int			rule_p;			/* 1 if this is an asynchronized portal. */
	int			no_tuples;		/* number of tuples in this portal buffer */
	int			no_groups;		/* number of tuple groups */
	GroupBuffer *groups;		/* linked list of tuple groups */
96
} PortalBuffer;
97 98

/* ----------------
99
 * PortalEntry 
100
 *		an entry in the global portal table
101 102
 *
 * Note: the portalcxt is only meaningful for PQcalls made from
103
 *		 within a postgres backend.  frontend apps should ignore it.
104 105 106 107
 * ----------------
 */
#define PortalNameLength 32

108 109
typedef struct PortalEntry
{
110 111 112 113
	char		name[PortalNameLength]; /* name of this portal */
	PortalBuffer *portal;		/* tuples contained in this portal */
	Pointer		portalcxt;		/* memory context (for backend) */
	Pointer		result;			/* result for PQexec */
114
} PortalEntry;
115 116

#define PORTALS_INITIAL_SIZE 32
117
#define PORTALS_GROW_BY		 32
118 119

/* in portalbuf.c */
120
extern PortalEntry **portals;
121
extern size_t portals_array_size;
122 123 124 125 126 127

/*
 * Exceptions.
 */

#define libpq_raise(X, Y) ExcRaise((Exception *)(X), (ExcDetail) (Y),\
128
								   (ExcData)0, (ExcMessage) 0)
129 130

/* in portal.c */
131
extern Exception MemoryError,
132 133 134
			PortalError,
			PostquelError,
			ProtocolError;
135

136 137
/*
 * POSTGRES backend dependent Constants.
138 139 140 141 142 143 144
 */

/* ERROR_MSG_LENGTH should really be the same as ELOG_MAXLEN in utils/elog.h*/
#define ERROR_MSG_LENGTH 4096
#define COMMAND_LENGTH 20
#define REMARK_LENGTH 80

145
extern char PQerrormsg[ERROR_MSG_LENGTH];		/* in portal.c */
146 147 148 149 150

/*
 * External functions.
 */

151 152
/*
 * prototypes for functions in portal.c
153
 */
154 155 156 157 158 159
extern void pqdebug(char *target, char *msg);
extern void pqdebug2(char *target, char *msg1, char *msg2);
extern void PQtrace(void);
extern void PQuntrace(void);
extern int	PQnportals(int rule_p);
extern void PQpnames(char **pnames, int rule_p);
160
extern PortalBuffer *PQparray(char *pname);
161 162 163 164 165 166 167 168 169
extern int	PQrulep(PortalBuffer *portal);
extern int	PQntuples(PortalBuffer *portal);
extern int	PQninstances(PortalBuffer *portal);
extern int	PQngroups(PortalBuffer *portal);
extern int	PQntuplesGroup(PortalBuffer *portal, int group_index);
extern int	PQninstancesGroup(PortalBuffer *portal, int group_index);
extern int	PQnfieldsGroup(PortalBuffer *portal, int group_index);
extern int	PQfnumberGroup(PortalBuffer *portal, int group_index, char *field_name);
extern char *PQfnameGroup(PortalBuffer *portal, int group_index, int field_number);
170
extern int PQftypeGroup(PortalBuffer *portal, int group_index,
171
			 int field_number);
172
extern int PQfsizeGroup(PortalBuffer *portal, int group_index,
173
			 int field_number);
174 175 176 177 178 179 180 181 182 183 184
extern GroupBuffer *PQgroup(PortalBuffer *portal, int tuple_index);
extern int	PQgetgroup(PortalBuffer *portal, int tuple_index);
extern int	PQnfields(PortalBuffer *portal, int tuple_index);
extern int	PQfnumber(PortalBuffer *portal, int tuple_index, char *field_name);
extern char *PQfname(PortalBuffer *portal, int tuple_index, int field_number);
extern int	PQftype(PortalBuffer *portal, int tuple_index, int field_number);
extern int	PQfsize(PortalBuffer *portal, int tuple_index, int field_number);
extern int	PQsametype(PortalBuffer *portal, int tuple_index1, int tuple_index2);
extern char *PQgetvalue(PortalBuffer *portal, int tuple_index, int field_number);
extern char *PQgetAttr(PortalBuffer *portal, int tuple_index, int field_number);
extern int	PQgetlength(PortalBuffer *portal, int tuple_index, int field_number);
185
extern void PQclear(char *pname);
186 187 188

/*
 * prototypes for functions in portalbuf.c
189
 */
190 191
extern caddr_t pbuf_alloc(size_t size);
extern void pbuf_free(caddr_t pointer);
192
extern PortalBuffer *pbuf_addPortal(void);
193
extern GroupBuffer *pbuf_addGroup(PortalBuffer *portal);
194 195
extern TypeBlock *pbuf_addTypes(int n);
extern TupleBlock *pbuf_addTuples(void);
196 197 198
extern char **pbuf_addTuple(int n);
extern int *pbuf_addTupleValueLengths(int n);
extern char *pbuf_addValues(int n);
199
extern PortalEntry *pbuf_addEntry(void);
200
extern void pbuf_freeEntry(int i);
201 202 203 204
extern void pbuf_freeTypes(TypeBlock *types);
extern void pbuf_freeTuples(TupleBlock *tuples, int no_tuples, int no_fields);
extern void pbuf_freeGroup(GroupBuffer *group);
extern void pbuf_freePortal(PortalBuffer *portal);
205
extern int	pbuf_getIndex(char *pname);
206
extern void pbuf_setportalinfo(PortalEntry *entry, char *pname);
207
extern PortalEntry *pbuf_setup(char *pname);
208
extern void pbuf_close(char *pname);
209 210 211 212
extern GroupBuffer *pbuf_findGroup(PortalBuffer *portal, int group_index);
extern int	pbuf_findFnumber(GroupBuffer *group, char *field_name);
extern void pbuf_checkFnumber(GroupBuffer *group, int field_number);
extern char *pbuf_findFname(GroupBuffer *group, int field_number);
213

214 215 216 217 218 219
/* in be-dumpdata.c */
extern void be_portalinit(void);
extern void be_portalpush(PortalEntry *entry);
extern PortalEntry *be_portalpop(void);
extern PortalEntry *be_currentportal(void);
extern PortalEntry *be_newportal(void);
220
extern void be_typeinit(PortalEntry *entry, TupleDesc attrs,
221
			int natts);
222 223
extern void be_printtup(HeapTuple tuple, TupleDesc typeinfo,
						DestReceiver* self);
224 225 226


/* in be-pqexec.c */
227
extern char *PQfn(int fnid, int *result_buf, int result_len, int result_is_int,
228 229 230 231 232 233
	 PQArgBlock *args, int nargs);
extern char *PQexec(char *query);
extern int	pqtest_PQexec(char *q);
extern int	pqtest_PQfn(char *q);
extern int32 pqtest(struct varlena * vlena);

234 235
/*
 * prototypes for functions in pqcomm.c
236
 */
237 238
extern int	StreamServerPort(char *hostName, short portName, int *fdP);
extern int	StreamConnection(int server_fd, Port *port);
239
extern void StreamClose(int sock);
240 241 242 243 244 245 246 247 248 249 250
extern void pq_init(void);
extern int	pq_getport(void);
extern void pq_close(void);
extern int	pq_getbytes(char *s, size_t len);
extern int	pq_getstring(char *s, size_t len);
extern int	pq_peekbyte(void);
extern int	pq_putbytes(const char *s, size_t len);
extern int	pq_flush(void);
extern int	pq_putmessage(char msgtype, const char *s, size_t len);
extern void	pq_startcopyout(void);
extern void	pq_endcopyout(bool errorAbort);
251

252
#endif	 /* LIBPQ_H */