mirror of https://github.com/bjc/prosody
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.
252 lines
8.9 KiB
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;
|
|
|