aboutsummaryrefslogtreecommitdiff
path: root/src/include/libpq/libpq.h
blob: 1b074cba1189562ae1cef62f34eed26183613662 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
/*-------------------------------------------------------------------------
 *
 * libpq.h--
 *	  POSTGRES LIBPQ buffer structure definitions.
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 * $Id: libpq.h,v 1.6 1997/09/07 04:58:24 momjian Exp $
 *
 * NOTES
 *	  This file contains definitions for structures and
 *	  externs for functions used by both frontend applications
 *	  and the POSTGRES backend.  See the files libpq-fe.h and
 *	  libpq-be.h for frontend/backend specific information
 *
 *-------------------------------------------------------------------------
 */
#ifndef LIBPQ_H
#define LIBPQ_H

#include <libpq/pqcomm.h>

/* ----------------
 * PQArgBlock --
 *		Information (pointer to array of this structure) required
 *		for the PQfn() call.
 * ----------------
 */
typedef struct
{
	int				len;
	int				isint;
	union
	{
		int			   *ptr;	/* can't use void (dec compiler barfs)	 */
		int				integer;
	}				u;
}				PQArgBlock;

/* ----------------
 * TypeBlock --
 *		Information about an attribute.
 * ----------------
 */
#define NameLength 16

typedef struct TypeBlock
{
	char			name[NAMEDATALEN];	/* name of the attribute */
	int				adtid;		/* adtid of the type */
	int				adtsize;	/* adtsize of the type */
}				TypeBlock;

/* ----------------
 * TupleBlock --
 *		Data of a tuple.
 * ----------------
 */
#define TupleBlockSize 100

typedef struct TupleBlock
{
	char		  **values[TupleBlockSize];		/* an array of tuples */
	int			   *lengths[TupleBlockSize];	/* an array of length vec.
												 * foreach tuple */
	struct TupleBlock *next;	/* next tuple block */
	int				tuple_index;/* current tuple index */
}				TupleBlock;

/* ----------------
 * GroupBuffer --
 *		A group of tuples with the same attributes.
 * ----------------
 */
typedef struct GroupBuffer
{
	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 */
	struct GroupBuffer *next;	/* next group */
}				GroupBuffer;

/* ----------------
 * PortalBuffer --
 *		Data structure of a portal buffer.
 * ----------------
 */
typedef struct PortalBuffer
{
	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 */
}				PortalBuffer;

/* ----------------
 * PortalEntry --
 *		an entry in the global portal table
 *
 * Note: the portalcxt is only meaningful for PQcalls made from
 *		 within a postgres backend.  frontend apps should ignore it.
 * ----------------
 */
#define PortalNameLength 32

typedef struct PortalEntry
{
	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 */
}				PortalEntry;

#define PORTALS_INITIAL_SIZE 32
#define PORTALS_GROW_BY		 32

/* in portalbuf.c */
extern PortalEntry **portals;
extern size_t	portals_array_size;

/*
 *	Asynchronous notification
 */
typedef struct PQNotifyList
{
	char			relname[NAMEDATALEN];		/* name of relation
												 * containing data */
	int				be_pid;		/* process id of backend */
	int				valid;		/* has this already been handled by user. */
/*	  SLNode Node; */
}				PQNotifyList;

/*
 * Exceptions.
 */

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

/* in portal.c */
extern Exception MemoryError,
				PortalError,
				PostquelError,
				ProtocolError;

/*
 * POSTGRES backend dependent Constants.
 */

/* 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

extern char		PQerrormsg[ERROR_MSG_LENGTH];	/* in portal.c */

/*
 * External functions.
 */

/*
 * prototypes for functions in portal.c
 */
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);
extern PortalBuffer *PQparray(char *pname);
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);
extern int
PQftypeGroup(PortalBuffer * portal, int group_index,
			 int field_number);
extern int
PQfsizeGroup(PortalBuffer * portal, int group_index,
			 int field_number);
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);
extern void		PQclear(char *pname);
extern void		PQcleanNotify(void);
extern void		PQnotifies_init(void);
extern PQNotifyList *PQnotifies(void);
extern void		PQremoveNotify(PQNotifyList * nPtr);
extern void		PQappendNotify(char *relname, int pid);

/*
 * prototypes for functions in portalbuf.c
 */
extern caddr_t	pbuf_alloc(size_t size);
extern void		pbuf_free(caddr_t pointer);
extern PortalBuffer *pbuf_addPortal(void);
extern GroupBuffer *pbuf_addGroup(PortalBuffer * portal);
extern TypeBlock *pbuf_addTypes(int n);
extern TupleBlock *pbuf_addTuples(void);
extern char   **pbuf_addTuple(int n);
extern int	   *pbuf_addTupleValueLengths(int n);
extern char    *pbuf_addValues(int n);
extern PortalEntry *pbuf_addEntry(void);
extern void		pbuf_freeEntry(int i);
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);
extern int		pbuf_getIndex(char *pname);
extern void		pbuf_setportalinfo(PortalEntry * entry, char *pname);
extern PortalEntry *pbuf_setup(char *pname);
extern void		pbuf_close(char *pname);
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);

/*
 * prototypes for functions in pqcomm.c
 */
extern void		pq_init(int fd);
extern void		pq_gettty(char *tp);
extern int		pq_getport(void);
extern void		pq_close(void);
extern void		pq_flush(void);
extern int		pq_getstr(char *s, int maxlen);
extern int		PQgetline(char *s, int maxlen);
extern int		PQputline(char *s);
extern int		pq_getnchar(char *s, int off, int maxlen);
extern int		pq_getint(int b);
extern void		pq_putstr(char *s);
extern void		pq_putnchar(char *s, int n);
extern void		pq_putint(int i, int b);
extern int		pq_sendoob(char *msg, int len);
extern int		pq_recvoob(char *msgPtr, int *lenPtr);
extern int		pq_getinaddr(struct sockaddr_in * sin, char *host, int port);
extern int		pq_getinserv(struct sockaddr_in * sin, char *host, char *serv);
extern int
pq_connect(char *dbname, char *user, char *args, char *hostName,
		   char *debugTty, char *execFile, short portName);
extern int		StreamOpen(char *hostName, short portName, Port * port);
extern void		pq_regoob(void (*fptr) ());
extern void		pq_unregoob(void);
extern void		pq_async_notify(void);
extern int		StreamServerPort(char *hostName, short portName, int *fdP);
extern int		StreamConnection(int server_fd, Port * port);
extern void		StreamClose(int sock);

#endif							/* LIBPQ_H */