]> jfr.im git - irc/quakenet/newserv.git/blame - lua/lib/memcache.lua
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / lua / lib / memcache.lua
CommitLineData
4ce637de
CP
1require("lib/scheduler")
2
3Memcache = class(function(obj, ip, port, handler)
4 obj.ip = ip
5 obj.port = port
6 obj.handler = handler
7 obj._state = 0
8 obj._sched = Scheduler()
9 obj._connect(obj)
10end)
11
12function Memcache:put(key, value)
13 if self._state ~= 2 then
14 return false
15 end
16
17 self:_send("set", key, "0", "0", #value, "noreply")
18 self:_send(value)
19 return true
20end
21
22function Memcache:delete(key)
23 if self._state ~= 2 then
24 return false
25 end
26
27 self:_send("delete", key, "0", "noreply")
28 return true
29end
30
31function Memcache:flush_all()
32 if self._state ~= 2 then
33 return false
34 end
35
36 self:_send("flush_all", "noreply")
37 return true
38end
39
40function Memcache:_send(...)
41 local data = { ... }
42
43 data = table.concat(data, " ")
44 self:_log("send " .. data)
45 if self._state ~= 2 then
46 self:_log("send in bad state")
47 return
48 end
49
50 socket_write(self._socket, data .. "\r\n")
51end
52
53function Memcache:_event(socket, event, tag, ...)
54 self:_log("socket event: " .. event)
55 if event == "connect" then
56 self._state = 2
57 self.handler("connect")
58 elseif event == "close" then
59 self._state = 0
60 self._socket = nil
61 self.handler("disconnect")
62 self:_schedule_connect()
63 elseif event == "read" then
64 local data = ...
65 self:_log("read: " .. data:gsub("\r\n", "\\r\\n"))
66 end
67end
68
69function Memcache:_connect()
70 self:_log("connect(ip=" .. self.ip .. " port=" .. self.port .. ") state=" .. self._state)
71 if self._state ~= 0 then
72 return
73 end
74
75 self._socket = socket_tcp_connect(self.ip, self.port, function(...) self:_event(...) end, self)
76 if not self._socket then
77 self:_schedule_connect()
78 return
79 end
80 self._state = 1
81 self:_log("connect() state=" .. self._state .. " s ==" .. self._socket)
82end
83
84function Memcache:_schedule_connect()
85 self._sched:add(5, function() self:_connect() end)
86end
87
88function Memcache:_log(data)
89-- chanmsg(data)
90end
91