util/datamanager.lua
changeset 5021 85b2689dbcfe
parent 4452 7de17ca4de14
child 5024 d25e1b9332cc
equal deleted inserted replaced
5020:ef1eb65acbba 5021:85b2689dbcfe
     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