8 #ifndef INCL_evo_api_memcached_server_h 9 #define INCL_evo_api_memcached_server_h 12 #include "../ioasync_server.h" 13 #include "../strtok.h" 137 DeferredReply(DeferredContext& context, ulong
id) : DeferredContext::ReplyBase(context, id) {
142 if (!finished && context.handler != NULL) {
143 context.handler->logger.log(
LOG_LEVEL_ERROR,
"MemcServer DeferredReply left unfinished");
144 deferred_reply_error(
"Internal handler error: DeferredReply left unfinished");
152 if (context.handler != NULL) {
155 buf.
set(
"SERVER_ERROR ", 13);
158 DeferredContext::Handler& handler = *context.handler;
159 handler.reply.deferred_send(
id, buf,
true);
161 handler.logger.log_direct(
LOG_LEVEL_DEBUG_LOW,
String().reserve(40 + msg.size()) <<
"MemcServer deferred reply " <<
id <<
" error: " << msg);
162 if (handler.reply.deferred_end(context))
172 if (context.handler != NULL) {
179 default: buf.
set(
"SERVER_ERROR Backend error\r\n", 28);
break;
181 DeferredContext::Handler& handler = *context.handler;
184 handler.reply.deferred_send(
id, buf,
true);
185 if (handler.reply.deferred_end(context))
195 if (context.handler != NULL) {
198 buf.
set(
"NOT_FOUND\r\n", 11);
203 DeferredContext::Handler& handler = *context.handler;
206 handler.reply.deferred_send(
id, buf,
true);
207 if (handler.reply.deferred_end(context))
217 if (context.handler != NULL) {
220 buf.
set(
"DELETED\r\n", 9);
222 buf.
set(
"NOT_FOUND\r\n", 11);
223 DeferredContext::Handler& handler = *context.handler;
226 handler.reply.deferred_send(
id, buf,
true);
227 if (handler.reply.deferred_end(context))
237 if (context.handler != NULL) {
240 buf.
set(
"TOUCHED\r\n", 9);
242 buf.
set(
"NOT_FOUND\r\n", 11);
243 DeferredContext::Handler& handler = *context.handler;
246 handler.reply.deferred_send(
id, buf,
true);
247 if (handler.reply.deferred_end(context))
264 if (context.handler != NULL) {
265 DeferredContext::Handler& handler = *context.handler;
268 handler.logger.log_direct(
LOG_LEVEL_DEBUG_LOW,
String().reserve(68 + key.
size()) <<
"MemcServer on_get sent deferred value " <<
id <<
": '" << key <<
"' (size: " << value.
size() <<
')');
274 if (context.handler != NULL) {
276 DeferredContext::Handler& handler = *context.handler;
277 handler.reply.deferred_send(
id, buf,
true);
279 handler.logger.log_direct(
LOG_LEVEL_DEBUG_LOW,
String().reserve(48) <<
"MemcServer on_get end deferred response " <<
id);
280 if (handler.reply.deferred_end(context))
299 const size_t MAX_INITIAL_READ_VALUE = 524288;
300 return MAX_INITIAL_READ_VALUE;
575 writer.add(
"\r\n", 2);
587 writer.add(
"CLIENT_ERROR ", 13);
589 writer.add(
"\r\n", 2);
601 writer.add(
"SERVER_ERROR ", 13);
603 writer.add(
"\r\n", 2);
618 writer.add(
"STAT ", 5);
619 writer.add(name.
data(), name.
size());
621 writer.add(value.
data(), value.
size());
622 writer.add(
"\r\n", 2);
655 SizeT write_size = 12 + key.
size() + flags_str.
size() + value_size_str.size() + value.
size();
656 if (cas_id != NULL) {
657 cas_id_str.
set(*cas_id);
658 write_size += 1 + cas_id_str.
size();
662 writer.add(
"VALUE ", 6);
664 writer.add(
' ').add(flags_str.
data(), flags_str.
size());
665 writer.add(
' ').add(value_size_str.data(), value_size_str.size());
667 writer.add(
' ').add(cas_id_str.
data(), cas_id_str.
size());
668 writer.add(
"\r\n", 2);
669 writer.add(value.
data(), value.
size());
670 writer.add(
"\r\n", 2);
757 static const size_t MIN_INITIAL_READ = 0;
758 static const size_t NEWLINE_LEN = 2;
778 handler.logger.set(logger);
784 #define EVO_HELPER_HANDLER_DEFCHECK(EVENT_NAME, EVENT_MSG_SUFFIX) \ 785 if (handler.noreply) { \ 786 logger.log(LOG_LEVEL_ERROR, "MemcServer " EVENT_NAME " error: Handler returned rtDEFERRED on 'noreply' request"); \ 789 if (++expected_deferred_count != context_ref.count()) { \ 790 if (expected_deferred_count > context_ref.count()) \ 791 logger.log(LOG_LEVEL_ERROR, "MemcServer " EVENT_NAME " error: Handler returned rtDEFERRED without creating a DeferredReply"); \ 793 logger.log(LOG_LEVEL_ERROR, "MemcServer " EVENT_NAME " error: Handler created more than one DeferredReply, only 1 allowed per handler"); \ 796 logger.log(LOG_LEVEL_DEBUG_LOW, "MemcServer -- " EVENT_NAME " response deferred" EVENT_MSG_SUFFIX); 799 #define EVO_HELPER_HANDLER_CASES(EVENT_NAME) \ 800 case HandlerBase::rtDEFERRED: \ 801 EVO_HELPER_HANDLER_DEFCHECK(EVENT_NAME, "") \ 803 case HandlerBase::rtHANDLED: break; \ 804 default: return false; 807 #define EVO_HELPER_HANDLER_END_DEFCHECK(EVENT_NAME) \ 808 if (expected_deferred_count != context_ref.count()) { \ 809 logger.log(LOG_LEVEL_ERROR, "MemcServer " EVENT_NAME " error: Handler created DeferredReply without returning rtDEFERRED"); \ 816 assert( context != NULL );
819 logstr.
set().
reserve(96 + storage_params.key.size())
820 <<
"MemcServer on_store " << HandlerBase::CommandEnum::get_string(command)
821 <<
" '" << storage_params.key <<
"' fl:" << storage_params.flags <<
" exp:" << storage_params.expire;
822 if (command == HandlerBase::cCAS)
823 logstr <<
" id:" << storage_params.cas_id;
824 logstr <<
" (size: " << storage_params.
size <<
')';
827 data.
stripr(
"\r\n", NEWLINE_LEN, 1);
829 DeferredContext& context_ref = *(DeferredContext*)context;
830 ulong expected_deferred_count = context_ref.count();
832 HandlerBase::StoreResult result = handler.on_store(context_ref, storage_params, data, command, storage_params.cas_id);
833 switch (result.
type) {
834 case HandlerBase::rtNORMAL:
854 assert( context != NULL );
856 DeferredContext& context_ref = *(DeferredContext*)context;
857 ulong expected_deferred_count = context_ref.count();
859 const char DELIM =
' ';
864 line.
split(
' ', command_str, params_str);
866 handler.noreply =
false;
868 command = Handler::CommandEnum::get_enum(command_str);
871 case HandlerBase::cCAS:
872 if (!handler.enable_cas) {
873 handler.send_error(
"Not implemented");
876 case HandlerBase::cADD:
877 case HandlerBase::cAPPEND:
878 case HandlerBase::cPREPEND:
879 case HandlerBase::cREPLACE:
880 case HandlerBase::cSET: {
881 storage_params.key.set();
882 storage_params.flags = 0;
883 storage_params.expire = 0;
884 storage_params.size = 0;
892 if (command == HandlerBase::cCAS) {
898 if (storage_params.key.empty()) {
899 handler.send_client_error(
"Missing parameter, expected key");
904 handler.reply.nosend(handler.id);
906 if (!buffers.
read_fixed_helper(*
this, fixed_size, storage_params.size + NEWLINE_LEN, 0, context))
914 case HandlerBase::cINCREMENT:
915 case HandlerBase::cDECREMENT: {
926 handler.send_client_error(
"Missing parameter, expected key");
932 handler.reply.nosend(handler.id);
934 switch (result.
type) {
935 case HandlerBase::rtNORMAL:
936 if (!result.
result.null()) {
938 result_str.
add(
"\r\n", NEWLINE_LEN);
941 reply(
"NOT_FOUND\r\n", 11);
950 case HandlerBase::cDELETE: {
959 handler.send_client_error(
"Missing parameter, expected key(s)");
965 handler.reply.nosend(handler.id);
967 switch (result.
type) {
968 case HandlerBase::rtNORMAL:
969 if (result.
result == HandlerBase::grOK)
970 reply(
"DELETED\r\n", 9);
972 reply(
"NOT_FOUND\r\n", 11);
981 case HandlerBase::cTOUCH: {
992 handler.send_client_error(
"Missing parameter, expected key(s)");
998 handler.reply.nosend(handler.id);
1000 switch (result.
type) {
1001 case HandlerBase::rtNORMAL:
1002 if (result.
result == HandlerBase::grOK)
1003 reply(
"TOUCHED\r\n", 9);
1005 reply(
"NOT_FOUND\r\n", 11);
1014 case HandlerBase::cGAT:
1015 case HandlerBase::cGATS:
1016 case HandlerBase::cGETS:
1017 case HandlerBase::cGET: {
1018 bool handled =
false;
1022 case HandlerBase::cGETS:
1024 if (!handler.enable_cas) {
1025 handler.send_error(
"Not implemented");
1029 adv_params.
cas =
true;
1030 adv_params_ptr = &adv_params;
1032 case HandlerBase::cGATS:
1034 if (!handler.enable_cas) {
1035 handler.send_error(
"Not implemented");
1039 adv_params.
cas =
true;
1040 case HandlerBase::cGAT: {
1042 if (!handler.enable_gat) {
1043 handler.send_error(
"Not implemented");
1048 if (!params_str.
token(expire_str, DELIM) || expire_str.
empty() || params_str.
stripl(DELIM).
empty()) {
1049 handler.send_client_error(
"Missing parameter, expected expire value and key(s)");
1054 adv_params_ptr = &adv_params;
1058 if (params_str.
empty()) {
1059 handler.send_client_error(
"Missing parameter, expected key(s)");
1069 logstr.
set().
reserve(48) <<
"MemcServer get adv:" << command_str;
1071 logstr <<
" exp:" << *adv_params.
expire;
1077 switch (result.
type) {
1078 case HandlerBase::rtNORMAL:
1080 case HandlerBase::gsrCONTINUE: {
1083 while (tok.nextw(DELIM)) {
1086 switch (handler.on_get(context_ref, tok.value(), adv_params_ptr)) {
1087 case HandlerBase::rtNORMAL:
break;
1088 case HandlerBase::rtHANDLED: handled =
true;
break;
1090 default:
return false;
1097 case HandlerBase::gsrSKIP:
1102 case HandlerBase::rtHANDLED: handled =
true;
break;
1103 default:
return false;
1108 switch (handler.on_get_end(context_ref)) {
1109 case HandlerBase::rtNORMAL:
break;
1110 case HandlerBase::rtHANDLED: handled =
true;
break;
1112 default:
return false;
1116 if (!handled && deferred == 0) {
1117 String buf(
"END\r\n", 5);
1118 handler.reply.send(handler.id, buf);
1119 handler.reply.send_end();
1126 case HandlerBase::cSTATS: handler.on_stats(params_str);
break;
1127 case HandlerBase::cQUIT:
return false;
1131 bool handled =
false;
1132 if (!handler.on_command(handled, command_str, params_str))
1135 reply(
"ERROR\r\n", 7);
1145 handler.on_error(err);
1148 #undef EVO_HELPER_HANDLER_END_DEFCHECK 1149 #undef EVO_HELPER_HANDLER_CASES 1150 #undef EVO_HELPER_HANDLER_DEFCHECK 1158 if (!handler.noreply) {
1159 String data_str(data, size);
1160 handler.reply.send(handler.id, data_str);
1161 handler.reply.send_end();
bool empty() const
Get whether empty.
void log_direct(LogLevel level, const SubString &msg)
Log a message with given log level directly without checking the current log level.
Definition: logger.h:423
Size size() const
Get size.
Definition: list.h:759
void deferred_reply_error(const SubString &msg)
Finish deferred response with an error.
Definition: memcached_server.h:151
General types used when implementing MemcachedClient or server callbacks.
Definition: memcached_common.h:23
ResponseType
Handler response type – used with ResponseResult.
Definition: ioasync_server.h:375
#define EVO_HELPER_HANDLER_END_DEFCHECK(EVENT_NAME)
Definition: memcached_server.h:807
Add value if not found.
Definition: memcached_server.h:44
Get server version.
Definition: memcached_server.h:60
bool token(StringT &value, char delim)
Extract next token from string.
Definition: substring.h:383
bool null() const
Get whether null.
Definition: type.h:318
#define EVO_HELPER_HANDLER_DEFCHECK(EVENT_NAME, EVENT_MSG_SUFFIX)
Definition: memcached_server.h:784
Set new value.
Definition: memcached_server.h:57
void deferred_reply_touch(bool success)
Finish touch request and report result.
Definition: memcached_server.h:236
T Handler
User defined handler type.
Definition: memcached_server.h:760
Get server stats.
Definition: memcached_server.h:58
void send_client_error(const SubString &msg)
Helper to send a client error response.
Definition: memcached_server.h:584
Not stored due to unmet condtion for append, prepend, add, or replace command.
Definition: memcached_common.h:38
Get value for compare and swap.
Definition: memcached_server.h:52
Decrement numeric value for key.
Definition: memcached_server.h:47
Handler::DeferredContext DeferredContext
Alias for Handler::DeferredContext.
Definition: memcached_server.h:763
bool noreply
Whether no-reply mode is enabled (set by parent protocol class)
Definition: memcached_server.h:288
virtual IncrementResult on_increment(DeferredContext &context, const SubString &key, uint64 count, bool decrement)
Called on INCR or DECR request to increment or decrement a numeric value.
Definition: memcached_server.h:374
virtual void on_stats(SubString ¶ms)
Called on STATS request for statistics.
Definition: memcached_server.h:531
LoggerPtr logger
Logger to use.
Definition: memcached_server.h:769
bool cas
Whether CAS is enabled, if true the handler must include a cas_id when sending response values with s...
Definition: memcached_server.h:125
Handler response result.
Definition: ioasync_server.h:389
AsyncBuffers buffers
Buffers for async I/O.
Definition: ioasync_server.h:496
uint32 flags
Flags to store, returned with GET.
Definition: memcached_server.h:88
static size_t get_max_initial_read()
Definition: memcached_server.h:298
void send_value(const SubString &key, const SubString &value, uint32 flags=0, uint64 *cas_id=NULL)
Helper to send value for get response.
Definition: memcached_server.h:633
Wraps a logger pointer that can reference a logger to use or be disabled.
Definition: logger.h:377
virtual StoreResult on_store(DeferredContext &context, StoreParams ¶ms, SubString &value, Command command, uint64 cas_id)
Called on STORE request to store a value.
Definition: memcached_server.h:344
Compare and swap
Definition: memcached_server.h:46
String tokenizer adapter used internally to create variants of existing tokenizers – do not use dire...
Definition: strtok.h:1401
DeferredContextT< MemcachedServerHandlerBase > DeferredContext
Deferred context helper – used by AsyncServer.
Definition: memcached_server.h:129
bool enable_cas
Derived constructor must set to true to enable "compare and swap" (gets/gats command) ...
Definition: memcached_server.h:290
Base class for user defined Memcached server handler.
Definition: memcached_server.h:38
Deferred but not the last part of this response.
Definition: ioasync_server.h:32
AsyncServer< This > Server
Server type.
Definition: memcached_server.h:762
evo::async::Memcached Memcached
Alias for evo::async::Memcached
Definition: memcached_server.h:39
String fixed-size buffer for formatting an integer.
Definition: string.h:54
virtual bool on_command(bool &handled, SubString &command_str, SubString ¶ms)
Called on any other command.
Definition: memcached_server.h:552
MemcachedServer< Handler > This
This type.
Definition: memcached_server.h:761
~DeferredReply()
Destructor.
Definition: memcached_server.h:141
Definition: ioasync_server.h:31
#define EVO_ENUM_MAP_PREFIXED(ENUM, PREFIX,...)
Helper for creating enum string/value mappers with prefixed enum values.
Definition: enum.h:219
void send_error(const SubString &msg)
Helper to send a server error response.
Definition: memcached_server.h:598
virtual void on_flush_all(ulong delay_sec)
Called on FLUSH_ALL request to expire all keys.
Definition: memcached_server.h:522
ulong size
Value size to store.
Definition: memcached_server.h:90
#define EVO_TOK_NEXT_OR_BREAK(TOK, DELIM)
Helper for tokenizing using a break-loop.
Definition: strtok.h:1854
Continue to on_get() events.
Definition: memcached_server.h:98
Size size() const
Get size.
Holds data for async I/O buffers (used internally with AsyncServer and protocol implementations).
Definition: ioasync_base.h:134
Quit command to close connection.
Definition: memcached_server.h:55
virtual void on_error(AsyncError err)
Called on error.
Definition: memcached_server.h:562
virtual ResponseType on_get_end(DeferredContext &context)
Called at end of GET request.
Definition: memcached_server.h:514
STORE command parameters.
Definition: memcached_server.h:86
ResultType result
Normal response result – ignored unless type=rtNORMAL
Definition: ioasync_server.h:393
Item not found, can't compare-and-swap (CAS command only)
Definition: memcached_common.h:37
Replace value if found.
Definition: memcached_server.h:56
ResponseResult< GeneralResultValue > DeleteResult
DELETE command result returned by on_delete()
Definition: memcached_server.h:111
Prepend to existing value.
Definition: memcached_server.h:54
Response writer used to group multiple writes together for best performance.
Definition: ioasync_server.h:43
const char * data() const
Get string pointer (const).
Definition: string.h:1533
uint32 StrSizeT
Default Evo string size type.
Definition: sys.h:734
ResponseResult< GetStartResultValue > GetStartResult
GET command result returned by on_get_start()
Definition: memcached_server.h:109
void send_reply(const SubString &msg)
Helper to send a reply message.
Definition: memcached_server.h:571
Base 10: decimal (default)
Definition: str.h:2323
String container.
Definition: string.h:674
virtual void on_version(String &version)
Called on VERSION request for server version.
Definition: memcached_server.h:540
ThisType & set()
Set as null.
Definition: string.h:99
T getnum(Error &error, int base=0) const
Convert to number value for given integer type.
Definition: substring.h:1351
Command
Command value.
Definition: memcached_server.h:42
uint64 cas_id
CAS ID – only used for CAS command.
Definition: memcached_server.h:91
String key
Key to store.
Definition: memcached_server.h:87
Unknown command (always first)
Definition: memcached_server.h:43
SubString & stripl()
Strip left (beginning) whitespace (spaces and tabs).
Definition: substring.h:1090
Get value and update expiratiom time.
Definition: memcached_server.h:49
SubString & stripr()
Strip right (ending) whitespace (spaces and tabs).
Definition: substring.h:1135
Async I/O server for receiving and handling requests.
Definition: ioasync_server.h:576
AsyncError
Async I/O error type.
Definition: ioasync_base.h:452
ThisType & add(const char *data, Size size)
Append additional data to buffer.
Definition: string.h:139
Append to existing value.
Definition: memcached_server.h:45
Skip on_get() events.
Definition: memcached_server.h:99
ResponseResult< Memcached::StoreResult > StoreResult
STORE command result returned by on_store()
Definition: memcached_server.h:108
GeneralResultValue
General result used by some commands.
Definition: memcached_server.h:103
Key not found.
Definition: memcached_server.h:105
bool read_fixed_helper(T &parent, SizeT &fixed_size, SizeT size, SizeT max_size=0, void *context=NULL)
Helper for reading fixed size data from read buffer from a ProtocolHandler on_read() event...
Definition: ioasync_base.h:345
Increment numeric value for key.
Definition: memcached_server.h:53
Item modified, interrupting compare-and-swap command (CAS command only)
Definition: memcached_common.h:36
#define EVO_HELPER_HANDLER_CASES(EVENT_NAME)
Definition: memcached_server.h:799
Get value for compare and swap and update expiratiom time.
Definition: memcached_server.h:50
ResponseResult< UInt64 > IncrementResult
INCR/DECR command result.
Definition: memcached_server.h:110
Handler::Global Global
Alias for Handler::Global.
Definition: memcached_server.h:764
Delete by key.
Definition: memcached_server.h:48
virtual DeleteResult on_delete(DeferredContext &context, const SubString &key)
Called on DELETE request to delete key and value.
Definition: memcached_server.h:399
char * data()
Get formatted string pointer.
Definition: string.h:85
static const int MAXSTRLEN
Max formatted length, including either sign or hex/octal prefix (0x/0), but not both.
Definition: type.h:987
LoggerPtr logger
Logger to use (set by AsyncServer)
Definition: memcached_server.h:287
Evo C++ Library namespace.
Definition: alg.h:11
Touch key by updating expiration time.
Definition: memcached_server.h:59
StoreResult
Memcached store command result.
Definition: memcached_common.h:34
Deferred reply helper – deferred event objects should hold or inherit this, and use to send deferred...
Definition: memcached_server.h:132
void read_flush()
Flush and consume next line from read buffer.
Definition: ioasync_base.h:413
Get value.
Definition: memcached_server.h:51
MemcachedServer(Global &global, Shared &shared, LoggerBase *logger)
Constructor to create server protocol instance.
Definition: memcached_server.h:777
Int64 expire
Expiration time in seconds from now, null if not updating expiration, 0 for no expiration, negative to expire now, or a value greater than 2592000 (30 days) means a Unix timestamp to expire on.
Definition: memcached_server.h:124
void deferred_reply_get(const SubString &key, const SubString &value, uint32 flags, uint64 *cas_id=NULL)
Send get request value for key.
Definition: memcached_server.h:263
bool enable_gat
Derived constructor must set to true to enable "get and touch" (gat/gats command) ...
Definition: memcached_server.h:289
Successfully stored.
Definition: memcached_common.h:39
bool read_line(SubString &data)
Read next line from read buffer.
Definition: ioasync_base.h:382
void deferred_reply_store(Memcached::StoreResult result)
Finish set/store request and report result.
Definition: memcached_server.h:171
Normal response.
Definition: ioasync_server.h:376
WriterFlags
Flags used with Writer.
Definition: ioasync_server.h:30
String & add(char ch)
Append character (modifier).
Definition: string.h:2741
Success.
Definition: memcached_server.h:104
void deferred_reply_delete(bool success)
Finish delete request and report result.
Definition: memcached_server.h:216
ResponseResult< GeneralResultValue > TouchResult
TOUCH command result returned by on_touch()
Definition: memcached_server.h:112
virtual ResponseType on_get(DeferredContext &context, const SubString &key, GetAdvParams *adv_params)
Called for each key in GET request.
Definition: memcached_server.h:491
Handler handler
Handler instance.
Definition: memcached_server.h:770
bool check(LogLevel level) const
Check whether a message with given level will actually be logged.
Definition: logger.h:418
MemcachedServerHandlerBase()
Constructor.
Definition: memcached_server.h:293
GetStartResultValue
GET command result from on_get_start().
Definition: memcached_server.h:97
bool on_read_fixed(SizeT &next_size, SubString &data, void *context)
Definition: memcached_server.h:813
int64 expire
Expiration time in seconds from now, 0 for no expiration, negative to expire now, or a value greater ...
Definition: memcached_server.h:89
bool split(char delim, T1 &left, T2 &right) const
Split at first occurrence of delimiter into left/right substrings.
Definition: substring.h:976
Response already sent so request is handled, use if error was sent.
Definition: ioasync_server.h:378
Implements Memcached protocol for an async server.
Definition: memcached_server.h:756
String & set()
Set as null and empty.
Definition: string.h:995
AsyncServerReply reply
Server reply manager, used to track deferred events and queue out of order replies.
Definition: ioasync_server.h:497
void deferred_reply_increment(UInt64 value)
Finish increment/decrement request and report result.
Definition: memcached_server.h:194
Handler::Shared Shared
Alias for Handler::Shared.
Definition: memcached_server.h:765
ResponseType type
Response type – see ResponseType.
Definition: ioasync_server.h:392
uint32 SizeT
Default Evo container size type.
Definition: sys.h:729
Reference and access existing string data.
Definition: substring.h:229
void send_stat(const SubString &name, const SubString &value)
Helper for sending statistics.
Definition: memcached_server.h:616
bool on_read(SizeT &fixed_size, AsyncBuffers &buffers, void *context)
Definition: memcached_server.h:852
Base class for Logger.
Definition: logger.h:273
Additional parameters for advanced GET request variants.
Definition: memcached_server.h:123
void on_error(AsyncError err)
Definition: memcached_server.h:1144
virtual TouchResult on_touch(DeferredContext &context, const SubString &key, int64 expire)
Called on TOUCH request to update expiration of existing key without retrieving the value...
Definition: memcached_server.h:423
Base async I/O server handler.
Definition: ioasync_server.h:282
Evo Async Memached API, common client/server types.
Size size() const
Get formatting string size.
Definition: string.h:93
StoreParams()
Definition: memcached_server.h:93
#define EVO_PARAM_UNUSED(NAME)
Mark function parameter as unused to suppress "unreferenced parameter" compiler warnings on it...
Definition: sys.h:427
const char * data() const
Get data pointer.
Enum guard value (always last)
Definition: memcached_server.h:61
DeferredReply(DeferredContext &context, ulong id)
Constructor.
Definition: memcached_server.h:137
String & reserve(Size size, bool prefer_realloc=false)
Reserve capacity for additional items (modifier).
Definition: string.h:5027
void deferred_reply_get_end()
Finish response for get request.
Definition: memcached_server.h:273
MemcachedServerHandlerBase HandlerBase
Alias for MemcachedServerHandlerBase.
Definition: memcached_server.h:767
virtual GetStartResult on_get_start(DeferredContext &context, const SubString &keys, GetAdvParams *adv_params)
Called at the beginning of a GET request with all requested keys.
Definition: memcached_server.h:459