Reindent server/core/buffer.c
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -34,12 +34,12 @@
|
|||||||
* @verbatim
|
* @verbatim
|
||||||
* Revision History
|
* Revision History
|
||||||
*
|
*
|
||||||
* Date Who Description
|
* Date Who Description
|
||||||
* 10/06/2013 Mark Riddoch Initial implementation
|
* 10/06/2013 Mark Riddoch Initial implementation
|
||||||
* 11/07/2013 Mark Riddoch Addition of reference count in the gwbuf
|
* 11/07/2013 Mark Riddoch Addition of reference count in the gwbuf
|
||||||
* 16/07/2013 Massimiliano Pinto Added command type for the queue
|
* 16/07/2013 Massimiliano Pinto Added command type for the queue
|
||||||
* 10/07/2014 Mark Riddoch Addition of hints
|
* 10/07/2014 Mark Riddoch Addition of hints
|
||||||
* 15/07/2014 Mark Riddoch Added buffer properties
|
* 15/07/2014 Mark Riddoch Added buffer properties
|
||||||
* 03/10/2014 Martin Brampton Pointer arithmetic standard conformity
|
* 03/10/2014 Martin Brampton Pointer arithmetic standard conformity
|
||||||
* Add more buffer handling macros
|
* Add more buffer handling macros
|
||||||
* Add gwbuf_rtrim (handle chains)
|
* Add gwbuf_rtrim (handle chains)
|
||||||
@ -60,22 +60,23 @@ EXTERN_C_BLOCK_BEGIN
|
|||||||
* contents. This may be added at any point during the processing of the
|
* contents. This may be added at any point during the processing of the
|
||||||
* data, especially in the protocol stage of the processing.
|
* data, especially in the protocol stage of the processing.
|
||||||
*/
|
*/
|
||||||
typedef struct buf_property {
|
typedef struct buf_property
|
||||||
char *name;
|
{
|
||||||
char *value;
|
char *name;
|
||||||
struct buf_property *next;
|
char *value;
|
||||||
|
struct buf_property *next;
|
||||||
} BUF_PROPERTY;
|
} BUF_PROPERTY;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GWBUF_TYPE_UNDEFINED = 0x00,
|
GWBUF_TYPE_UNDEFINED = 0x00,
|
||||||
GWBUF_TYPE_PLAINSQL = 0x01,
|
GWBUF_TYPE_PLAINSQL = 0x01,
|
||||||
GWBUF_TYPE_MYSQL = 0x02,
|
GWBUF_TYPE_MYSQL = 0x02,
|
||||||
GWBUF_TYPE_SINGLE_STMT = 0x04,
|
GWBUF_TYPE_SINGLE_STMT = 0x04,
|
||||||
GWBUF_TYPE_SESCMD_RESPONSE = 0x08,
|
GWBUF_TYPE_SESCMD_RESPONSE = 0x08,
|
||||||
GWBUF_TYPE_RESPONSE_END = 0x10,
|
GWBUF_TYPE_RESPONSE_END = 0x10,
|
||||||
GWBUF_TYPE_SESCMD = 0x20,
|
GWBUF_TYPE_SESCMD = 0x20,
|
||||||
GWBUF_TYPE_HTTP = 0x40
|
GWBUF_TYPE_HTTP = 0x40
|
||||||
} gwbuf_type_t;
|
} gwbuf_type_t;
|
||||||
|
|
||||||
#define GWBUF_IS_TYPE_UNDEFINED(b) (b->gwbuf_type == 0)
|
#define GWBUF_IS_TYPE_UNDEFINED(b) (b->gwbuf_type == 0)
|
||||||
@ -91,37 +92,39 @@ typedef enum
|
|||||||
* shared between multiple GWBUF's without the need to make multiple copies
|
* shared between multiple GWBUF's without the need to make multiple copies
|
||||||
* but still maintain separate data pointers.
|
* but still maintain separate data pointers.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
unsigned char *data; /*< Physical memory that was allocated */
|
{
|
||||||
int refcount; /*< Reference count on the buffer */
|
unsigned char *data; /*< Physical memory that was allocated */
|
||||||
|
int refcount; /*< Reference count on the buffer */
|
||||||
} SHARED_BUF;
|
} SHARED_BUF;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GWBUF_INFO_NONE = 0x0,
|
GWBUF_INFO_NONE = 0x0,
|
||||||
GWBUF_INFO_PARSED = 0x1
|
GWBUF_INFO_PARSED = 0x1
|
||||||
} gwbuf_info_t;
|
} gwbuf_info_t;
|
||||||
|
|
||||||
#define GWBUF_IS_PARSED(b) (b->gwbuf_info & GWBUF_INFO_PARSED)
|
#define GWBUF_IS_PARSED(b) (b->gwbuf_info & GWBUF_INFO_PARSED)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A structure for cleaning up memory allocations of structures which are
|
* A structure for cleaning up memory allocations of structures which are
|
||||||
* referred to by GWBUF and deallocated in gwbuf_free but GWBUF doesn't
|
* referred to by GWBUF and deallocated in gwbuf_free but GWBUF doesn't
|
||||||
* know what they are.
|
* know what they are.
|
||||||
* All functions on the list are executed before freeing memory of GWBUF struct.
|
* All functions on the list are executed before freeing memory of GWBUF struct.
|
||||||
*/
|
*/
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GWBUF_PARSING_INFO
|
GWBUF_PARSING_INFO
|
||||||
} bufobj_id_t;
|
} bufobj_id_t;
|
||||||
|
|
||||||
typedef struct buffer_object_st buffer_object_t;
|
typedef struct buffer_object_st buffer_object_t;
|
||||||
|
|
||||||
struct buffer_object_st {
|
struct buffer_object_st
|
||||||
bufobj_id_t bo_id;
|
{
|
||||||
void* bo_data;
|
bufobj_id_t bo_id;
|
||||||
void (*bo_donefun_fp)(void *);
|
void* bo_data;
|
||||||
buffer_object_t* bo_next;
|
void (*bo_donefun_fp)(void *);
|
||||||
|
buffer_object_t* bo_next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -133,28 +136,29 @@ struct buffer_object_st {
|
|||||||
* flexible data pointers is designed to minimise the need for data to
|
* flexible data pointers is designed to minimise the need for data to
|
||||||
* be copied within the gateway.
|
* be copied within the gateway.
|
||||||
*/
|
*/
|
||||||
typedef struct gwbuf {
|
typedef struct gwbuf
|
||||||
SPINLOCK gwbuf_lock;
|
{
|
||||||
struct gwbuf *next; /*< Next buffer in a linked chain of buffers */
|
SPINLOCK gwbuf_lock;
|
||||||
struct gwbuf *tail; /*< Last buffer in a linked chain of buffers */
|
struct gwbuf *next; /*< Next buffer in a linked chain of buffers */
|
||||||
void *start; /*< Start of the valid data */
|
struct gwbuf *tail; /*< Last buffer in a linked chain of buffers */
|
||||||
void *end; /*< First byte after the valid data */
|
void *start; /*< Start of the valid data */
|
||||||
SHARED_BUF *sbuf; /*< The shared buffer with the real data */
|
void *end; /*< First byte after the valid data */
|
||||||
buffer_object_t *gwbuf_bufobj; /*< List of objects referred to by GWBUF */
|
SHARED_BUF *sbuf; /*< The shared buffer with the real data */
|
||||||
gwbuf_info_t gwbuf_info; /*< Info bits */
|
buffer_object_t *gwbuf_bufobj; /*< List of objects referred to by GWBUF */
|
||||||
gwbuf_type_t gwbuf_type; /*< buffer's data type information */
|
gwbuf_info_t gwbuf_info; /*< Info bits */
|
||||||
HINT *hint; /*< Hint data for this buffer */
|
gwbuf_type_t gwbuf_type; /*< buffer's data type information */
|
||||||
BUF_PROPERTY *properties; /*< Buffer properties */
|
HINT *hint; /*< Hint data for this buffer */
|
||||||
|
BUF_PROPERTY *properties; /*< Buffer properties */
|
||||||
} GWBUF;
|
} GWBUF;
|
||||||
|
|
||||||
/*<
|
/*<
|
||||||
* Macros to access the data in the buffers
|
* Macros to access the data in the buffers
|
||||||
*/
|
*/
|
||||||
/*< First valid, unconsumed byte in the buffer */
|
/*< First valid, unconsumed byte in the buffer */
|
||||||
#define GWBUF_DATA(b) ((b)->start)
|
#define GWBUF_DATA(b) ((b)->start)
|
||||||
|
|
||||||
/*< Number of bytes in the individual buffer */
|
/*< Number of bytes in the individual buffer */
|
||||||
#define GWBUF_LENGTH(b) ((char *)(b)->end - (char *)(b)->start)
|
#define GWBUF_LENGTH(b) ((char *)(b)->end - (char *)(b)->start)
|
||||||
|
|
||||||
/*< Return the byte at offset byte from the start of the unconsumed portion of the buffer */
|
/*< Return the byte at offset byte from the start of the unconsumed portion of the buffer */
|
||||||
#define GWBUF_DATA_CHAR(b, byte) (GWBUF_LENGTH(b) < ((byte)+1) ? -1 : *(((char *)(b)->start)+4))
|
#define GWBUF_DATA_CHAR(b, byte) (GWBUF_LENGTH(b) < ((byte)+1) ? -1 : *(((char *)(b)->start)+4))
|
||||||
@ -163,39 +167,42 @@ typedef struct gwbuf {
|
|||||||
#define GWBUF_IS_SQL(b) (0x03 == GWBUF_DATA_CHAR(b,4))
|
#define GWBUF_IS_SQL(b) (0x03 == GWBUF_DATA_CHAR(b,4))
|
||||||
|
|
||||||
/*< True if all bytes in the buffer have been consumed */
|
/*< True if all bytes in the buffer have been consumed */
|
||||||
#define GWBUF_EMPTY(b) ((char *)(b)->start >= (char *)(b)->end)
|
#define GWBUF_EMPTY(b) ((char *)(b)->start >= (char *)(b)->end)
|
||||||
|
|
||||||
/*< Consume a number of bytes in the buffer */
|
/*< Consume a number of bytes in the buffer */
|
||||||
#define GWBUF_CONSUME(b, bytes) ((b)->start = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->end : (void *)((char *)(b)->start + (bytes)));
|
#define GWBUF_CONSUME(b, bytes) ((b)->start = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->end : (void *)((char *)(b)->start + (bytes)));
|
||||||
|
|
||||||
/*< Check if a given pointer is within the buffer */
|
/*< Check if a given pointer is within the buffer */
|
||||||
#define GWBUF_POINTER_IN_BUFFER (ptr, b) ((char *)(ptr) >= (char *)(b)->start && (char *)(ptr) < (char *)(b)->end)
|
#define GWBUF_POINTER_IN_BUFFER (ptr, b)\
|
||||||
|
((char *)(ptr) >= (char *)(b)->start && (char *)(ptr) < (char *)(b)->end)
|
||||||
|
|
||||||
/*< Consume a complete buffer */
|
/*< Consume a complete buffer */
|
||||||
#define GWBUF_CONSUME_ALL(b) gwbuf_consume((b), GWBUF_LENGTH((b)))
|
#define GWBUF_CONSUME_ALL(b) gwbuf_consume((b), GWBUF_LENGTH((b)))
|
||||||
|
|
||||||
#define GWBUF_RTRIM(b, bytes) ((b)->end = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->start : (void *)((char *)(b)->end - (bytes)));
|
#define GWBUF_RTRIM(b, bytes)\
|
||||||
|
((b)->end = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->start : \
|
||||||
|
(void *)((char *)(b)->end - (bytes)));
|
||||||
|
|
||||||
#define GWBUF_TYPE(b) (b)->gwbuf_type
|
#define GWBUF_TYPE(b) (b)->gwbuf_type
|
||||||
/*<
|
/*<
|
||||||
* Function prototypes for the API to maniplate the buffers
|
* Function prototypes for the API to maniplate the buffers
|
||||||
*/
|
*/
|
||||||
extern GWBUF *gwbuf_alloc(unsigned int size);
|
extern GWBUF *gwbuf_alloc(unsigned int size);
|
||||||
extern void gwbuf_free(GWBUF *buf);
|
extern void gwbuf_free(GWBUF *buf);
|
||||||
extern GWBUF *gwbuf_clone(GWBUF *buf);
|
extern GWBUF *gwbuf_clone(GWBUF *buf);
|
||||||
extern GWBUF *gwbuf_append(GWBUF *head, GWBUF *tail);
|
extern GWBUF *gwbuf_append(GWBUF *head, GWBUF *tail);
|
||||||
extern GWBUF *gwbuf_consume(GWBUF *head, unsigned int length);
|
extern GWBUF *gwbuf_consume(GWBUF *head, unsigned int length);
|
||||||
extern GWBUF *gwbuf_trim(GWBUF *head, unsigned int length);
|
extern GWBUF *gwbuf_trim(GWBUF *head, unsigned int length);
|
||||||
extern GWBUF *gwbuf_rtrim(GWBUF *head, unsigned int length);
|
extern GWBUF *gwbuf_rtrim(GWBUF *head, unsigned int length);
|
||||||
extern unsigned int gwbuf_length(GWBUF *head);
|
extern unsigned int gwbuf_length(GWBUF *head);
|
||||||
extern GWBUF *gwbuf_clone_portion(GWBUF *head, size_t offset, size_t len);
|
extern GWBUF *gwbuf_clone_portion(GWBUF *head, size_t offset, size_t len);
|
||||||
extern GWBUF *gwbuf_clone_transform(GWBUF *head, gwbuf_type_t type);
|
extern GWBUF *gwbuf_clone_transform(GWBUF *head, gwbuf_type_t type);
|
||||||
extern GWBUF *gwbuf_clone_all(GWBUF* head);
|
extern GWBUF *gwbuf_clone_all(GWBUF* head);
|
||||||
extern void gwbuf_set_type(GWBUF *head, gwbuf_type_t type);
|
extern void gwbuf_set_type(GWBUF *head, gwbuf_type_t type);
|
||||||
extern int gwbuf_add_property(GWBUF *buf, char *name, char *value);
|
extern int gwbuf_add_property(GWBUF *buf, char *name, char *value);
|
||||||
extern char *gwbuf_get_property(GWBUF *buf, char *name);
|
extern char *gwbuf_get_property(GWBUF *buf, char *name);
|
||||||
extern GWBUF *gwbuf_make_contiguous(GWBUF *);
|
extern GWBUF *gwbuf_make_contiguous(GWBUF *);
|
||||||
extern int gwbuf_add_hint(GWBUF *, HINT *);
|
extern int gwbuf_add_hint(GWBUF *, HINT *);
|
||||||
|
|
||||||
void gwbuf_add_buffer_object(GWBUF* buf,
|
void gwbuf_add_buffer_object(GWBUF* buf,
|
||||||
bufobj_id_t id,
|
bufobj_id_t id,
|
||||||
|
Reference in New Issue
Block a user