mooncached.lua

changeset 17
5bede08f2f55
parent 13
db66a09dc0b6
child 19
61c4d7f8279c
equal deleted inserted replaced
16:906615e293de 17:5bede08f2f55
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);

mercurial