mirror of
https://github.com/postgres/postgres.git
synced 2025-07-20 05:03:10 +03:00
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...
This commit is contained in:
169
src/interfaces/libpq/pqexpbuffer.h
Normal file
169
src/interfaces/libpq/pqexpbuffer.h
Normal file
@ -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 */
|
Reference in New Issue
Block a user