Mercurial > prosody-modules
annotate mod_mam_muc_sql/mod_mam_muc_sql.lua @ 1268:854a3933cfcd
mod_muc_log_http: URL-encode room names. This allows special characters in room names to work. Ideally this escaping shouldn’t be done in the user visible content, but the module’s template system doesn’t currently allow that.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 04 Jan 2014 16:50:57 -0500 |
parents | 87e847280aef |
children | 7dbde05b48a9 |
rev | line source |
---|---|
821
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 -- XEP-0313: Message Archive Management for Prosody |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 -- Copyright (C) 2011-2012 Kim Alvefur |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 -- |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- This file is MIT/X11 licensed. |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 local xmlns_mam = "urn:xmpp:mam:tmp"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 local xmlns_delay = "urn:xmpp:delay"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local xmlns_forward = "urn:xmpp:forward:0"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 local st = require "util.stanza"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local rsm = module:require "mod_mam/rsm"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local jid_bare = require "util.jid".bare; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 local jid_split = require "util.jid".split; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 local jid_prep = require "util.jid".prep; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 local host = module.host; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 local serialize, deserialize = require"util.json".encode, require"util.json".decode; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 local unpack = unpack; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 local tostring = tostring; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 local time_now = os.time; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 local t_insert = table.insert; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 local m_min = math.min; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 --local rooms_to_archive = module:get_option_set("rooms_to_archive",{}); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 local sql, setsql, getsql = {}; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 do -- SQL stuff |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 local dburi; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 local connection; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 local connections = module:shared "/*/sql/connection-cache"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 local build_url = require"socket.url".build; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 local resolve_relative_path = require "core.configmanager".resolve_relative_path; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 local params = module:get_option("mam_sql", module:get_option("sql")); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 local function db2uri(params) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 return build_url{ |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 scheme = params.driver, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 user = params.username, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 password = params.password, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 host = params.host, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 port = params.port, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 path = params.database, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 }; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 local function test_connection() |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 if not connection then return nil; end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 if connection:ping() then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 return true; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 else |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 module:log("debug", "Database connection closed"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 connection = nil; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 connections[dburi] = nil; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 local function connect() |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 if not test_connection() then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 prosody.unlock_globals(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 local dbh, err = DBI.Connect( |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 params.driver, params.database, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 params.username, params.password, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 params.host, params.port |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 ); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 prosody.lock_globals(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 if not dbh then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 module:log("debug", "Database connection failed: %s", tostring(err)); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 return nil, err; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 module:log("debug", "Successfully connected to database"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 dbh:autocommit(false); -- don't commit automatically |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 connection = dbh; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 connections[dburi] = dbh; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 return connection; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 do -- process options to get a db connection |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 local ok; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 prosody.unlock_globals(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 ok, DBI = pcall(require, "DBI"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 if not ok then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 package.loaded["DBI"] = {}; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 module:log("error", "Failed to load the LuaDBI library for accessing SQL databases: %s", DBI); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 module:log("error", "More information on installing LuaDBI can be found at http://prosody.im/doc/depends#luadbi"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 prosody.lock_globals(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 if not ok or not DBI.Connect then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 return; -- Halt loading of this module |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 params = params or { driver = "SQLite3" }; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 if params.driver == "SQLite3" then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 dburi = db2uri(params); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 connection = connections[dburi]; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 assert(connect()); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 function getsql(sql, ...) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 if params.driver == "PostgreSQL" then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 sql = sql:gsub("`", "\""); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 -- do prepared statement stuff |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 local stmt, err = connection:prepare(sql); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 if not stmt and not test_connection() then error("connection failed"); end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 -- run query |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 local ok, err = stmt:execute(...); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 if not ok and not test_connection() then error("connection failed"); end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 if not ok then return nil, err; end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 return stmt; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 function setsql(sql, ...) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 local stmt, err = getsql(sql, ...); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 if not stmt then return stmt, err; end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 return stmt:affected(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 function sql.rollback(...) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 if connection then connection:rollback(); end -- FIXME check for rollback error? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 return ...; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 function sql.commit(...) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 if not connection:commit() then return nil, "SQL commit failed"; end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 return ...; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 local archive_store = "archive2"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 -- Handle archive queries |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 module:hook("iq/bare/"..xmlns_mam..":query", function(event) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 local origin, stanza = event.origin, event.stanza; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 local room = jid_split(stanza.attr.to); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 local query = stanza.tags[1]; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 local room_obj = hosts[module.host].modules.muc.rooms[jid_bare(stanza.attr.to)]; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 if not room_obj then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 return -- FIXME not found |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 local from = jid_bare(stanza.attr.from); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 if room_obj._affiliations[from] == "outcast" |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 or room_obj._data.members_only and not room_obj._affiliations[from] then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 return -- FIXME unauth |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 if stanza.attr.type == "get" then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 local qid = query.attr.queryid; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 -- Search query parameters |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 local qwith = query:get_child_text("with"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 local qstart = query:get_child_text("start"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 local qend = query:get_child_text("end"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 local qset = rsm.get(query); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 module:log("debug", "Archive query, id %s with %s from %s until %s)", |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 tostring(qid), qwith or "anyone", qstart or "the dawn of time", qend or "now"); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 if qstart or qend then -- Validate timestamps |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend)) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 if (qstart and not vstart) or (qend and not vend) then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp")) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 return true |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 qstart, qend = vstart, vend; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
177 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 local qres; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 if qwith then -- Validate the 'with' jid |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 local pwith = qwith and jid_prep(qwith); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 if pwith and not qwith then -- it failed prepping |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID")) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 return true |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 local _, _, resource = jid_split(qwith); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 qwith = jid_bare(pwith); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 qres = resource; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 -- RSM stuff |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 local qmax = m_min(qset and qset.max or default_max_items, max_max_items); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 local first, last; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
193 local n = 0; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 local sql_query = ([[ |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 SELECT `id`, `when`, `stanza` |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 FROM `prosodyarchive` |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 WHERE `host` = ? AND `user` = ? AND `store` = ? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 AND `when` BETWEEN ? AND ? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 %s |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 AND `id` > ? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 LIMIT ?; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
203 ]]):format(qres and [[AND `resource` = ?]] or "") |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 local p = { |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 host, room, archive_store, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 qstart or 0, qend or time_now(), |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 qset and tonumber(qset.after) or 0, |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 qmax |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
210 }; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 if qres then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 t_insert(p, 6, qres); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 module:log("debug", "getsql(sql_query, "..table.concat(p, ", ")); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 local data, err = getsql(sql_query, unpack(p)); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 if not data then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error loading archive: "..tostring(err))); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
218 return true |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
219 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 for item in data:rows() do |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 local id, when, orig_stanza = unpack(item); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 --module:log("debug", "id is %s", id); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 local fwd_st = st.message{ to = stanza.attr.from, from = stanza.attr.to } |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }):up() |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 :tag("forwarded", { xmlns = xmlns_forward }) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 orig_stanza = st.deserialize(deserialize(orig_stanza)); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 orig_stanza.attr.xmlns = "jabber:client"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 fwd_st:add_child(orig_stanza); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
232 origin.send(fwd_st); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 last = id; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 n = n + 1; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 if not first then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 first = id; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 -- That's all folks! |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 module:log("debug", "Archive query %s completed", tostring(qid)); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 local reply = st.reply(stanza); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 if last then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 -- This is a bit redundant, isn't it? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 reply:query(xmlns_mam):add_child(rsm.generate{first = first, last = last, count = n}); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 origin.send(reply); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 return true |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
249 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 end); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
251 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
252 -- Handle messages |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
253 local function message_handler(event) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
254 local origin, stanza = event.origin, event.stanza; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
255 local orig_type = stanza.attr.type or "normal"; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 local orig_to = stanza.attr.to; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 local orig_from = stanza.attr.from; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
258 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 -- Still needed? |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
260 if not orig_from then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
261 orig_from = origin.full_jid; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
262 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
263 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
264 -- Only store groupchat messages |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
265 if not (orig_type == "groupchat" and (stanza:get_child("body") or stanza:get_child("subject"))) then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
266 return; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
267 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
268 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
269 local room = jid_split(orig_to); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 local room_obj = hosts[host].modules.muc.rooms[orig_to] |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 if not room_obj then return end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
272 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
273 local when = time_now(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
274 local stanza = st.clone(stanza); -- Private copy |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
275 --stanza.attr.to = nil; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
276 local nick = room_obj._jid_nick[orig_from]; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
277 if not nick then return end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
278 stanza.attr.from = nick; |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
279 local _, _, nick = jid_split(nick); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
280 -- And stash it |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
281 local ok, err = setsql([[ |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
282 INSERT INTO `prosodyarchive` |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
283 (`host`, `user`, `store`, `when`, `resource`, `stanza`) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
284 VALUES (?, ?, ?, ?, ?, ?); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 ]], host, room, archive_store, when, nick, serialize(st.preserialize(stanza))) |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
286 if ok then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
287 sql.commit(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
288 else |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 module:log("error", "SQL error: %s", err); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
290 sql.rollback(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
291 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
292 --[[ This was dropped from the spec |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
293 if ok then |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 stanza:tag("archived", { xmlns = xmlns_mam, by = host, id = id }):up(); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 --]] |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 end |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
298 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
299 module:hook("message/bare", message_handler, 2); |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
300 |
87e847280aef
mod_mam_muc_sql: SQL variant of mod_mam_muc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
301 module:add_feature(xmlns_mam); |