diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 1999-08-31 01:37:37 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 1999-08-31 01:37:37 +0000 |
commit | ab5cafa5d3f47439d8f65516bc5b88ad04117621 (patch) | |
tree | 33724b61ca936a81b37106ffa29ba4e396a543fd /src/interfaces/libpq/pqexpbuffer.h | |
parent | 130e372b5d55fcd8201518adc9025a5cb0f13b56 (diff) |
Update frontend libpq to remove limits on query lengths,
error/notice message lengths, and number of fields per tuple. Add
pqexpbuffer.c/.h, a frontend version of backend's stringinfo module.
This is first step in applying Mike Ansley's long-query patches,
even though he didn't do any of these particular changes...
Diffstat (limited to 'src/interfaces/libpq/pqexpbuffer.h')
-rw-r--r-- | src/interfaces/libpq/pqexpbuffer.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/interfaces/libpq/pqexpbuffer.h b/src/interfaces/libpq/pqexpbuffer.h new file mode 100644 index 00000000000..5c2d2f122ce --- /dev/null +++ b/src/interfaces/libpq/pqexpbuffer.h @@ -0,0 +1,169 @@ +/*------------------------------------------------------------------------- + * + * pqexpbuffer.h + * Declarations/definitions for "PQExpBuffer" functions. + * + * PQExpBuffer provides an indefinitely-extensible string data type. + * It can be used to buffer either ordinary C strings (null-terminated text) + * or arbitrary binary data. All storage is allocated with malloc(). + * + * This module is essentially the same as the backend's StringInfo data type, + * but it is intended for use in frontend libpq and client applications. + * Thus, it does not rely on palloc(), elog(), nor vsnprintf(). + * + * Copyright (c) 1994, Regents of the University of California + * + * $Id: pqexpbuffer.h,v 1.1 1999/08/31 01:37:37 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef PQEXPBUFFER_H +#define PQEXPBUFFER_H + +/*------------------------- + * PQExpBufferData holds information about an extensible string. + * data is the current buffer for the string (allocated with malloc). + * len is the current string length. There is guaranteed to be + * a terminating '\0' at data[len], although this is not very + * useful when the string holds binary data rather than text. + * maxlen is the allocated size in bytes of 'data', i.e. the maximum + * string size (including the terminating '\0' char) that we can + * currently store in 'data' without having to reallocate + * more space. We must always have maxlen > len. + *------------------------- + */ +typedef struct PQExpBufferData +{ + char *data; + int len; + int maxlen; +} PQExpBufferData; + +typedef PQExpBufferData *PQExpBuffer; + +/*------------------------ + * Initial size of the data buffer in a PQExpBuffer. + * NB: this must be large enough to hold error messages that might + * be returned by PQrequestCancel() or any routine in fe-auth.c. + *------------------------ + */ +#define INITIAL_EXPBUFFER_SIZE 256 + +/*------------------------ + * There are two ways to create a PQExpBuffer object initially: + * + * PQExpBuffer stringptr = createPQExpBuffer(); + * Both the PQExpBufferData and the data buffer are malloc'd. + * + * PQExpBufferData string; + * initPQExpBuffer(&string); + * The data buffer is malloc'd but the PQExpBufferData is presupplied. + * This is appropriate if the PQExpBufferData is a field of another + * struct. + *------------------------- + */ + +/*------------------------ + * createPQExpBuffer + * Create an empty 'PQExpBufferData' & return a pointer to it. + */ +extern PQExpBuffer createPQExpBuffer(void); + +/*------------------------ + * initPQExpBuffer + * Initialize a PQExpBufferData struct (with previously undefined contents) + * to describe an empty string. + */ +extern void initPQExpBuffer(PQExpBuffer str); + +/*------------------------ + * To destroy a PQExpBuffer, use either: + * + * destroyPQExpBuffer(str); + * free()s both the data buffer and the PQExpBufferData. + * This is the inverse of createPQExpBuffer(). + * + * termPQExpBuffer(str) + * free()s the data buffer but not the PQExpBufferData itself. + * This is the inverse of initPQExpBuffer(). + * + * NOTE: some routines build up a string using PQExpBuffer, and then + * release the PQExpBufferData but return the data string itself to their + * caller. At that point the data string looks like a plain malloc'd + * string. + */ +extern void destroyPQExpBuffer(PQExpBuffer str); +extern void termPQExpBuffer(PQExpBuffer str); + +/*------------------------ + * resetPQExpBuffer + * Reset a PQExpBuffer to empty + */ +extern void resetPQExpBuffer(PQExpBuffer str); + +/*------------------------ + * enlargePQExpBuffer + * Make sure there is enough space for 'needed' more bytes in the buffer + * ('needed' does not include the terminating null). + * + * Returns 1 if OK, 0 if failed to enlarge buffer. + */ +extern int enlargePQExpBuffer(PQExpBuffer str, int needed); + +/*------------------------ + * printfPQExpBuffer + * Format text data under the control of fmt (an sprintf-like format string) + * and insert it into str. More space is allocated to str if necessary. + * This is a convenience routine that does the same thing as + * resetPQExpBuffer() followed by appendPQExpBuffer(). + * + * CAUTION: the frontend version of this routine WILL FAIL if the result of + * the sprintf formatting operation exceeds 1KB of data (but the size of the + * pre-existing string in the buffer doesn't matter). We could make it + * support larger strings, but that requires vsnprintf() which is not + * universally available. Currently there is no need for long strings to be + * formatted in the frontend. We could support it, if necessary, by + * conditionally including a vsnprintf emulation. + */ +extern void printfPQExpBuffer(PQExpBuffer str, const char *fmt,...); + +/*------------------------ + * appendPQExpBuffer + * Format text data under the control of fmt (an sprintf-like format string) + * and append it to whatever is already in str. More space is allocated + * to str if necessary. This is sort of like a combination of sprintf and + * strcat. + * + * CAUTION: the frontend version of this routine WILL FAIL if the result of + * the sprintf formatting operation exceeds 1KB of data (but the size of the + * pre-existing string in the buffer doesn't matter). We could make it + * support larger strings, but that requires vsnprintf() which is not + * universally available. Currently there is no need for long strings to be + * formatted in the frontend. We could support it, if necessary, by + * conditionally including a vsnprintf emulation. + */ +extern void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...); + +/*------------------------ + * appendPQExpBufferStr + * Append the given string to a PQExpBuffer, allocating more space + * if necessary. + */ +extern void appendPQExpBufferStr(PQExpBuffer str, const char *data); + +/*------------------------ + * appendPQExpBufferChar + * Append a single byte to str. + * Like appendPQExpBuffer(str, "%c", ch) but much faster. + */ +extern void appendPQExpBufferChar(PQExpBuffer str, char ch); + +/*------------------------ + * appendBinaryPQExpBuffer + * Append arbitrary binary data to a PQExpBuffer, allocating more space + * if necessary. + */ +extern void appendBinaryPQExpBuffer(PQExpBuffer str, + const char *data, int datalen); + +#endif /* PQEXPBUFFER_H */ |