util/serialization.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Feb 2018 15:30:00 +0000
changeset 8531 67311cda0625
parent 6780 5de6b93d0190
child 8558 4f0f5b49bb03
permissions -rw-r--r--
net.server_select: Better detection of errors for outgoing connections On connection failure, a socket is marked readable and writable. So to detect initial connection failures (connection refused, etc.) we now watch for sockets becoming readable during initial connection, and also read from readable sockets before writing to writable sockets. This should fix 'onconnect' being called for outgoing connections that actually failed.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1135
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2222
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2222
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5021
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     6
-- COPYING file in the source package for more information.
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
--
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
local string_rep = string.rep;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
local type = type;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local tostring = tostring;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
local t_insert = table.insert;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
local t_concat = table.concat;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
local pairs = pairs;
2148
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    15
local next = next;
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
3736
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    17
local pcall = pcall;
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    18
1107
ebda1845ebc1 util.serialization: Log a warning when trying to serialize something we can't
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    19
local debug_traceback = debug.traceback;
ebda1845ebc1 util.serialization: Log a warning when trying to serialize something we can't
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
    20
local log = require "util.logger".init("serialization");
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 3745
diff changeset
    21
local envload = require"util.envload".envload;
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 3745
diff changeset
    22
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    23
local _ENV = nil;
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
local indent = function(i)
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
	return string_rep("\t", i);
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
local function basicSerialize (o)
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
	if type(o) == "number" or type(o) == "boolean" then
3745
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    30
		-- no need to check for NaN, as that's not a valid table index
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    31
		if o == 1/0 then return "(1/0)";
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    32
		elseif o == -1/0 then return "(-1/0)";
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    33
		else return tostring(o); end
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
	else -- assume it is a string -- FIXME make sure it's a string. throw an error otherwise.
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
		return (("%q"):format(tostring(o)):gsub("\\\n", "\\n"));
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
	end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
local function _simplesave(o, ind, t, func)
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
	if type(o) == "number" then
3745
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    40
		if o ~= o then func(t, "(0/0)");
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    41
		elseif o == 1/0 then func(t, "(1/0)");
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    42
		elseif o == -1/0 then func(t, "(-1/0)");
87f6eabd90c9 util.serialization: Proper serialization of Infinity, -Infinity and NaN.
Waqas Hussain <waqas20@gmail.com>
parents: 3736
diff changeset
    43
		else func(t, tostring(o)); end
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
	elseif type(o) == "string" then
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
		func(t, (("%q"):format(o):gsub("\\\n", "\\n")));
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
	elseif type(o) == "table" then
2222
81b4e738e4d3 util.serialization: Correctly serialize tables with 'false' as a key, fixes an issue with rosters not saving (thanks mathias, Tobias)
Matthew Wild <mwild1@gmail.com>
parents: 2149
diff changeset
    47
		if next(o) ~= nil then
2148
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    48
			func(t, "{\n");
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    49
			for k,v in pairs(o) do
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    50
				func(t, indent(ind));
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    51
				func(t, "[");
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    52
				func(t, basicSerialize(k));
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    53
				func(t, "] = ");
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    54
				if ind == 0 then
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    55
					_simplesave(v, 0, t, func);
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    56
				else
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    57
					_simplesave(v, ind+1, t, func);
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    58
				end
2149
603134825bdb util.serialization: Replaced commas with semi-colons between table fields.
Waqas Hussain <waqas20@gmail.com>
parents: 2148
diff changeset
    59
				func(t, ";\n");
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
			end
2148
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    61
			func(t, indent(ind-1));
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    62
			func(t, "}");
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    63
		else
5590c13552ab util.serialization: Concise output for empty tables.
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
    64
			func(t, "{}");
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
		end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
	elseif type(o) == "boolean" then
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
		func(t, (o and "true" or "false"));
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
	else
1128
b2e548344d61 util.serialization: Write nil for non-serializable data types, and bump the log level to 'error'
Matthew Wild <mwild1@gmail.com>
parents: 1107
diff changeset
    69
		log("error", "cannot serialize a %s: %s", type(o), debug_traceback())
1135
355f9487ab38 util/serialization: Fixed serialization formatting
Waqas Hussain <waqas20@gmail.com>
parents: 1128
diff changeset
    70
		func(t, "nil");
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
	end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    74
local function append(t, o)
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
	_simplesave(o, 1, t, t.write or t_insert);
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
	return t;
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    79
local function serialize(o)
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
	return t_concat(append({}, o));
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    83
local function deserialize(str)
3736
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    84
	if type(str) ~= "string" then return nil; end
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    85
	str = "return "..str;
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 3745
diff changeset
    86
	local f, err = envload(str, "@data", {});
3736
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    87
	if not f then return nil, err; end
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    88
	local success, ret = pcall(f);
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    89
	if not success then return nil, ret; end
73399dd525e8 util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    90
	return ret;
546
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
end
1e65f64dfabf Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    93
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    94
	append = append;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    95
	serialize = serialize;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    96
	deserialize = deserialize;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6673
diff changeset
    97
};