Merge 0.9->0.10
[prosody.git] / tools / ejabberdsql2prosody.lua
index ef4706ce81382ae854083d530e615c45c4ba6848..930d5a6b787dd4204ea0de476199525d4d9fb8ff 100644 (file)
@@ -2,14 +2,25 @@
 -- Prosody IM
 -- Copyright (C) 2008-2010 Matthew Wild
 -- Copyright (C) 2008-2010 Waqas Hussain
--- 
+--
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 --
 
+prosody = {};
+
 package.path = package.path ..";../?.lua";
+
+local my_name = arg[0];
+if my_name:match("[/\\]") then
+       package.path = package.path..";"..my_name:gsub("[^/\\]+$", "../?.lua");
+       package.cpath = package.cpath..";"..my_name:gsub("[^/\\]+$", "../?.so");
+end
+
+
 local serialize = require "util.serialization".serialize;
 local st = require "util.stanza";
+local parse_xml = require "util.xml".parse;
 package.loaded["util.logger"] = {init = function() return function() end; end}
 local dm = require "util.datamanager"
 dm.set_data_path("data");
@@ -19,12 +30,16 @@ function parseFile(filename)
 
 local file = nil;
 local last = nil;
+local line = 1;
 local function read(expected)
        local ch;
        if last then
                ch = last; last = nil;
-       else ch = file:read(1); end
-       if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil")); end
+       else
+               ch = file:read(1);
+               if ch == "\n" then line = line + 1; end
+       end
+       if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil").." on line "..line); end
        return ch;
 end
 local function pushback(ch)
@@ -123,7 +138,12 @@ local function readInsert()
                end
        end
        local tname = readTableName();
-       for ch in ("` VALUES "):gmatch(".") do read(ch); end -- expect this
+       read("`"); read(" ") -- expect this
+       if peek() == "(" then -- skip column list
+               repeat until read() == ")";
+               read(" ");
+       end
+       for ch in ("VALUES "):gmatch(".") do read(ch); end -- expect this
        local tuples = readTuples();
        read(";"); read("\n");
        return tname, tuples;
@@ -156,58 +176,6 @@ return readFile(filename);
 ------
 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