Software /
code /
prosody
Annotate
plugins/storage/ejabberdstore.lib.lua @ 4044:61ae809da8ee
mod_storage_sql: Dynamically replace backquotes with double quotes when connecting to PostgreSQL...
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Mon, 27 Dec 2010 06:10:35 +0500 |
parent | 2678:c5882e2e12b5 |
rev | line source |
---|---|
2678
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
1 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
2 local handlers = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
3 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 handlers.accounts = { |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
5 get = function(self, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
6 local select = self:query("select password from users where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
7 local row = select and select:fetch(); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 if row then return { password = row[1] }; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 set = function(self, user, data) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
11 if data and data.password then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
12 return self:modify("update users set password=? where username=?", data.password, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
13 or self:modify("insert into users (username, password) values (?, ?)", user, data.password); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 else |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 return self:modify("delete from users where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 handlers.vcard = { |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 get = function(self, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 local select = self:query("select vcard from vcard where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 local row = select and select:fetch(); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 if row then return parse_xml(row[1]); end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 set = function(self, user, data) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
26 if data then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
27 data = unparse_xml(data); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 return self:modify("update vcard set vcard=? where username=?", data, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 or self:modify("insert into vcard (username, vcard) values (?, ?)", user, data); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 else |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 return self:modify("delete from vcard where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 handlers.private = { |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
36 get = function(self, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
37 local select = self:query("select namespace,data from private_storage where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 if select then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
39 local data = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
40 for row in select:rows() do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 data[row[1]] = parse_xml(row[2]); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 return data; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
45 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
46 set = function(self, user, data) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 if data then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 self:modify("delete from private_storage where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 for namespace,text in pairs(data) do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
50 self:modify("insert into private_storage (username, namespace, data) values (?, ?, ?)", user, namespace, unparse_xml(text)); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
51 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
52 return true; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
53 else |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
54 return self:modify("delete from private_storage where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
56 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 -- TODO map_set, map_get |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
58 }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
59 local subscription_map = { N = "none", B = "both", F = "from", T = "to" }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
60 local subscription_map_reverse = { none = "N", both = "B", from = "F", to = "T" }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
61 handlers.roster = { |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
62 get = function(self, user) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
63 local select = self:query("select jid,nick,subscription,ask,server,subscribe,type from rosterusers where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
64 if select then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
65 local roster = { pending = {} }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
66 for row in select:rows() do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
67 local jid,nick,subscription,ask,server,subscribe,typ = unpack(row); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
68 local item = { groups = {} }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
69 if nick == "" then nick = nil; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 item.nick = nick; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 item.subscription = subscription_map[subscription]; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
72 if ask == "N" then ask = nil; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
73 elseif ask == "O" then ask = "subscribe" |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
74 elseif ask == "I" then roster.pending[jid] = true; ask = nil; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
75 elseif ask == "B" then roster.pending[jid] = true; ask = "subscribe"; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
76 else module:log("debug", "bad roster_item.ask: %s", ask); ask = nil; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
77 item.ask = ask; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
78 roster[jid] = item; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
79 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
80 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
81 select = self:query("select jid,grp from rostergroups where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
82 if select then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
83 for row in select:rows() do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
84 local jid,grp = unpack(rows); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
85 if roster[jid] then roster[jid].groups[grp] = true; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
86 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
87 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
88 select = self:query("select version from roster_version where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
89 local row = select and select:fetch(); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
90 if row then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
91 roster[false] = { version = row[1]; }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
92 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
93 return roster; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
94 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
95 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
96 set = function(self, user, data) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
97 if data and next(data) ~= nil then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
98 self:modify("delete from rosterusers where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
99 self:modify("delete from rostergroups where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
100 self:modify("delete from roster_version where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
101 local done = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
102 local pending = data.pending or {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
103 for jid,item in pairs(data) do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
104 if jid and jid ~= "pending" then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
105 local subscription = subscription_map_reverse[item.subscription]; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
106 local ask; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
107 if pending[jid] then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
108 if item.ask then ask = "B"; else ask = "I"; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
109 else |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
110 if item.ask then ask = "O"; else ask = "N"; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
111 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
112 local r = self:modify("insert into rosterusers (username,jid,nick,subscription,ask,askmessage,server,subscribe) values (?, ?, ?, ?, ?, '', '', '')", user, jid, item.nick or "", subscription, ask); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
113 if not r then module:log("debug", "--- :( %s", tostring(r)); end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
114 done[jid] = true; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
115 for group in pairs(item.groups) do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
116 self:modify("insert into rostergroups (username,jid,grp) values (?, ?, ?)", user, jid, group); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
117 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
118 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
119 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
120 for jid in pairs(pending) do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
121 if not done[jid] then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
122 self:modify("insert into rosterusers (username,jid,nick,subscription,ask,askmessage,server,subscribe) values (?, ?, ?, ?, ?. ''. ''. '')", user, jid, "", "N", "I"); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
123 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
124 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
125 local version = data[false] and data[false].version; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
126 if version then |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
127 self:modify("insert into roster_version (username,version) values (?, ?)", user, version); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
128 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
129 return true; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
130 else |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
131 self:modify("delete from rosterusers where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
132 self:modify("delete from rostergroups where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
133 self:modify("delete from roster_version where username=?", user); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
134 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
135 end; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
136 }; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
137 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 ----------------------------- |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
139 local driver = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 driver.__index = driver; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
141 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
142 function driver:prepare(sql) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
143 module:log("debug", "query: %s", sql); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
144 local err; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
145 if not self.sqlcache then self.sqlcache = {}; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
146 local r = self.sqlcache[sql]; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
147 if r then return r; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
148 r, err = self.database:prepare(sql); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
149 if not r then error("Unable to prepare SQL statement: "..err); end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
150 self.sqlcache[sql] = r; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
151 return r; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
152 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
153 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
154 function driver:query(sql, ...) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
155 local stmt = self:prepare(sql); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
156 if stmt:execute(...) then return stmt; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
157 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
158 function driver:modify(sql, ...) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
159 local stmt = self:query(sql, ...); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
160 if stmt and stmt:affected() > 0 then return stmt; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
161 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
162 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
163 function driver:open(host, datastore, typ) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
164 local cache_key = host.." "..datastore; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
165 if self.ds_cache[cache_key] then return self.ds_cache[cache_key]; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
166 local instance = setmetatable({}, self); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
167 instance.host = host; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
168 instance.datastore = datastore; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
169 local handler = handlers[datastore]; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
170 if not handler then return nil; end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
171 for key,val in pairs(handler) do |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
172 instance[key] = val; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
173 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
174 if instance.init then instance:init(); end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
175 self.ds_cache[cache_key] = instance; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
176 return instance; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
177 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
178 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
179 ----------------------------- |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
180 local _M = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
181 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
182 function _M.new(dbtype, dbname, ...) |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
183 local instance = setmetatable({}, driver); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
184 instance.__index = instance; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
185 instance.database = get_database(dbtype, dbname, ...); |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
186 instance.ds_cache = {}; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
187 return instance; |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
188 end |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
189 |
c5882e2e12b5
mod_storage, plus a bit of SQL and XML.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
190 return _M; |