Changeset

247:681b29aa134f

Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
author Waqas Hussain <waqas20@gmail.com>
date Thu, 13 Nov 2008 12:10:42 +0500
parents 246:0904fd197cbe
children 248:8ce9559d501a
files util/datamanager.lua
diffstat 1 files changed, 63 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/util/datamanager.lua	Thu Nov 13 12:07:53 2008 +0500
+++ b/util/datamanager.lua	Thu Nov 13 12:10:42 2008 +0500
@@ -1,6 +1,6 @@
 local format = string.format;
 local setmetatable, type = setmetatable, type;
-local pairs = pairs;
+local pairs, ipairs = pairs, ipairs;
 local char = string.char;
 local loadfile, setfenv, pcall = loadfile, setfenv, pcall;
 local log = log;
@@ -9,6 +9,7 @@
 local tostring = tostring;
 local error = error;
 local next = next;
+local t_insert = table.insert;
 
 local indent = function(f, i)
 	for n = 1, i do
@@ -69,13 +70,14 @@
 
 ------- API -------------
 
-function getpath(username, host, datastore)
+function getpath(username, host, datastore, ext)
+	ext = ext or "dat";
 	if username then
-		return format("data/%s/%s/%s.dat", encode(host), datastore, encode(username));
+		return format("data/%s/%s/%s.%s", encode(host), datastore, encode(username), ext);
 	elseif host then
-		return format("data/%s/%s.dat", encode(host), datastore);
+		return format("data/%s/%s.%s", encode(host), datastore, ext);
 	else
-		return format("data/%s.dat", datastore);
+		return format("data/%s.%s", datastore, ext);
 	end
 end
 
@@ -115,4 +117,59 @@
 	return true;
 end
 
-return _M;
\ No newline at end of file
+function list_append(username, host, datastore, data)
+	if not data then return; end
+	-- save the datastore
+	local f, msg = io_open(getpath(username, host, datastore, "list"), "a+");
+	if not f then
+		log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
+		return;
+	end
+	f:write("item(");
+	simplesave(f, data, 1);
+	f:write(");\n");
+	f:close();
+	return true;
+end
+
+function list_store(username, host, datastore, data)
+	if not data then
+		data = {};
+	end
+	-- save the datastore
+	local f, msg = io_open(getpath(username, host, datastore, "list"), "w+");
+	if not f then
+		log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
+		return;
+	end
+	for _, d in ipairs(data) do
+		f:write("item(");
+		simplesave(f, d, 1);
+		f:write(");\n");
+	end
+	f:close();
+	if not next(data) then -- try to delete empty datastore
+		os_remove(getpath(username, host, datastore, "list"));
+	end
+	-- we write data even when we are deleting because lua doesn't have a
+	-- platform independent way of checking for non-exisitng files
+	return true;
+end
+
+function list_load(username, host, datastore)
+	local data, ret = loadfile(getpath(username, host, datastore, "list"));
+	if not data then
+		log("warn", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
+		return nil;
+	end
+	local items = {};
+	setfenv(data, {item = function(i) t_insert(items, i); end});
+	local success, ret = pcall(data);
+	if not success then
+		log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
+		return nil;
+	end
+	return items;
+end
+
+return _M;