Software / code / prosody
Comparison
plugins/mod_storage_sql.lua @ 7274:e0727512bb99
mod_storage_sql: Allow loops over results to end on their own
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 13 Mar 2016 17:43:33 +0100 |
| parent | 7273:7e659f87973d |
| child | 7305:c02e3d8f23fc |
comparison
equal
deleted
inserted
replaced
| 7273:7e659f87973d | 7274:e0727512bb99 |
|---|---|
| 131 local map_store = {}; | 131 local map_store = {}; |
| 132 map_store.__index = map_store; | 132 map_store.__index = map_store; |
| 133 map_store.remove = {}; | 133 map_store.remove = {}; |
| 134 function map_store:get(username, key) | 134 function map_store:get(username, key) |
| 135 local ok, result = engine:transaction(function() | 135 local ok, result = engine:transaction(function() |
| 136 local data; | |
| 136 if type(key) == "string" and key ~= "" then | 137 if type(key) == "string" and key ~= "" then |
| 137 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, key) do | 138 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, key) do |
| 138 return deserialize(row[1], row[2]); | 139 data = deserialize(row[1], row[2]); |
| 139 end | 140 end |
| 141 return data; | |
| 140 else | 142 else |
| 141 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, "") do | 143 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, "") do |
| 142 local data = deserialize(row[1], row[2]); | 144 data = deserialize(row[1], row[2]); |
| 143 return data and data[key] or nil; | 145 end |
| 144 end | 146 return data and data[key] or nil; |
| 145 end | 147 end |
| 146 end); | 148 end); |
| 147 if not ok then return nil, result; end | 149 if not ok then return nil, result; end |
| 148 return result; | 150 return result; |
| 149 end | 151 end |
| 163 end | 165 end |
| 164 else | 166 else |
| 165 local extradata = {}; | 167 local extradata = {}; |
| 166 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, "") do | 168 for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=? LIMIT 1", host, username or "", self.store, "") do |
| 167 extradata = deserialize(row[1], row[2]); | 169 extradata = deserialize(row[1], row[2]); |
| 168 break; | |
| 169 end | 170 end |
| 170 engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", | 171 engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", |
| 171 host, username or "", self.store, ""); | 172 host, username or "", self.store, ""); |
| 172 extradata[key] = data; | 173 extradata[key] = data; |
| 173 local t, value = assert(serialize(extradata)); | 174 local t, value = assert(serialize(extradata)); |
| 258 | 259 |
| 259 -- Total matching | 260 -- Total matching |
| 260 if query.total then | 261 if query.total then |
| 261 local stats = engine:select("SELECT COUNT(*) FROM `prosodyarchive` WHERE " .. t_concat(where, " AND "), unpack(args)); | 262 local stats = engine:select("SELECT COUNT(*) FROM `prosodyarchive` WHERE " .. t_concat(where, " AND "), unpack(args)); |
| 262 if stats then | 263 if stats then |
| 263 local _total = stats() | 264 for row in stats do |
| 264 total = _total and _total[1]; | 265 total = row[1]; |
| 266 end | |
| 265 end | 267 end |
| 266 if query.limit == 0 then -- Skip the real query | 268 if query.limit == 0 then -- Skip the real query |
| 267 return noop, total; | 269 return noop, total; |
| 268 end | 270 end |
| 269 end | 271 end |