tools/ejabberdsql2prosody.lua
author Waqas Hussain <waqas20@gmail.com>
Sun, 26 Jul 2009 15:36:06 +0500
changeset 1597 84328a4df655
parent 1596 4fcb2df97141
child 1598 d82e13d57821
permissions -rw-r--r--
ejabberdsql2prosody: Fixed: 'ask' value should be nil for pending-in subscriptions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env lua
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
-- Prosody IM
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2009 Matthew Wild
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
-- Copyright (C) 2008-2009 Waqas Hussain
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
-- 
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
-- COPYING file in the source package for more information.
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
--
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
package.path = package.path ..";../?.lua";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local serialize = require "util.serialization".serialize;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
local st = require "util.stanza";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
package.loaded["util.logger"] = {init = function() return function() end; end}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
local dm = require "util.datamanager"
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
dm.set_data_path("data");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
function parseFile(filename)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
------
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
local file = nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
local last = nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
local function read(expected)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
	local ch;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
	if last then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
		ch = last; last = nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
	else ch = file:read(1); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
	if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil")); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
	return ch;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
local function pushback(ch)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
	if last then error(); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
	last = ch;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
local function peek()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
	if not last then last = read(); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
	return last;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
local function unescape(s)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    40
	if s == "\\'" then return "'"; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
	if s == "\\n" then return "\n"; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
	error("Unknown escape sequence: "..s);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
local function readString()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
	read("'");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
	local s = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
		local ch = peek();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
		if ch == "\\" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
			s = s..unescape(read()..read());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
		elseif ch == "'" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
		else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
			s = s..read();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
	read("'");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
	return s;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
local function readNonString()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
	local s = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
		if peek() == "," or peek() == ")" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
		else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
			s = s..read();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
	return tonumber(s);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
local function readItem()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
	if peek() == "'" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
		return readString();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
	else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
		return readNonString();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
local function readTuple()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
	local items = {}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
	read("(");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
	while peek() ~= ")" do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
		table.insert(items, readItem());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
		if peek() == ")" then break; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
		read(",");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
	read(")");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
	return items;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
local function readTuples()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
	if peek() ~= "(" then read("("); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
	local tuples = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
		table.insert(tuples, readTuple());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
		if peek() == "," then read() end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
		if peek() == ";" then break; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
	return tuples;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
local function readTableName()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
	local tname = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
	while peek() ~= "`" do tname = tname..read(); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
	return tname;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
local function readInsert()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
	if peek() == nil then return nil; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
	for ch in ("INSERT INTO `"):gmatch(".") do -- find line starting with this
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
		if peek() == ch then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
			read(); -- found
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
		else -- match failed, skip line
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
			while peek() and read() ~= "\n" do end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
			return nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   113
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   114
	local tname = readTableName();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   115
	for ch in ("` VALUES "):gmatch(".") do read(ch); end -- expect this
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   116
	local tuples = readTuples();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   117
	read(";"); read("\n");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   118
	return tname, tuples;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   119
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   120
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   121
local function readFile(filename)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   122
	file = io.open(filename);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   123
	if not file then error("File not found: "..filename); os.exit(0); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   124
	local t = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   125
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   126
		local tname, tuples = readInsert();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   127
		if tname then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   128
			t[tname] = tuples;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   129
		elseif peek() == nil then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   130
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   131
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   132
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   133
	return t;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   134
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   135
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   136
return readFile(filename);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   137
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   138
------
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   139
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   140
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   141
local arg, host = ...;
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   142
local help = "/? -? ? /h -h /help -help --help";
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   143
if not(arg and host) or help:find(arg, 1, true) then
1593
4e44aa858a4c ejabberdsql2prosody: Improved help message
Waqas Hussain <waqas20@gmail.com>
parents: 1592
diff changeset
   144
	print([[ejabberd SQL DB dump importer for Prosody
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   145
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   146
  Usage: ejabberdsql2prosody.lua filename.txt hostname
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   147
1593
4e44aa858a4c ejabberdsql2prosody: Improved help message
Waqas Hussain <waqas20@gmail.com>
parents: 1592
diff changeset
   148
The file can be generated using mysqldump:
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   149
  mysqldump db_name > filename.txt]]);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   150
	os.exit(1);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   151
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   152
local map = {
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   153
	["last"] = {"username", "seconds", "state"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   154
	["privacy_default_list"] = {"username", "name"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   155
	["privacy_list"] = {"username", "name", "id"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   156
	["privacy_list_data"] = {"id", "t", "value", "action", "ord", "match_all", "match_iq", "match_message", "match_presence_in", "match_presence_out"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   157
	["private_storage"] = {"username", "namespace", "data"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   158
	["rostergroups"] = {"username", "jid", "grp"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   159
	["rosterusers"] = {"username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   160
	["spool"] = {"username", "xml", "seq"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   161
	["users"] = {"username", "password"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   162
	["vcard"] = {"username", "vcard"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   163
	--["vcard_search"] = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   164
}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   165
local NULL = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   166
local t = parseFile(arg);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   167
for name, data in pairs(t) do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   168
	local m = map[name];
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   169
	if m then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   170
		for i=1,#data do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   171
			local row = data[i];
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   172
			for j=1,#row do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   173
				row[m[j]] = row[j];
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   174
				row[j] = nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   175
			end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   176
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   177
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   178
end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   179
--print(serialize(t));
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   180
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   181
for i, row in ipairs(t["users"] or NULL) do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   182
	local node, password = row.username, row.password;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   183
	local ret, err = dm.store(node, host, "accounts", {password = password});
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   184
	print("["..(err or "success").."] accounts: "..node.."@"..host.." = "..password);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   185
end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   186
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   187
function roster(node, host, jid, item)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   188
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   189
	roster[jid] = item;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   190
	local ret, err = dm.store(node, host, "roster", roster);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   191
	print("["..(err or "success").."] roster: " ..node.."@"..host.." - "..jid);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   192
end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   193
function roster_pending(node, host, jid)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   194
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   195
	roster.pending = roster.pending or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   196
	roster.pending[jid] = true;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   197
	local ret, err = dm.store(node, host, "roster", roster);
1596
4fcb2df97141 ejabberdsql2prosody: Fixed: pending-in subscriptions could halt processing
Waqas Hussain <waqas20@gmail.com>
parents: 1595
diff changeset
   198
	print("["..(err or "success").."] roster-pending: " ..node.."@"..host.." - "..jid);
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   199
end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   200
function roster_group(node, host, jid, group)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   201
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   202
	local item = roster[jid];
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   203
	if not item then print("Warning: No roster item "..jid.." for user "..user..", can't put in group "..group); return; end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   204
	item.groups[group] = true;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   205
	local ret, err = dm.store(node, host, "roster", roster);
1596
4fcb2df97141 ejabberdsql2prosody: Fixed: pending-in subscriptions could halt processing
Waqas Hussain <waqas20@gmail.com>
parents: 1595
diff changeset
   206
	print("["..(err or "success").."] roster-group: " ..node.."@"..host.." - "..jid.." - "..group);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   207
end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   208
for i, row in ipairs(t["rosterusers"] or NULL) do
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   209
	local node, contact = row.username, row.jid;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   210
	local name = row.nick;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   211
	if name == "" then name = nil; end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   212
	local subscription = row.subscription;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   213
	if subscription == "N" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   214
		subscription = "none"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   215
	elseif subscription == "B" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   216
		subscription = "both"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   217
	elseif subscription == "F" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   218
		subscription = "from"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   219
	elseif subscription == "T" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   220
		subscription = "to"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   221
	else error("Unknown subscription type: "..subscription) end;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   222
	local ask = row.ask;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   223
	if ask == "N" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   224
		ask = nil;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   225
	elseif ask == "O" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   226
		ask = "subscribe";
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   227
	elseif ask == "I" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   228
		roster_pending(node, host, contact);
1597
84328a4df655 ejabberdsql2prosody: Fixed: 'ask' value should be nil for pending-in subscriptions
Waqas Hussain <waqas20@gmail.com>
parents: 1596
diff changeset
   229
		ask = nil;
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   230
	else error("Unknown ask type: "..ask); end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   231
	local item = {name = name, ask = ask, subscription = subscription, groups = {}};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   232
	roster(node, host, contact, item);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   233
end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   234
for i, row in ipairs(t["rostergroups"] or NULL) do
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   235
	roster_group(row.username, host, row.jid, row.grp);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   236
end