util/datamanager.lua
author Waqas Hussain <waqas20@gmail.com>
Fri, 28 Nov 2008 20:17:20 +0500
changeset 452 613c5c6bdce4
parent 267 6303b7454ad0
child 456 27cb85d4059e
permissions -rw-r--r--
Added option core.data_path
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     1
local format = string.format;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     2
local setmetatable, type = setmetatable, type;
247
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
     3
local pairs, ipairs = pairs, ipairs;
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     4
local char = string.char;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     5
local loadfile, setfenv, pcall = loadfile, setfenv, pcall;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     6
local log = log;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
     7
local io_open = io.open;
206
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
     8
local os_remove = os.remove;
267
6303b7454ad0 Some bugs fixed
Waqas Hussain <waqas20@gmail.com>
parents: 247
diff changeset
     9
local tostring, tonumber = tostring, tonumber;
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 129
diff changeset
    10
local error = error;
206
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
    11
local next = next;
247
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
    12
local t_insert = table.insert;
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    13
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    14
local indent = function(f, i)
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    15
	for n = 1, i do
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    16
		f:write("\t");
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    17
	end
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    18
end
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    19
452
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    20
local data_path = "data";
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    21
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    22
module "datamanager"
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    23
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    24
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    25
---- utils -----
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    26
local encode, decode;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    27
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    28
local log = function (type, msg) return log(type, "datamanager", msg); end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    29
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    30
do 
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    31
	local urlcodes = setmetatable({}, { __index = function (t, k) t[k] = char(tonumber("0x"..k)); return t[k]; end });
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    32
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    33
	decode = function (s)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    34
		return s and (s:gsub("+", " "):gsub("%%([a-fA-F0-9][a-fA-F0-9])", urlcodes));
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    35
	end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    36
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    37
	encode = function (s)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    38
		return s and (s:gsub("%W", function (c) return format("%%%x", c:byte()); end));
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    39
	end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    40
end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    41
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    42
local function basicSerialize (o)
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    43
	if type(o) == "number" or type(o) == "boolean" then
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    44
		return tostring(o);
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    45
	else -- assume it is a string -- FIXME make sure it's a string. throw an error otherwise.
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    46
		return (format("%q", tostring(o)):gsub("\\\n", "\\n"));
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    47
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    48
end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    49
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    50
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    51
local function simplesave (f, o, ind)
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    52
	if type(o) == "number" then
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    53
		f:write(o)
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    54
	elseif type(o) == "string" then
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    55
		f:write((format("%q", o):gsub("\\\n", "\\n")))
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    56
	elseif type(o) == "table" then
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    57
		f:write("{\n")
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    58
		for k,v in pairs(o) do
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    59
			indent(f, ind);
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    60
			f:write("[", basicSerialize(k), "] = ")
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    61
			simplesave(f, v, ind+1)
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    62
			f:write(",\n")
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    63
		end
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    64
		indent(f, ind-1);
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    65
		f:write("}")
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    66
	elseif type(o) == "boolean" then
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    67
		f:write(o and "true" or "false");
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    68
	else
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    69
		error("cannot serialize a " .. type(o))
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    70
	end
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    71
end
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    72
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    73
------- API -------------
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    74
452
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    75
function set_data_path(path)
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    76
	data_path = path;
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    77
end
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    78
247
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
    79
function getpath(username, host, datastore, ext)
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
    80
	ext = ext or "dat";
84
d0a0bac6815e Added: Datastore support for hosts and global data in addition to users
Waqas Hussain <waqas20@gmail.com>
parents: 0
diff changeset
    81
	if username then
452
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    82
		return format("%s/%s/%s/%s.%s", data_path, encode(host), datastore, encode(username), ext);
84
d0a0bac6815e Added: Datastore support for hosts and global data in addition to users
Waqas Hussain <waqas20@gmail.com>
parents: 0
diff changeset
    83
	elseif host then
452
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    84
		return format("%s/%s/%s.%s", data_path, encode(host), datastore, ext);
84
d0a0bac6815e Added: Datastore support for hosts and global data in addition to users
Waqas Hussain <waqas20@gmail.com>
parents: 0
diff changeset
    85
	else
452
613c5c6bdce4 Added option core.data_path
Waqas Hussain <waqas20@gmail.com>
parents: 267
diff changeset
    86
		return format("%s/%s.%s", data_path, datastore, ext);
84
d0a0bac6815e Added: Datastore support for hosts and global data in addition to users
Waqas Hussain <waqas20@gmail.com>
parents: 0
diff changeset
    87
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    88
end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    89
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    90
function load(username, host, datastore)
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    91
	local data, ret = loadfile(getpath(username, host, datastore));
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
    92
	if not data then
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    93
		log("warn", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
    94
		return nil;
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
    95
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    96
	setfenv(data, {});
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
    97
	local success, ret = pcall(data);
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
    98
	if not success then
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
    99
		log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
   100
		return nil;
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
   101
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   102
	return ret;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   103
end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   104
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   105
function store(username, host, datastore, data)
206
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   106
	if not data then
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   107
		data = {};
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   108
	end
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   109
	-- save the datastore
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   110
	local f, msg = io_open(getpath(username, host, datastore), "w+");
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
   111
	if not f then
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
   112
		log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
206
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   113
		return;
117
8e5c5e6a3240 Fixed: datamanager.store and datamanager.load could crash when username or host arguments were nil. (useful for server specific and global data).
Waqas Hussain <waqas20@gmail.com>
parents: 88
diff changeset
   114
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   115
	f:write("return ");
182
f5cb6b5a6eb7 Datamanager Fixes and improvements
Waqas Hussain <waqas20@gmail.com>
parents: 177
diff changeset
   116
	simplesave(f, data, 1);
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   117
	f:close();
206
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   118
	if not next(data) then -- try to delete empty datastore
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   119
		os_remove(getpath(username, host, datastore));
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   120
	end
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   121
	-- we write data even when we are deleting because lua doesn't have a
e30d0e30a0ff Datamanager now deletes files with no data
Waqas Hussain <waqas20@gmail.com>
parents: 182
diff changeset
   122
	-- platform independent way of checking for non-exisitng files
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   123
	return true;
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   124
end
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   125
247
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   126
function list_append(username, host, datastore, data)
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   127
	if not data then return; end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   128
	-- save the datastore
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   129
	local f, msg = io_open(getpath(username, host, datastore, "list"), "a+");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   130
	if not f then
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   131
		log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   132
		return;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   133
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   134
	f:write("item(");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   135
	simplesave(f, data, 1);
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   136
	f:write(");\n");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   137
	f:close();
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   138
	return true;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   139
end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   140
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   141
function list_store(username, host, datastore, data)
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   142
	if not data then
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   143
		data = {};
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   144
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   145
	-- save the datastore
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   146
	local f, msg = io_open(getpath(username, host, datastore, "list"), "w+");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   147
	if not f then
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   148
		log("error", "Unable to write to "..datastore.." storage ('"..msg.."') for user: "..(username or "nil").."@"..(host or "nil"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   149
		return;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   150
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   151
	for _, d in ipairs(data) do
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   152
		f:write("item(");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   153
		simplesave(f, d, 1);
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   154
		f:write(");\n");
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   155
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   156
	f:close();
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   157
	if not next(data) then -- try to delete empty datastore
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   158
		os_remove(getpath(username, host, datastore, "list"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   159
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   160
	-- we write data even when we are deleting because lua doesn't have a
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   161
	-- platform independent way of checking for non-exisitng files
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   162
	return true;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   163
end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   164
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   165
function list_load(username, host, datastore)
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   166
	local data, ret = loadfile(getpath(username, host, datastore, "list"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   167
	if not data then
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   168
		log("warn", "Failed to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   169
		return nil;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   170
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   171
	local items = {};
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   172
	setfenv(data, {item = function(i) t_insert(items, i); end});
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   173
	local success, ret = pcall(data);
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   174
	if not success then
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   175
		log("error", "Unable to load "..datastore.." storage ('"..ret.."') for user: "..(username or "nil").."@"..(host or "nil"));
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   176
		return nil;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   177
	end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   178
	return items;
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   179
end
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   180
681b29aa134f Added support for storing (and removing), loading and appending to lists of data to datamanager (for supporting offline messages)
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
   181
return _M;