29 function memcached_listener.ondisconnect(conn, err) |
29 function memcached_listener.ondisconnect(conn, err) |
30 end |
30 end |
31 |
31 |
32 --- Command handlers |
32 --- Command handlers |
33 |
33 |
34 function command_handlers.set(conn, params) |
34 local function generic_store_command(store_method, conn, params) |
35 local key, flags, exptime, bytes, reply = params:match("(%S+) (%d+) (%d+) (%d+) ?(.*)$"); |
35 local key, flags, exptime, bytes, reply = params:match("(%S+) (%d+) (%d+) (%d+) ?(.*)$"); |
36 flags, exptime, bytes, reply = tonumber(flags), tonumber(exptime), tonumber(bytes), reply ~= "noreply"; |
36 flags, exptime, bytes, reply = tonumber(flags), tonumber(exptime), tonumber(bytes), reply ~= "noreply"; |
37 if not (flags and exptime and bytes) then |
37 if not (flags and exptime and bytes) then |
38 if reply then |
38 if reply then |
39 return false, "Invalid parameter(s)"; |
39 return false, "Invalid parameter(s)"; |
47 log("debug", "Received data of length "..#data.." out of "..bytes); |
47 log("debug", "Received data of length "..#data.." out of "..bytes); |
48 received_count = received_count + #data; |
48 received_count = received_count + #data; |
49 received_buffer[#received_buffer+1] = data; |
49 received_buffer[#received_buffer+1] = data; |
50 if received_count >= bytes then |
50 if received_count >= bytes then |
51 received_buffer = table.concat(received_buffer); |
51 received_buffer = table.concat(received_buffer); |
52 local ok, err = cache:set(key, flags, exptime, received_buffer:sub(1,bytes)); |
52 local ok, err = store_method(cache, key, flags, exptime, received_buffer:sub(1,bytes)); |
53 if reply then |
53 if reply then |
54 if ok then |
54 if ok then |
55 conn:send("STORED\r\n"); |
55 if err == true then |
|
56 conn:send("STORED\r\n"); |
|
57 else |
|
58 conn:send("NOT_STORED\r\n"); |
|
59 end |
56 else |
60 else |
57 conn:send("SERVER_ERROR "..(err or "Unknown error").."\r\n"); |
61 conn:send("SERVER_ERROR "..(err or "Unknown error").."\r\n"); |
58 end |
62 end |
59 end |
63 end |
60 conn:setlistener(memcached_listener); |
64 conn:setlistener(memcached_listener); |
69 onincoming = handle_data; |
73 onincoming = handle_data; |
70 ondisconnect = memcached_listener.ondisconnect; |
74 ondisconnect = memcached_listener.ondisconnect; |
71 }); |
75 }); |
72 log("debug", "Waiting for "..bytes.." bytes from client"); |
76 log("debug", "Waiting for "..bytes.." bytes from client"); |
73 return true; |
77 return true; |
|
78 end |
|
79 |
|
80 function command_handlers.set(conn, params) |
|
81 return generic_store_command(cache.set, conn, params); |
|
82 end |
|
83 |
|
84 function command_handlers.add(conn, params) |
|
85 return generic_store_command(cache.add, conn, params); |
|
86 end |
|
87 |
|
88 function command_handlers.replace(conn, params) |
|
89 return generic_store_command(cache.replace, conn, params); |
74 end |
90 end |
75 |
91 |
76 function command_handlers.get(conn, keys) |
92 function command_handlers.get(conn, keys) |
77 for key in keys:gmatch("%S+") do |
93 for key in keys:gmatch("%S+") do |
78 local flags, data = cache:get(key); |
94 local flags, data = cache:get(key); |