Changeset

1631:fa49cbfff0e6

Merge with waqas
author Matthew Wild <mwild1@gmail.com>
date Mon, 03 Aug 2009 17:53:02 +0100
parents 1627:6b2109012688 (current diff) 1630:cb3d937dd1da (diff)
children 1634:46120978150c
files
diffstat 1 files changed, 65 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/tools/ejabberdsql2prosody.lua	Mon Aug 03 17:52:17 2009 +0100
+++ b/tools/ejabberdsql2prosody.lua	Mon Aug 03 17:53:02 2009 +0100
@@ -156,6 +156,58 @@
 ------
 end
 
+-- XML parser
+local parse_xml = (function()
+	local entity_map = setmetatable({
+		["amp"] = "&";
+		["gt"] = ">";
+		["lt"] = "<";
+		["apos"] = "'";
+		["quot"] = "\"";
+	}, {__index = function(_, s)
+			if s:sub(1,1) == "#" then
+				if s:sub(2,2) == "x" then
+					return string.char(tonumber(s:sub(3), 16));
+				else
+					return string.char(tonumber(s:sub(2)));
+				end
+			end
+		end
+	});
+	local function xml_unescape(str)
+		return (str:gsub("&(.-);", entity_map));
+	end
+	local function parse_tag(s)
+		local name,sattr=(s):gmatch("([^%s]+)(.*)")();
+		local attr = {};
+		for a,b in (sattr):gmatch("([^=%s]+)=['\"]([^'\"]*)['\"]") do attr[a] = xml_unescape(b); end
+		return name, attr;
+	end
+	return function(xml)
+		local stanza = st.stanza("root");
+		local regexp = "<([^>]*)>([^<]*)";
+		for elem, text in xml:gmatch(regexp) do
+			if elem:sub(1,1) == "!" or elem:sub(1,1) == "?" then -- neglect comments and processing-instructions
+			elseif elem:sub(1,1) == "/" then -- end tag
+				elem = elem:sub(2);
+				stanza:up(); -- TODO check for start-end tag name match
+			elseif elem:sub(-1,-1) == "/" then -- empty tag
+				elem = elem:sub(1,-2);
+				local name,attr = parse_tag(elem);
+				stanza:tag(name, attr):up();
+			else -- start tag
+				local name,attr = parse_tag(elem);
+				stanza:tag(name, attr);
+			end
+			if #text ~= 0 then -- text
+				stanza:text(xml_unescape(text));
+			end
+		end
+		return stanza.tags[1];
+	end
+end)();
+-- end of XML parser
+
 local arg, host = ...;
 local help = "/? -? ? /h -h /help -help --help";
 if not(arg and host) or help:find(arg, 1, true) then
@@ -226,6 +278,12 @@
 	local ret, err = dm.store(node, host, "roster", roster);
 	print("["..(err or "success").."] roster-group: " ..node.."@"..host.." - "..jid.." - "..group);
 end
+function private_storage(node, host, xmlns, stanza)
+	local private = dm.load(node, host, "private") or {};
+	private[stanza.name..":"..xmlns] = st.preserialize(stanza);
+	local ret, err = dm.store(node, host, "private", private);
+	print("["..(err or "success").."] private: " ..node.."@"..host.." - "..xmlns);
+end
 for i, row in ipairs(t["rosterusers"] or NULL) do
 	local node, contact = row.username, row.jid;
 	local name = row.nick;
@@ -258,3 +316,10 @@
 for i, row in ipairs(t["rostergroups"] or NULL) do
 	roster_group(row.username, host, row.jid, row.grp);
 end
+for i, row in ipairs(t["vcard"] or NULL) do
+	local ret, err = dm.store(row.username, host, "vcard", st.preserialize(parse_xml(row.vcard)));
+	print("["..(err or "success").."] vCard: "..row.username.."@"..host);
+end
+for i, row in ipairs(t["private_storage"] or NULL) do
+	private_storage(row.username, host, row.namespace, st.preserialize(parse_xml(row.data)));
+end