libpq.h 8.8 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
 *
M
 
Marc G. Fournier 已提交
9
 * $Id: libpq.h,v 1.23 1999/01/12 12:49:52 scrappy Exp $
10 11 12 13 14 15
 *
 *-------------------------------------------------------------------------
 */
#ifndef LIBPQ_H
#define LIBPQ_H

16 17
#include <sys/types.h>

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

#include "libpq/libpq-be.h"
#include "access/htup.h"
#include "access/tupdesc.h"

24

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

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

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

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

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

/* ----------------
 * GroupBuffer --
74
 *		A group of tuples with the same attributes.
75 76
 * ----------------
 */
77 78
typedef struct GroupBuffer
{
79 80 81 82
	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 */
83
	struct GroupBuffer *next;	/* next group */
84
} GroupBuffer;
85 86 87

/* ----------------
 * PortalBuffer --
88
 *		Data structure of a portal buffer.
89 90
 * ----------------
 */
91 92
typedef struct PortalBuffer
{
93 94 95 96
	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 */
97
} PortalBuffer;
98 99 100

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

109 110
typedef struct PortalEntry
{
111 112 113 114
	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 */
115
} PortalEntry;
116 117

#define PORTALS_INITIAL_SIZE 32
118
#define PORTALS_GROW_BY		 32
119 120

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

/*
125
 *	Asynchronous notification
126
 */
127 128
typedef struct PQNotifyList
{
M
 
Marc G. Fournier 已提交
129
	char		relname[NAMEDATALEN];	/* listen/notify name */
130 131
	int			be_pid;			/* process id of backend */
	int			valid;			/* has this already been handled by user. */
132
/*	  SLNode Node; */
133
} PQNotifyList;
134 135 136 137 138 139

/*
 * Exceptions.
 */

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

/* in portal.c */
143
extern Exception MemoryError,
144 145 146
			PortalError,
			PostquelError,
			ProtocolError;
147

148 149
/*
 * POSTGRES backend dependent Constants.
150 151 152 153 154 155 156
 */

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

157
extern char PQerrormsg[ERROR_MSG_LENGTH];		/* in portal.c */
158 159 160 161 162

/*
 * External functions.
 */

163 164
/*
 * prototypes for functions in portal.c
165
 */
166 167 168 169 170 171
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);
172
extern PortalBuffer *PQparray(char *pname);
173 174 175 176 177 178 179 180 181
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);
182
extern int PQftypeGroup(PortalBuffer *portal, int group_index,
183
			 int field_number);
184
extern int PQfsizeGroup(PortalBuffer *portal, int group_index,
185
			 int field_number);
186 187 188 189 190 191 192 193 194 195 196
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);
197 198 199
extern void PQclear(char *pname);
extern void PQcleanNotify(void);
extern void PQnotifies_init(void);
200
extern PQNotifyList *PQnotifies(void);
201
extern void PQremoveNotify(PQNotifyList *nPtr);
202
extern void PQappendNotify(char *relname, int pid);
203 204 205

/*
 * prototypes for functions in portalbuf.c
206
 */
207 208
extern caddr_t pbuf_alloc(size_t size);
extern void pbuf_free(caddr_t pointer);
209
extern PortalBuffer *pbuf_addPortal(void);
210
extern GroupBuffer *pbuf_addGroup(PortalBuffer *portal);
211 212
extern TypeBlock *pbuf_addTypes(int n);
extern TupleBlock *pbuf_addTuples(void);
213 214 215
extern char **pbuf_addTuple(int n);
extern int *pbuf_addTupleValueLengths(int n);
extern char *pbuf_addValues(int n);
216
extern PortalEntry *pbuf_addEntry(void);
217
extern void pbuf_freeEntry(int i);
218 219 220 221
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);
222
extern int	pbuf_getIndex(char *pname);
223
extern void pbuf_setportalinfo(PortalEntry *entry, char *pname);
224
extern PortalEntry *pbuf_setup(char *pname);
225
extern void pbuf_close(char *pname);
226 227 228 229
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);
230

231 232 233 234 235 236
/* 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);
237
extern void be_typeinit(PortalEntry *entry, TupleDesc attrs,
238 239 240 241 242
			int natts);
extern void be_printtup(HeapTuple tuple, TupleDesc typeinfo);


/* in be-pqexec.c */
243
extern char *PQfn(int fnid, int *result_buf, int result_len, int result_is_int,
244 245 246 247 248 249
	 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);

250 251
/*
 * prototypes for functions in pqcomm.c
252
 */
253 254 255 256 257 258 259 260
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);
M
 
Marc G. Fournier 已提交
261 262
extern int      pq_getchar(void);
extern int      pq_peekchar(void);
263 264
extern int	pq_getnchar(char *s, int off, int maxlen);
extern int	pq_getint(int b);
M
 
Marc G. Fournier 已提交
265
extern int  pq_putchar(char c);
266 267 268 269 270
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_getinaddr(struct sockaddr_in * sin, char *host, int port);
extern int	pq_getinserv(struct sockaddr_in * sin, char *host, char *serv);
271

272
#ifdef MULTIBYTE
273 274
extern void pq_putncharlen(char *s, int n);

275 276
#endif

277
extern int pq_connect(char *dbname, char *user, char *args, char *hostName,
278
		   char *debugTty, char *execFile, short portName);
279
extern int	StreamOpen(char *hostName, short portName, Port *port);
M
 
Marc G. Fournier 已提交
280
extern void StreamDoUnlink(void);
281 282
extern int	StreamServerPort(char *hostName, short portName, int *fdP);
extern int	StreamConnection(int server_fd, Port *port);
283
extern void StreamClose(int sock);
284

285
#endif	 /* LIBPQ_H */