Software /
code /
prosody
Comparison
plugins/storage/ejabberd_init.lib.lua @ 3415:5ba0e094a5e2
storage/mod_ejabberd (and associated library): Initial commit.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 31 Jul 2010 13:32:57 +0500 |
comparison
equal
deleted
inserted
replaced
3414:9a1f6239b63c | 3415:5ba0e094a5e2 |
---|---|
1 | |
2 local t_concat = table.concat; | |
3 local t_insert = table.insert; | |
4 local pairs = pairs; | |
5 local DBI = require "DBI"; | |
6 | |
7 local sqlite = true; | |
8 local q = {}; | |
9 | |
10 local function set(key, val) | |
11 -- t_insert(q, "SET "..key.."="..val..";\n") | |
12 end | |
13 local function create_table(name, fields) | |
14 t_insert(q, "CREATE TABLE ".."IF NOT EXISTS "..name.." (\n"); | |
15 for _, field in pairs(fields) do | |
16 t_insert(q, "\t"); | |
17 field = t_concat(field, " "); | |
18 if sqlite then | |
19 if field:lower():match("^primary key *%(") then field = field:gsub("%(%d+%)", ""); end | |
20 end | |
21 t_insert(q, field); | |
22 if _ ~= #fields then t_insert(q, ",\n"); end | |
23 t_insert(q, "\n"); | |
24 end | |
25 if sqlite then | |
26 t_insert(q, ");\n"); | |
27 else | |
28 t_insert(q, ") CHARACTER SET utf8;\n"); | |
29 end | |
30 end | |
31 local function create_index(name, index) | |
32 --t_insert(q, "CREATE INDEX "..name.." ON "..index..";\n"); | |
33 end | |
34 local function create_unique_index(name, index) | |
35 --t_insert(q, "CREATE UNIQUE INDEX "..name.." ON "..index..";\n"); | |
36 end | |
37 local function insert(target, value) | |
38 t_insert(q, "INSERT INTO "..target.."\nVALUES "..value..";\n"); | |
39 end | |
40 local function foreign_key(name, fkey, fname, fcol) | |
41 t_insert(q, "ALTER TABLE `"..name.."` ADD FOREIGN KEY (`"..fkey.."`) REFERENCES `"..fname.."` (`"..fcol.."`) ON DELETE CASCADE;\n"); | |
42 end | |
43 | |
44 function build_query() | |
45 q = {}; | |
46 set('table_type', 'InnoDB'); | |
47 create_table('hosts', { | |
48 {'clusterid','integer','NOT','NULL'}; | |
49 {'host','varchar(250)','NOT','NULL','PRIMARY','KEY'}; | |
50 {'config','text','NOT','NULL'}; | |
51 }); | |
52 insert("hosts (clusterid, host, config)", "(1, 'localhost', '')"); | |
53 create_table('users', { | |
54 {'host','varchar(250)','NOT','NULL'}; | |
55 {'username','varchar(250)','NOT','NULL'}; | |
56 {'password','text','NOT','NULL'}; | |
57 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
58 {'PRIMARY','KEY','(host, username)'}; | |
59 }); | |
60 create_table('last', { | |
61 {'host','varchar(250)','NOT','NULL'}; | |
62 {'username','varchar(250)','NOT','NULL'}; | |
63 {'seconds','text','NOT','NULL'}; | |
64 {'state','text','NOT','NULL'}; | |
65 {'PRIMARY','KEY','(host, username)'}; | |
66 }); | |
67 create_table('rosterusers', { | |
68 {'host','varchar(250)','NOT','NULL'}; | |
69 {'username','varchar(250)','NOT','NULL'}; | |
70 {'jid','varchar(250)','NOT','NULL'}; | |
71 {'nick','text','NOT','NULL'}; | |
72 {'subscription','character(1)','NOT','NULL'}; | |
73 {'ask','character(1)','NOT','NULL'}; | |
74 {'askmessage','text','NOT','NULL'}; | |
75 {'server','character(1)','NOT','NULL'}; | |
76 {'subscribe','text','NOT','NULL'}; | |
77 {'type','text'}; | |
78 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
79 {'PRIMARY','KEY','(host(75), username(75), jid(75))'}; | |
80 }); | |
81 create_index('i_rosteru_username', 'rosterusers(username)'); | |
82 create_index('i_rosteru_jid', 'rosterusers(jid)'); | |
83 create_table('rostergroups', { | |
84 {'host','varchar(250)','NOT','NULL'}; | |
85 {'username','varchar(250)','NOT','NULL'}; | |
86 {'jid','varchar(250)','NOT','NULL'}; | |
87 {'grp','text','NOT','NULL'}; | |
88 {'PRIMARY','KEY','(host(75), username(75), jid(75))'}; | |
89 }); | |
90 --[[create_table('spool', { | |
91 {'host','varchar(250)','NOT','NULL'}; | |
92 {'username','varchar(250)','NOT','NULL'}; | |
93 {'xml','text','NOT','NULL'}; | |
94 {'seq','BIGINT','UNSIGNED','NOT','NULL','AUTO_INCREMENT','UNIQUE'}; | |
95 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
96 {'PRIMARY','KEY','(host, username, seq)'}; | |
97 });]] | |
98 create_table('vcard', { | |
99 {'host','varchar(250)','NOT','NULL'}; | |
100 {'username','varchar(250)','NOT','NULL'}; | |
101 {'vcard','text','NOT','NULL'}; | |
102 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
103 {'PRIMARY','KEY','(host, username)'}; | |
104 }); | |
105 create_table('vcard_search', { | |
106 {'host','varchar(250)','NOT','NULL'}; | |
107 {'username','varchar(250)','NOT','NULL'}; | |
108 {'lusername','varchar(250)','NOT','NULL'}; | |
109 {'fn','text','NOT','NULL'}; | |
110 {'lfn','varchar(250)','NOT','NULL'}; | |
111 {'family','text','NOT','NULL'}; | |
112 {'lfamily','varchar(250)','NOT','NULL'}; | |
113 {'given','text','NOT','NULL'}; | |
114 {'lgiven','varchar(250)','NOT','NULL'}; | |
115 {'middle','text','NOT','NULL'}; | |
116 {'lmiddle','varchar(250)','NOT','NULL'}; | |
117 {'nickname','text','NOT','NULL'}; | |
118 {'lnickname','varchar(250)','NOT','NULL'}; | |
119 {'bday','text','NOT','NULL'}; | |
120 {'lbday','varchar(250)','NOT','NULL'}; | |
121 {'ctry','text','NOT','NULL'}; | |
122 {'lctry','varchar(250)','NOT','NULL'}; | |
123 {'locality','text','NOT','NULL'}; | |
124 {'llocality','varchar(250)','NOT','NULL'}; | |
125 {'email','text','NOT','NULL'}; | |
126 {'lemail','varchar(250)','NOT','NULL'}; | |
127 {'orgname','text','NOT','NULL'}; | |
128 {'lorgname','varchar(250)','NOT','NULL'}; | |
129 {'orgunit','text','NOT','NULL'}; | |
130 {'lorgunit','varchar(250)','NOT','NULL'}; | |
131 {'PRIMARY','KEY','(host, lusername)'}; | |
132 }); | |
133 create_index('i_vcard_search_lfn ', 'vcard_search(lfn)'); | |
134 create_index('i_vcard_search_lfamily ', 'vcard_search(lfamily)'); | |
135 create_index('i_vcard_search_lgiven ', 'vcard_search(lgiven)'); | |
136 create_index('i_vcard_search_lmiddle ', 'vcard_search(lmiddle)'); | |
137 create_index('i_vcard_search_lnickname', 'vcard_search(lnickname)'); | |
138 create_index('i_vcard_search_lbday ', 'vcard_search(lbday)'); | |
139 create_index('i_vcard_search_lctry ', 'vcard_search(lctry)'); | |
140 create_index('i_vcard_search_llocality', 'vcard_search(llocality)'); | |
141 create_index('i_vcard_search_lemail ', 'vcard_search(lemail)'); | |
142 create_index('i_vcard_search_lorgname ', 'vcard_search(lorgname)'); | |
143 create_index('i_vcard_search_lorgunit ', 'vcard_search(lorgunit)'); | |
144 create_table('privacy_default_list', { | |
145 {'host','varchar(250)','NOT','NULL'}; | |
146 {'username','varchar(250)'}; | |
147 {'name','varchar(250)','NOT','NULL'}; | |
148 {'PRIMARY','KEY','(host, username)'}; | |
149 }); | |
150 --[[create_table('privacy_list', { | |
151 {'host','varchar(250)','NOT','NULL'}; | |
152 {'username','varchar(250)','NOT','NULL'}; | |
153 {'name','varchar(250)','NOT','NULL'}; | |
154 {'id','BIGINT','UNSIGNED','NOT','NULL','AUTO_INCREMENT','UNIQUE'}; | |
155 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
156 {'PRIMARY','KEY','(host, username, name)'}; | |
157 });]] | |
158 create_table('privacy_list_data', { | |
159 {'id','bigint'}; | |
160 {'t','character(1)','NOT','NULL'}; | |
161 {'value','text','NOT','NULL'}; | |
162 {'action','character(1)','NOT','NULL'}; | |
163 {'ord','NUMERIC','NOT','NULL'}; | |
164 {'match_all','boolean','NOT','NULL'}; | |
165 {'match_iq','boolean','NOT','NULL'}; | |
166 {'match_message','boolean','NOT','NULL'}; | |
167 {'match_presence_in','boolean','NOT','NULL'}; | |
168 {'match_presence_out','boolean','NOT','NULL'}; | |
169 }); | |
170 create_table('private_storage', { | |
171 {'host','varchar(250)','NOT','NULL'}; | |
172 {'username','varchar(250)','NOT','NULL'}; | |
173 {'namespace','varchar(250)','NOT','NULL'}; | |
174 {'data','text','NOT','NULL'}; | |
175 {'created_at','timestamp','NOT','NULL','DEFAULT','CURRENT_TIMESTAMP'}; | |
176 {'PRIMARY','KEY','(host(75), username(75), namespace(75))'}; | |
177 }); | |
178 create_index('i_private_storage_username USING BTREE', 'private_storage(username)'); | |
179 create_table('roster_version', { | |
180 {'username','varchar(250)','PRIMARY','KEY'}; | |
181 {'version','text','NOT','NULL'}; | |
182 }); | |
183 --[[create_table('pubsub_node', { | |
184 {'host','text'}; | |
185 {'node','text'}; | |
186 {'parent','text'}; | |
187 {'type','text'}; | |
188 {'nodeid','bigint','auto_increment','primary','key'}; | |
189 }); | |
190 create_index('i_pubsub_node_parent', 'pubsub_node(parent(120))'); | |
191 create_unique_index('i_pubsub_node_tuple', 'pubsub_node(host(20), node(120))'); | |
192 create_table('pubsub_node_option', { | |
193 {'nodeid','bigint'}; | |
194 {'name','text'}; | |
195 {'val','text'}; | |
196 }); | |
197 create_index('i_pubsub_node_option_nodeid', 'pubsub_node_option(nodeid)'); | |
198 foreign_key('pubsub_node_option', 'nodeid', 'pubsub_node', 'nodeid'); | |
199 create_table('pubsub_node_owner', { | |
200 {'nodeid','bigint'}; | |
201 {'owner','text'}; | |
202 }); | |
203 create_index('i_pubsub_node_owner_nodeid', 'pubsub_node_owner(nodeid)'); | |
204 foreign_key('pubsub_node_owner', 'nodeid', 'pubsub_node', 'nodeid'); | |
205 create_table('pubsub_state', { | |
206 {'nodeid','bigint'}; | |
207 {'jid','text'}; | |
208 {'affiliation','character(1)'}; | |
209 {'subscriptions','text'}; | |
210 {'stateid','bigint','auto_increment','primary','key'}; | |
211 }); | |
212 create_index('i_pubsub_state_jid', 'pubsub_state(jid(60))'); | |
213 create_unique_index('i_pubsub_state_tuple', 'pubsub_state(nodeid, jid(60))'); | |
214 foreign_key('pubsub_state', 'nodeid', 'pubsub_node', 'nodeid'); | |
215 create_table('pubsub_item', { | |
216 {'nodeid','bigint'}; | |
217 {'itemid','text'}; | |
218 {'publisher','text'}; | |
219 {'creation','text'}; | |
220 {'modification','text'}; | |
221 {'payload','text'}; | |
222 }); | |
223 create_index('i_pubsub_item_itemid', 'pubsub_item(itemid(36))'); | |
224 create_unique_index('i_pubsub_item_tuple', 'pubsub_item(nodeid, itemid(36))'); | |
225 foreign_key('pubsub_item', 'nodeid', 'pubsub_node', 'nodeid'); | |
226 create_table('pubsub_subscription_opt', { | |
227 {'subid','text'}; | |
228 {'opt_name','varchar(32)'}; | |
229 {'opt_value','text'}; | |
230 }); | |
231 create_unique_index('i_pubsub_subscription_opt', 'pubsub_subscription_opt(subid(32), opt_name(32))');]] | |
232 return t_concat(q); | |
233 end | |
234 | |
235 local function init(dbh) | |
236 local q = build_query(); | |
237 for statement in q:gmatch("[^;]*;") do | |
238 statement = statement:gsub("\n", ""):gsub("\t", " "); | |
239 if sqlite then | |
240 statement = statement:gsub("AUTO_INCREMENT", "AUTOINCREMENT"); | |
241 statement = statement:gsub("auto_increment", "autoincrement"); | |
242 end | |
243 local result, err = DBI.Do(dbh, statement); | |
244 if not result then | |
245 print("X", result, err); | |
246 print("Y", statement); | |
247 end | |
248 end | |
249 end | |
250 | |
251 local _M = { init = init }; | |
252 return _M; |