1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5 * Copyright (C) 2011 Data Differential, http://datadifferential.com/
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following disclaimer
16 * in the documentation and/or other materials provided with the
19 * * The names of its contributors may not be used to endorse or
20 * promote products derived from this software without specific prior
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #if !defined(__cplusplus)
45 #include <libmemcached/visibility.h>
46 #include <libmemcached/protocol_handler.h>
47 #include <libmemcached/protocol/cache.h>
50 * I don't really need the following two functions as function pointers
51 * in the instance handle, but I don't want to put them in the global
52 * namespace for those linking statically (personally I don't like that,
53 * but some people still do). If it ever shows up as a performance thing
54 * I'll look into optimizing this ;-)
56 typedef bool (*drain_func
)(memcached_protocol_client_st
*client
);
57 typedef protocol_binary_response_status (*spool_func
)(memcached_protocol_client_st
*client
,
62 * Definition of the per instance structure.
64 struct memcached_protocol_st
{
65 memcached_binary_protocol_callback_st
*callback
;
66 memcached_protocol_recv_func recv
;
67 memcached_protocol_send_func send
;
70 * I really don't need these as funciton pointers, but I don't want
71 * to clutter the namespace if someone links statically.
77 * To avoid keeping a buffer in each client all the time I have a
78 * bigger buffer in the instance that I read to initially, and then
79 * I try to parse and execute as much from the buffer. If I wasn't able
80 * to process all data I'll keep that in a per-connection buffer until
81 * the next time I can read from the socket.
83 uint8_t *input_buffer
;
84 size_t input_buffer_size
;
87 /* @todo use multiple sized buffers */
88 cache_t
*buffer_cache
;
92 /* Pointer to the data */
94 /* The offset to the first byte into the buffer that is used */
96 /* The offset into the buffer for the first free byte */
98 /* The number of bytes in the buffer */
100 /* Pointer to the next buffer in the chain */
101 struct chunk_st
*next
;
104 #define CHUNK_BUFFERSIZE 2048
106 typedef memcached_protocol_event_t (*process_data
)(struct memcached_protocol_client_st
*client
, ssize_t
*length
, void **endptr
);
128 struct memcached_protocol_client_st
{
129 memcached_protocol_st
*root
;
130 memcached_socket_t sock
;
133 /* Linked list of data to send */
134 struct chunk_st
*output
;
135 struct chunk_st
*output_tail
;
138 * While we process input data, this is where we spool incomplete commands
139 * if we need to receive more data....
140 * @todo use the buffercace
142 uint8_t *input_buffer
;
143 size_t input_buffer_size
;
144 size_t input_buffer_offset
;
146 /* The callback to the protocol handler to use (ascii or binary) */
150 * Should the spool data discard the data to send or not? (aka noreply in
151 * the ascii protocol..
155 /* Members used by the binary protocol */
156 protocol_binary_request_header
*current_command
;
158 /* Members used by the ascii protocol */
159 enum ascii_cmd ascii_command
;
162 #include "ascii_handler.h"
163 #include "binary_handler.h"