tools/ejabberdsql2prosody.lua
author Kim Alvefur <zash@zash.se>
Thu, 04 Nov 2021 01:00:06 +0100
branch0.11
changeset 12093 76b4e3f12b53
parent 7571 4f7990902874
child 13146 879a6a33c21b
permissions -rw-r--r--
mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant.
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
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2688
diff changeset
     3
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2688
diff changeset
     4
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5696
diff changeset
     5
--
1592
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
3541
a72b88953bf2 ejabberdsql2prosody: Added a global 'prosody' table to fix a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    10
prosody = {};
a72b88953bf2 ejabberdsql2prosody: Added a global 'prosody' table to fix a traceback.
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    11
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
package.path = package.path ..";../?.lua";
5696
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    13
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    14
local my_name = arg[0];
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    15
if my_name:match("[/\\]") then
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    16
	package.path = package.path..";"..my_name:gsub("[^/\\]+$", "../?.lua");
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    17
	package.cpath = package.cpath..";"..my_name:gsub("[^/\\]+$", "../?.so");
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    18
end
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    19
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5215
diff changeset
    20
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
local serialize = require "util.serialization".serialize;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
local st = require "util.stanza";
5215
b3d837c1ccf1 tools/ejabberdsql2prosody: Use util.xml.
Waqas Hussain <waqas20@gmail.com>
parents: 4496
diff changeset
    23
local parse_xml = require "util.xml".parse;
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
package.loaded["util.logger"] = {init = function() return function() end; end}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
local dm = require "util.datamanager"
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
dm.set_data_path("data");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
function parseFile(filename)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
------
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
local file = nil;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
local last = nil;
4384
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    33
local line = 1;
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
local function read(expected)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
	local ch;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
	if last then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
		ch = last; last = nil;
4384
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    38
	else
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    39
		ch = file:read(1);
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    40
		if ch == "\n" then line = line + 1; end
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    41
	end
7fbcb7e6a6a0 tools/ejabberdsql2prosody: Track current line for error reporting
Matthew Wild <mwild1@gmail.com>
parents: 3541
diff changeset
    42
	if expected and ch ~= expected then error("expected: "..expected.."; got: "..(ch or "nil").." on line "..line); end
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
	return ch;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
local function peek()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
	if not last then last = read(); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
	return last;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
1599
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    50
local escapes = {
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    51
	["\\0"] = "\0";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    52
	["\\'"] = "'";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    53
	["\\\""] = "\"";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    54
	["\\b"] = "\b";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    55
	["\\n"] = "\n";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    56
	["\\r"] = "\r";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    57
	["\\t"] = "\t";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    58
	["\\Z"] = "\26";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    59
	["\\\\"] = "\\";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    60
	["\\%"] = "%";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    61
	["\\_"] = "_";
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    62
}
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
local function unescape(s)
1599
308986a3e66a ejabberdsql2prosody: Added support for all mysql escape sequences
Waqas Hussain <waqas20@gmail.com>
parents: 1598
diff changeset
    64
	return escapes[s] or error("Unknown escape sequence: "..s);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
local function readString()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
	read("'");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
	local s = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
		local ch = peek();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
		if ch == "\\" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
			s = s..unescape(read()..read());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
		elseif ch == "'" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
		else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
			s = s..read();
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
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
	read("'");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
	return s;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
local function readNonString()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
	local s = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
		if peek() == "," or peek() == ")" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
		else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
			s = s..read();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
	return tonumber(s);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
local function readItem()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
	if peek() == "'" then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
		return readString();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
	else
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
		return readNonString();
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
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
local function readTuple()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
	local items = {}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
	read("(");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
	while peek() ~= ")" do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
		table.insert(items, readItem());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
		if peek() == ")" then break; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
		read(",");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
	read(")");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
	return items;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
local function readTuples()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
	if peek() ~= "(" then read("("); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   113
	local tuples = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   114
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   115
		table.insert(tuples, readTuple());
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   116
		if peek() == "," then read() end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   117
		if peek() == ";" then break; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   118
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   119
	return tuples;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   120
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   121
local function readTableName()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   122
	local tname = "";
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   123
	while peek() ~= "`" do tname = tname..read(); end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   124
	return tname;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   125
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   126
local function readInsert()
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   127
	if peek() == nil then return nil; end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   128
	for ch in ("INSERT INTO `"):gmatch(".") do -- find line starting with this
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   129
		if peek() == ch then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   130
			read(); -- found
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   131
		else -- match failed, skip line
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   132
			while peek() and read() ~= "\n" do end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   133
			return nil;
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
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   136
	local tname = readTableName();
4496
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   137
	read("`"); read(" ") -- expect this
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   138
	if peek() == "(" then -- skip column list
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   139
		repeat until read() == ")";
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   140
		read(" ");
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   141
	end
11983a1e92c0 tools/ejabberdsql2prosody: Handle INSERT statement form where column list is specified (by skipping the column list).
Waqas Hussain <waqas20@gmail.com>
parents: 4384
diff changeset
   142
	for ch in ("VALUES "):gmatch(".") do read(ch); end -- expect this
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   143
	local tuples = readTuples();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   144
	read(";"); read("\n");
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   145
	return tname, tuples;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   146
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   147
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   148
local function readFile(filename)
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   149
	file = io.open(filename);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   150
	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
   151
	local t = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   152
	while true do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   153
		local tname, tuples = readInsert();
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   154
		if tname then
1647
066cd784d97b ejabberdsql2prosody: Fix access of undefined global
Waqas Hussain <waqas20@gmail.com>
parents: 1630
diff changeset
   155
			if t[tname] then
066cd784d97b ejabberdsql2prosody: Fix access of undefined global
Waqas Hussain <waqas20@gmail.com>
parents: 1630
diff changeset
   156
				local t_name = t[tname];
1611
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   157
				for i=1,#tuples do
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   158
					table.insert(t_name, tuples[i]);
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   159
				end
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   160
			else
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   161
				t[tname] = tuples;
e20f90743863 ejabberdsql2prosody: Allow for multiple INSERTs to the same table
Waqas Hussain <waqas20@gmail.com>
parents: 1603
diff changeset
   162
			end
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   163
		elseif peek() == nil then
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   164
			break;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   165
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   166
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   167
	return t;
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   168
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   169
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   170
return readFile(filename);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   171
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   172
------
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   173
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   174
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   175
local arg, hostname = ...;
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   176
local help = "/? -? ? /h -h /help -help --help";
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   177
if not(arg and hostname) or help:find(arg, 1, true) then
1593
4e44aa858a4c ejabberdsql2prosody: Improved help message
Waqas Hussain <waqas20@gmail.com>
parents: 1592
diff changeset
   178
	print([[ejabberd SQL DB dump importer for Prosody
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   179
1594
6e639a34e503 ejabberdsql2prosody: Added a second required command line parameter: hostname
Waqas Hussain <waqas20@gmail.com>
parents: 1593
diff changeset
   180
  Usage: ejabberdsql2prosody.lua filename.txt hostname
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   181
1593
4e44aa858a4c ejabberdsql2prosody: Improved help message
Waqas Hussain <waqas20@gmail.com>
parents: 1592
diff changeset
   182
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
   183
  mysqldump db_name > filename.txt]]);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   184
	os.exit(1);
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   185
end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   186
local map = {
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   187
	["last"] = {"username", "seconds", "state"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   188
	["privacy_default_list"] = {"username", "name"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   189
	["privacy_list"] = {"username", "name", "id"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   190
	["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
   191
	["private_storage"] = {"username", "namespace", "data"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   192
	["rostergroups"] = {"username", "jid", "grp"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   193
	["rosterusers"] = {"username", "jid", "nick", "subscription", "ask", "askmessage", "server", "subscribe", "type"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   194
	["spool"] = {"username", "xml", "seq"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   195
	["users"] = {"username", "password"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   196
	["vcard"] = {"username", "vcard"};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   197
	--["vcard_search"] = {};
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   198
}
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   199
local NULL = {};
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   200
local parsed = parseFile(arg);
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   201
for name, data in pairs(parsed) do
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   202
	local m = map[name];
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   203
	if m then
1601
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   204
		if #data > 0 and #data[1] ~= #m then
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   205
			print("[warning] expected "..#m.." columns for table `"..name.."`, found "..#data[1]);
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   206
		end
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   207
		for i=1,#data do
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   208
			local row = data[i];
1601
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   209
			for j=1,#m do
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   210
				row[m[j]] = row[j];
a3ffc27b6207 ejabberdsql2prosody: Fix typo, and improve the warning message
Waqas Hussain <waqas20@gmail.com>
parents: 1600
diff changeset
   211
				row[j] = nil;
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   212
			end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   213
		end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   214
	end
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   215
end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   216
--print(serialize(t));
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   217
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   218
for _, row in ipairs(parsed["users"] or NULL) do
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   219
	local node, password = row.username, row.password;
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   220
	local ret, err = dm.store(node, hostname, "accounts", {password = password});
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   221
	print("["..(err or "success").."] accounts: "..node.."@"..hostname);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   222
end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   223
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   224
function roster(node, host, jid, item)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   225
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   226
	roster[jid] = item;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   227
	local ret, err = dm.store(node, host, "roster", roster);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   228
	print("["..(err or "success").."] roster: " ..node.."@"..host.." - "..jid);
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   229
end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   230
function roster_pending(node, host, jid)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   231
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   232
	roster.pending = roster.pending or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   233
	roster.pending[jid] = true;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   234
	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
   235
	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
   236
end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   237
function roster_group(node, host, jid, group)
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   238
	local roster = dm.load(node, host, "roster") or {};
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   239
	local item = roster[jid];
1603
d11606859400 ejabberdsql2prosody: Fixed a nil global access error
Waqas Hussain <waqas20@gmail.com>
parents: 1602
diff changeset
   240
	if not item then print("Warning: No roster item "..jid.." for user "..node..", can't put in group "..group); return; end
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   241
	item.groups[group] = true;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   242
	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
   243
	print("["..(err or "success").."] roster-group: " ..node.."@"..host.." - "..jid.." - "..group);
1592
a7c140fc672b ejabberdsql2prosody: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   244
end
1630
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   245
function private_storage(node, host, xmlns, stanza)
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   246
	local private = dm.load(node, host, "private") or {};
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   247
	private[stanza.name..":"..xmlns] = st.preserialize(stanza);
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   248
	local ret, err = dm.store(node, host, "private", private);
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   249
	print("["..(err or "success").."] private: " ..node.."@"..host.." - "..xmlns);
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   250
end
1648
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   251
function offline_msg(node, host, t, stanza)
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   252
	stanza.attr.stamp = os.date("!%Y-%m-%dT%H:%M:%SZ", t);
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   253
	stanza.attr.stamp_legacy = os.date("!%Y%m%dT%H:%M:%S", t);
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   254
	local ret, err = dm.list_append(node, host, "offline", st.preserialize(stanza));
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   255
	print("["..(err or "success").."] offline: " ..node.."@"..host.." - "..os.date("!%Y-%m-%dT%H:%M:%SZ", t));
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   256
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   257
for _, row in ipairs(parsed["rosterusers"] or NULL) do
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   258
	local node, contact = row.username, row.jid;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   259
	local name = row.nick;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   260
	if name == "" then name = nil; end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   261
	local subscription = row.subscription;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   262
	if subscription == "N" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   263
		subscription = "none"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   264
	elseif subscription == "B" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   265
		subscription = "both"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   266
	elseif subscription == "F" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   267
		subscription = "from"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   268
	elseif subscription == "T" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   269
		subscription = "to"
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   270
	else error("Unknown subscription type: "..subscription) end;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   271
	local ask = row.ask;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   272
	if ask == "N" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   273
		ask = nil;
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   274
	elseif ask == "O" then
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   275
		ask = "subscribe";
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   276
	elseif ask == "I" then
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   277
		roster_pending(node, hostname, contact);
1597
84328a4df655 ejabberdsql2prosody: Fixed: 'ask' value should be nil for pending-in subscriptions
Waqas Hussain <waqas20@gmail.com>
parents: 1596
diff changeset
   278
		ask = nil;
1602
1056369a29df ejabberdsql2prosody: Add support for rosterusers.ask == "B" (both pending in and out subscriptions)
Waqas Hussain <waqas20@gmail.com>
parents: 1601
diff changeset
   279
	elseif ask == "B" then
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   280
		roster_pending(node, hostname, contact);
1602
1056369a29df ejabberdsql2prosody: Add support for rosterusers.ask == "B" (both pending in and out subscriptions)
Waqas Hussain <waqas20@gmail.com>
parents: 1601
diff changeset
   281
		ask = "subscribe";
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   282
	else error("Unknown ask type: "..ask); end
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   283
	local item = {name = name, ask = ask, subscription = subscription, groups = {}};
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   284
	roster(node, hostname, contact, item);
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   285
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   286
for _, row in ipairs(parsed["rostergroups"] or NULL) do
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   287
	roster_group(row.username, hostname, row.jid, row.grp);
1595
9551055b5344 ejabberdsql2prosody: Added support for rosters
Waqas Hussain <waqas20@gmail.com>
parents: 1594
diff changeset
   288
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   289
for _, row in ipairs(parsed["vcard"] or NULL) do
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   290
	local stanza, err = parse_xml(row.vcard);
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   291
	if stanza then
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   292
		local ret, err = dm.store(row.username, hostname, "vcard", st.preserialize(stanza));
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   293
		print("["..(err or "success").."] vCard: "..row.username.."@"..hostname);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   294
	else
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   295
		print("[error] vCard XML parse failed: "..row.username.."@"..hostname);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   296
	end
1629
f6af348cf497 ejabberdsql2prosody: Added support for vCards
Waqas Hussain <waqas20@gmail.com>
parents: 1628
diff changeset
   297
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   298
for _, row in ipairs(parsed["private_storage"] or NULL) do
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   299
	local stanza, err = parse_xml(row.data);
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   300
	if stanza then
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   301
		private_storage(row.username, hostname, row.namespace, stanza);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   302
	else
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   303
		print("[error] Private XML parse failed: "..row.username.."@"..hostname);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   304
	end
1630
cb3d937dd1da ejabberdsql2prosody: Added support for Private XML Storage
Waqas Hussain <waqas20@gmail.com>
parents: 1629
diff changeset
   305
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   306
table.sort(parsed["spool"] or NULL, function(a,b) return a.seq < b.seq; end); -- sort by sequence number, just in case
1648
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   307
local time_offset = os.difftime(os.time(os.date("!*t")), os.time(os.date("*t"))) -- to deal with timezones
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   308
local date_parse = function(s)
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   309
	local year, month, day, hour, min, sec = s:match("(....)-?(..)-?(..)T(..):(..):(..)");
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   310
	return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec-time_offset});
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   311
end
7571
4f7990902874 ejabberdsql2prosody: rename variable 't' to prevent shadowing upvalues [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7570
diff changeset
   312
for _, row in ipairs(parsed["spool"] or NULL) do
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   313
	local stanza, err = parse_xml(row.xml);
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   314
	if stanza then
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   315
		local last_child = stanza.tags[#stanza.tags];
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   316
		if not last_child or last_child ~= stanza[#stanza] then error("Last child of offline message is not a tag"); end
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   317
		if last_child.name ~= "x" and last_child.attr.xmlns ~= "jabber:x:delay" then error("Last child of offline message is not a timestamp"); end
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   318
		stanza[#stanza], stanza.tags[#stanza.tags] = nil, nil;
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   319
		local t = date_parse(last_child.attr.stamp);
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   320
		offline_msg(row.username, hostname, t, stanza);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   321
	else
7570
495de404a8ae ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7569
diff changeset
   322
		print("[error] Offline message XML parsing failed: "..row.username.."@"..hostname);
5991
a4b4b152a7d6 tools/ejabberdsql2prosody: Skip invalid XML in data, and print out errors.
Waqas Hussain <waqas20@gmail.com>
parents: 5696
diff changeset
   323
	end
1648
b05371e6f058 ejabberdsql2prosody: Added support for offline messages
Waqas Hussain <waqas20@gmail.com>
parents: 1647
diff changeset
   324
end