IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/plugins/storage/ejabberd_init.lib.lua

252 lines
8.9 KiB

local t_concat = table.concat;
local t_insert = table.insert;
local pairs = pairs;
local DBI = require "DBI";
local sqlite = true;
local q = {};
local function set(key, val)
-- t_insert(q, "SET "..key.."="..val..";\n")
end
local function create_table(name, fields)
t_insert(q, "CREATE TABLE ".."IF NOT EXISTS "..name.." (\n");
for _, field in pairs(fields) do
t_insert(q, "\t");
field = t_concat(field, " ");
if sqlite then
if field:lower():match("^primary key *%(") then field = field:gsub("%(%d+%)", ""); end
end
t_insert(q, field);
if _ ~= #fields then t_insert(q, ",\n"); end
t_insert(q, "\n");
end
if sqlite then
t_insert(q, ");\n");
else
t_insert(q, ") CHARACTER SET utf8;\n");
end
end
local function create_index(name, index)
--t_insert(q, "CREATE INDEX "..name.." ON "..index..";\n");
end
local function create_unique_index(name, index)
--t_insert(q, "CREATE UNIQUE INDEX "..name.." ON "..index..";\n");
end
local function insert(target, value)
t_insert(q, "INSERT INTO "..target.."\nVALUES "..value..";\n");
end
local function foreign_key(name, fkey, fname, fcol)
t_insert(q, "ALTER TABLE `"..name.."` ADD FOREIGN KEY (`"..fkey.."`) REFERENCES `"..fname.."` (`"..fcol.."`) ON DELETE CASCADE;\n");
end
function build_query()
q = {};
set('table_type', 'InnoDB');
create_table('hosts', {
{'clusterid','integer','NOT','NULL'};
{'host','varchar(250)','NOT','NULL','PRIMARY','KEY'};
{'config','text','NOT','NULL'};
});
insert("hosts (clusterid, host, config)", "(1, 'localhost', '')");
create_table('users', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'password','text','NOT','NULL'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host, username)'};
});
create_table('last', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'seconds','text','NOT','NULL'};
{'state','text','NOT','NULL'};
{'PRIMARY','KEY','(host, username)'};
});
create_table('rosterusers', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'jid','varchar(250)','NOT','NULL'};
{'nick','text','NOT','NULL'};
{'subscription','character(1)','NOT','NULL'};
{'ask','character(1)','NOT','NULL'};
{'askmessage','text','NOT','NULL'};
{'server','character(1)','NOT','NULL'};
{'subscribe','text','NOT','NULL'};
{'type','text'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host(75), username(75), jid(75))'};
});
create_index('i_rosteru_username', 'rosterusers(username)');
create_index('i_rosteru_jid', 'rosterusers(jid)');
create_table('rostergroups', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'jid','varchar(250)','NOT','NULL'};
{'grp','text','NOT','NULL'};
{'PRIMARY','KEY','(host(75), username(75), jid(75))'};
});
--[[create_table('spool', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'xml','text','NOT','NULL'};
{'seq','BIGINT','UNSIGNED','NOT','NULL','AUTO_INCREMENT','UNIQUE'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host, username, seq)'};
});]]
create_table('vcard', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'vcard','text','NOT','NULL'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host, username)'};
});
create_table('vcard_search', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'lusername','varchar(250)','NOT','NULL'};
{'fn','text','NOT','NULL'};
{'lfn','varchar(250)','NOT','NULL'};
{'family','text','NOT','NULL'};
{'lfamily','varchar(250)','NOT','NULL'};
{'given','text','NOT','NULL'};
{'lgiven','varchar(250)','NOT','NULL'};
{'middle','text','NOT','NULL'};
{'lmiddle','varchar(250)','NOT','NULL'};
{'nickname','text','NOT','NULL'};
{'lnickname','varchar(250)','NOT','NULL'};
{'bday','text','NOT','NULL'};
{'lbday','varchar(250)','NOT','NULL'};
{'ctry','text','NOT','NULL'};
{'lctry','varchar(250)','NOT','NULL'};
{'locality','text','NOT','NULL'};
{'llocality','varchar(250)','NOT','NULL'};
{'email','text','NOT','NULL'};
{'lemail','varchar(250)','NOT','NULL'};
{'orgname','text','NOT','NULL'};
{'lorgname','varchar(250)','NOT','NULL'};
{'orgunit','text','NOT','NULL'};
{'lorgunit','varchar(250)','NOT','NULL'};
{'PRIMARY','KEY','(host, lusername)'};
});
create_index('i_vcard_search_lfn ', 'vcard_search(lfn)');
create_index('i_vcard_search_lfamily ', 'vcard_search(lfamily)');
create_index('i_vcard_search_lgiven ', 'vcard_search(lgiven)');
create_index('i_vcard_search_lmiddle ', 'vcard_search(lmiddle)');
create_index('i_vcard_search_lnickname', 'vcard_search(lnickname)');
create_index('i_vcard_search_lbday ', 'vcard_search(lbday)');
create_index('i_vcard_search_lctry ', 'vcard_search(lctry)');
create_index('i_vcard_search_llocality', 'vcard_search(llocality)');
create_index('i_vcard_search_lemail ', 'vcard_search(lemail)');
create_index('i_vcard_search_lorgname ', 'vcard_search(lorgname)');
create_index('i_vcard_search_lorgunit ', 'vcard_search(lorgunit)');
create_table('privacy_default_list', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)'};
{'name','varchar(250)','NOT','NULL'};
{'PRIMARY','KEY','(host, username)'};
});
--[[create_table('privacy_list', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'name','varchar(250)','NOT','NULL'};
{'id','BIGINT','UNSIGNED','NOT','NULL','AUTO_INCREMENT','UNIQUE'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host, username, name)'};
});]]
create_table('privacy_list_data', {
{'id','bigint'};
{'t','character(1)','NOT','NULL'};
{'value','text','NOT','NULL'};
{'action','character(1)','NOT','NULL'};
{'ord','NUMERIC','NOT','NULL'};
{'match_all','boolean','NOT','NULL'};
{'match_iq','boolean','NOT','NULL'};
{'match_message','boolean','NOT','NULL'};
{'match_presence_in','boolean','NOT','NULL'};
{'match_presence_out','boolean','NOT','NULL'};
});
create_table('private_storage', {
{'host','varchar(250)','NOT','NULL'};
{'username','varchar(250)','NOT','NULL'};
{'namespace','varchar(250)','NOT','NULL'};
{'data','text','NOT','NULL'};
{'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'};
{'PRIMARY','KEY','(host(75), username(75), namespace(75))'};
});
create_index('i_private_storage_username USING BTREE', 'private_storage(username)');
create_table('roster_version', {
{'username','varchar(250)','PRIMARY','KEY'};
{'version','text','NOT','NULL'};
});
--[[create_table('pubsub_node', {
{'host','text'};
{'node','text'};
{'parent','text'};
{'type','text'};
{'nodeid','bigint','auto_increment','primary','key'};
});
create_index('i_pubsub_node_parent', 'pubsub_node(parent(120))');
create_unique_index('i_pubsub_node_tuple', 'pubsub_node(host(20), node(120))');
create_table('pubsub_node_option', {
{'nodeid','bigint'};
{'name','text'};
{'val','text'};
});
create_index('i_pubsub_node_option_nodeid', 'pubsub_node_option(nodeid)');
foreign_key('pubsub_node_option', 'nodeid', 'pubsub_node', 'nodeid');
create_table('pubsub_node_owner', {
{'nodeid','bigint'};
{'owner','text'};
});
create_index('i_pubsub_node_owner_nodeid', 'pubsub_node_owner(nodeid)');
foreign_key('pubsub_node_owner', 'nodeid', 'pubsub_node', 'nodeid');
create_table('pubsub_state', {
{'nodeid','bigint'};
{'jid','text'};
{'affiliation','character(1)'};
{'subscriptions','text'};
{'stateid','bigint','auto_increment','primary','key'};
});
create_index('i_pubsub_state_jid', 'pubsub_state(jid(60))');
create_unique_index('i_pubsub_state_tuple', 'pubsub_state(nodeid, jid(60))');
foreign_key('pubsub_state', 'nodeid', 'pubsub_node', 'nodeid');
create_table('pubsub_item', {
{'nodeid','bigint'};
{'itemid','text'};
{'publisher','text'};
{'creation','text'};
{'modification','text'};
{'payload','text'};
});
create_index('i_pubsub_item_itemid', 'pubsub_item(itemid(36))');
create_unique_index('i_pubsub_item_tuple', 'pubsub_item(nodeid, itemid(36))');
foreign_key('pubsub_item', 'nodeid', 'pubsub_node', 'nodeid');
create_table('pubsub_subscription_opt', {
{'subid','text'};
{'opt_name','varchar(32)'};
{'opt_value','text'};
});
create_unique_index('i_pubsub_subscription_opt', 'pubsub_subscription_opt(subid(32), opt_name(32))');]]
return t_concat(q);
end
local function init(dbh)
local q = build_query();
for statement in q:gmatch("[^;]*;") do
statement = statement:gsub("\n", ""):gsub("\t", " ");
if sqlite then
statement = statement:gsub("AUTO_INCREMENT", "AUTOINCREMENT");
statement = statement:gsub("auto_increment", "autoincrement");
end
local result, err = DBI.Do(dbh, statement);
if not result then
print("X", result, err);
print("Y", statement);
end
end
end
local _M = { init = init };
return _M;