9 |
9 |
10 local format = string.format; |
10 local format = string.format; |
11 local setmetatable, type = setmetatable, type; |
11 local setmetatable, type = setmetatable, type; |
12 local pairs, ipairs = pairs, ipairs; |
12 local pairs, ipairs = pairs, ipairs; |
13 local char = string.char; |
13 local char = string.char; |
14 local loadfile, setfenv, pcall = loadfile, setfenv, pcall; |
14 local pcall = pcall; |
15 local log = require "util.logger".init("datamanager"); |
15 local log = require "util.logger".init("datamanager"); |
16 local io_open = io.open; |
16 local io_open = io.open; |
17 local os_remove = os.remove; |
17 local os_remove = os.remove; |
18 local tostring, tonumber = tostring, tonumber; |
18 local tostring, tonumber = tostring, tonumber; |
19 local error = error; |
19 local error = error; |
20 local next = next; |
20 local next = next; |
21 local t_insert = table.insert; |
21 local t_insert = table.insert; |
22 local append = require "util.serialization".append; |
22 local append = require "util.serialization".append; |
|
23 local envloadfile = require"util.envload".envloadfile; |
23 local path_separator = assert ( package.config:match ( "^([^\n]+)" ) , "package.config not in standard form" ) -- Extract directory seperator from package.config (an undocumented string that comes with lua) |
24 local path_separator = assert ( package.config:match ( "^([^\n]+)" ) , "package.config not in standard form" ) -- Extract directory seperator from package.config (an undocumented string that comes with lua) |
24 local lfs = require "lfs"; |
25 local lfs = require "lfs"; |
25 local prosody = prosody; |
26 local prosody = prosody; |
26 local raw_mkdir; |
27 local raw_mkdir; |
27 |
28 |
109 return format("%s/%s.%s", data_path, datastore, ext); |
110 return format("%s/%s.%s", data_path, datastore, ext); |
110 end |
111 end |
111 end |
112 end |
112 |
113 |
113 function load(username, host, datastore) |
114 function load(username, host, datastore) |
114 local data, ret = loadfile(getpath(username, host, datastore)); |
115 local data, ret = envloadfile(getpath(username, host, datastore), {}); |
115 if not data then |
116 if not data then |
116 local mode = lfs.attributes(getpath(username, host, datastore), "mode"); |
117 local mode = lfs.attributes(getpath(username, host, datastore), "mode"); |
117 if not mode then |
118 if not mode then |
118 log("debug", "Assuming empty "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
119 log("debug", "Assuming empty "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
119 return nil; |
120 return nil; |
121 -- TODO more detailed error checking and logging? |
122 -- TODO more detailed error checking and logging? |
122 log("error", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
123 log("error", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
123 return nil, "Error reading storage"; |
124 return nil, "Error reading storage"; |
124 end |
125 end |
125 end |
126 end |
126 setfenv(data, {}); |
127 |
127 local success, ret = pcall(data); |
128 local success, ret = pcall(data); |
128 if not success then |
129 if not success then |
129 log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
130 log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
130 return nil, "Error reading storage"; |
131 return nil, "Error reading storage"; |
131 end |
132 end |
201 -- platform independent way of checking for non-exisitng files |
202 -- platform independent way of checking for non-exisitng files |
202 return true; |
203 return true; |
203 end |
204 end |
204 |
205 |
205 function list_load(username, host, datastore) |
206 function list_load(username, host, datastore) |
206 local data, ret = loadfile(getpath(username, host, datastore, "list")); |
207 local items = {}; |
|
208 local data, ret = envloadfile(getpath(username, host, datastore, "list"), {item = function(i) t_insert(items, i); end}); |
207 if not data then |
209 if not data then |
208 local mode = lfs.attributes(getpath(username, host, datastore, "list"), "mode"); |
210 local mode = lfs.attributes(getpath(username, host, datastore, "list"), "mode"); |
209 if not mode then |
211 if not mode then |
210 log("debug", "Assuming empty "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
212 log("debug", "Assuming empty "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
211 return nil; |
213 return nil; |
213 -- TODO more detailed error checking and logging? |
215 -- TODO more detailed error checking and logging? |
214 log("error", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
216 log("error", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
215 return nil, "Error reading storage"; |
217 return nil, "Error reading storage"; |
216 end |
218 end |
217 end |
219 end |
218 local items = {}; |
220 |
219 setfenv(data, {item = function(i) t_insert(items, i); end}); |
|
220 local success, ret = pcall(data); |
221 local success, ret = pcall(data); |
221 if not success then |
222 if not success then |
222 log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
223 log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil")); |
223 return nil, "Error reading storage"; |
224 return nil, "Error reading storage"; |
224 end |
225 end |