annotate mod_mam_sql/mod_mam_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 c6b8ae5a8369
children 7dbde05b48a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- XEP-0313: Message Archive Management for Prosody
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2011-2012 Kim Alvefur
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 --
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- This file is MIT/X11 licensed.
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local xmlns_mam = "urn:xmpp:mam:tmp";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local xmlns_delay = "urn:xmpp:delay";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local xmlns_forward = "urn:xmpp:forward:0";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local st = require "util.stanza";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local rsm = module:require "mod_mam/rsm";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local jid_bare = require "util.jid".bare;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local jid_split = require "util.jid".split;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local jid_prep = require "util.jid".prep;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local host = module.host;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 local dm_load = require "util.datamanager".load;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local dm_store = require "util.datamanager".store;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local rm_load_roster = require "core.rostermanager".load_roster;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 local serialize, deserialize = require"util.json".encode, require"util.json".decode;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local unpack = unpack;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 local tostring = tostring;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 local time_now = os.time;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 local t_insert = table.insert;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local m_min = math.min;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local global_default_policy = module:get_option("default_archive_policy", false);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 -- TODO Should be possible to enforce it too
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 local sql, setsql, getsql = {};
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 do -- SQL stuff
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 local dburi;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local connection;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 local connections = module:shared "/*/sql/connection-cache";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 local build_url = require"socket.url".build;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 local resolve_relative_path = require "core.configmanager".resolve_relative_path;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local params = module:get_option("mam_sql", module:get_option("sql"));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 local function db2uri(params)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 return build_url{
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 scheme = params.driver,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 user = params.username,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 password = params.password,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 host = params.host,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 port = params.port,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 path = params.database,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 };
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51
1207
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
52 local connect
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
53
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local function test_connection()
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 if not connection then return nil; end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 if connection:ping() then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 return true;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 else
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 module:log("debug", "Database connection closed");
1207
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
60 module:log("debug", "Attempting to reconnect");
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 connection = nil;
1207
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
62 return connect();
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end
1207
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
65 function connect()
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 if not test_connection() then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 prosody.unlock_globals();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 local dbh, err = DBI.Connect(
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 params.driver, params.database,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 params.username, params.password,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 params.host, params.port
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 );
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 prosody.lock_globals();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 if not dbh then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 module:log("debug", "Database connection failed: %s", tostring(err));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 return nil, err;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 module:log("debug", "Successfully connected to database");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 dbh:autocommit(false); -- don't commit automatically
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 connection = dbh;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 connections[dburi] = dbh;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 return connection;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 do -- process options to get a db connection
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 local ok;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 prosody.unlock_globals();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 ok, DBI = pcall(require, "DBI");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 if not ok then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 package.loaded["DBI"] = {};
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 module:log("error", "Failed to load the LuaDBI library for accessing SQL databases: %s", DBI);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 module:log("error", "More information on installing LuaDBI can be found at http://prosody.im/doc/depends#luadbi");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 prosody.lock_globals();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 if not ok or not DBI.Connect then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 return; -- Halt loading of this module
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 params = params or { driver = "SQLite3" };
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 if params.driver == "SQLite3" then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 dburi = db2uri(params);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 connection = connections[dburi];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 assert(connect());
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 function getsql(sql, ...)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 if params.driver == "PostgreSQL" then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 sql = sql:gsub("`", "\"");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 end
1206
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
120 if not connection then
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
121 return nil, 'connection failed';
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
122 end
1207
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
123 if not test_connection() then
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
124 return nil, 'connection failed';
c6b8ae5a8369 mod_mam_sql: Reconnect if the connection should be dropped
Rob Hoelz <rob@hoelz.ro>
parents: 1206
diff changeset
125 end
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 -- do prepared statement stuff
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 local stmt, err = connection:prepare(sql);
1206
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
128 if not stmt and not test_connection() then
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
129 return nil, "connection failed";
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
130 end
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 -- run query
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 local ok, err = stmt:execute(...);
1206
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
134 if not ok and not test_connection() then
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
135 return nil, "connection failed";
04bf76c3e4c6 mod_mam_sql: Add better error handling
Rob Hoelz <rob@hoelz.ro>
parents: 819
diff changeset
136 end
819
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 if not ok then return nil, err; end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 return stmt;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 function setsql(sql, ...)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 local stmt, err = getsql(sql, ...);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 if not stmt then return stmt, err; end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 return stmt:affected();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 function sql.rollback(...)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 if connection then connection:rollback(); end -- FIXME check for rollback error?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 return ...;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 function sql.commit(...)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
151 if not connection:commit() then return nil, "SQL commit failed"; end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 return ...;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
154
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 -- For translating preference names from string to boolean and back
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 local default_attrs = {
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159 always = true, [true] = "always",
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
160 never = false, [false] = "never",
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 roster = "roster",
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
162 }
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 do
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165 local prefs_format = {
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 [false] = "roster",
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 -- default ::= true | false | "roster"
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 -- true = always, false = never, nil = global default
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 ["romeo@montague.net"] = true, -- always
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 ["montague@montague.net"] = false, -- newer
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171 };
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
174 local archive_store = "archive2";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
175 local prefs_store = archive_store .. "_prefs";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176 local function get_prefs(user)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
177 return dm_load(user, host, prefs_store) or
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 { [false] = global_default_policy };
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180 local function set_prefs(user, prefs)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 return dm_store(user, host, prefs_store, prefs);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
184
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185 -- Handle prefs.
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
186 module:hook("iq/self/"..xmlns_mam..":prefs", function(event)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
187 local origin, stanza = event.origin, event.stanza;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 local user = origin.username;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189 if stanza.attr.type == "get" then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 local prefs = get_prefs(user);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 local default = prefs[false];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 default = default ~= nil and default_attrs[default] or global_default_policy;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 local reply = st.reply(stanza):tag("prefs", { xmlns = xmlns_mam, default = default })
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194 local always = st.stanza("always");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 local never = st.stanza("never");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 for k,v in pairs(prefs) do
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 if k then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 (v and always or never):tag("jid"):text(k):up();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201 reply:add_child(always):add_child(never);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
202 origin.send(reply);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 else -- type == "set"
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 local prefs = {};
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 local new_prefs = stanza:get_child("prefs", xmlns_mam);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 local new_default = new_prefs.attr.default;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208 if new_default then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 prefs[false] = default_attrs[new_default];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 local always = new_prefs:get_child("always");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 if always then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 for rule in always:childtags("jid") do
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 local jid = rule:get_text();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 prefs[jid] = true;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
220 local never = new_prefs:get_child("never");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
221 if never then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
222 for rule in never:childtags("jid") do
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223 local jid = rule:get_text();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 prefs[jid] = false;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
225 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 local ok, err = set_prefs(user, prefs);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 if not ok then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 else
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232 origin.send(st.reply(stanza));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
236 end);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 -- Handle archive queries
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
239 module:hook("iq/self/"..xmlns_mam..":query", function(event)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240 local origin, stanza = event.origin, event.stanza;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
241 local query = stanza.tags[1];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
242 if stanza.attr.type == "get" then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
243 local qid = query.attr.queryid;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
244
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245 -- Search query parameters
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
246 local qwith = query:get_child_text("with");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
247 local qstart = query:get_child_text("start");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 local qend = query:get_child_text("end");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
249 local qset = rsm.get(query);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
250 module:log("debug", "Archive query, id %s with %s from %s until %s)",
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
251 tostring(qid), qwith or "anyone", qstart or "the dawn of time", qend or "now");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
253 if qstart or qend then -- Validate timestamps
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
254 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
255 if (qstart and not vstart) or (qend and not vend) then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
256 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
257 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
258 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
259 qstart, qend = vstart, vend;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
260 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
261
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
262 local qres;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
263 if qwith then -- Validate the 'with' jid
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
264 local pwith = qwith and jid_prep(qwith);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
265 if pwith and not qwith then -- it failed prepping
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID"))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
267 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
268 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
269 local _, _, resource = jid_split(qwith);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
270 qwith = jid_bare(pwith);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271 qres = resource;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
272 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 -- RSM stuff
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 local qmax = m_min(qset and qset.max or default_max_items, max_max_items);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 local last;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
277
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 local sql_query = ([[
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
279 SELECT `id`, `when`, `stanza`
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
280 FROM `prosodyarchive`
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
281 WHERE `host` = ? AND `user` = ? AND `store` = ?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
282 AND `when` BETWEEN ? AND ?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 %s %s
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
284 AND `id` > ?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
285 LIMIT ?;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
286 ]]):format(qwith and [[AND `with` = ?]] or "", qres and [[AND `resource` = ?]] or "")
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
287
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
288 local p = {
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
289 host, origin.username, archive_store,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
290 qstart or 0, qend or time_now(),
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
291 qset and tonumber(qset.after) or 0,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
292 qmax
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
293 };
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
294 if qwith then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
295 if qres then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
296 t_insert(p, 6, qres);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
297 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
298 t_insert(p, 6, qwith);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
299 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
300 local data, err = getsql(sql_query, unpack(p));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
301 if not data then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
302 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error loading archive: "..tostring(err)));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
303 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
304 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
306 for item in data:rows() do
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
307 local id, when, orig_stanza = unpack(item);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308 --module:log("debug", "id is %s", id);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
309
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 local fwd_st = st.message{ to = origin.full_jid }
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }):up()
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
312 :tag("forwarded", { xmlns = xmlns_forward })
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
313 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
314 orig_stanza = st.deserialize(deserialize(orig_stanza));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 orig_stanza.attr.xmlns = "jabber:client";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 fwd_st:add_child(orig_stanza);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 origin.send(fwd_st);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
318 last = id;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 -- That's all folks!
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 module:log("debug", "Archive query %s completed", tostring(qid));
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
322
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 local reply = st.reply(stanza);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
324 if last then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
325 -- This is a bit redundant, isn't it?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
326 reply:query(xmlns_mam):add_child(rsm.generate{last = last});
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
327 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
328 origin.send(reply);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329 return true
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
330 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
331 end);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
333 local function has_in_roster(user, who)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 local roster = rm_load_roster(user, host);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 module:log("debug", "%s has %s in roster? %s", user, who, roster[who] and "yes" or "no");
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 return roster[who];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339 local function shall_store(user, who)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340 -- TODO Cache this?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341 local prefs = get_prefs(user);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342 local rule = prefs[who];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
343 module:log("debug", "%s's rule for %s is %s", user, who, tostring(rule))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
344 if rule ~= nil then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
345 return rule;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
346 else -- Below could be done by a metatable
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 local default = prefs[false];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348 module:log("debug", "%s's default rule is %s", user, tostring(default))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
349 if default == nil then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
350 default = global_default_policy;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351 module:log("debug", "Using global default rule, %s", tostring(default))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
352 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
353 if default == "roster" then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
354 return has_in_roster(user, who);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
355 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
356 return default;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
357 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
358 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
359
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360 -- Handle messages
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361 local function message_handler(event, c2s)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
362 local origin, stanza = event.origin, event.stanza;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 local orig_type = stanza.attr.type or "normal";
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364 local orig_to = stanza.attr.to;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
365 local orig_from = stanza.attr.from;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
367 if not orig_from and c2s then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
368 orig_from = origin.full_jid;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
370 orig_to = orig_to or orig_from; -- Weird corner cases
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
371
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 -- Don't store messages of these types
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 if orig_type == "error"
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374 or orig_type == "headline"
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
375 or orig_type == "groupchat"
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 or not stanza:get_child("body") then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
377 return;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 -- TODO Maybe headlines should be configurable?
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
379 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381 local store_user, store_host = jid_split(c2s and orig_from or orig_to);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
382 local target_jid = c2s and orig_to or orig_from;
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
383 local target_bare = jid_bare(target_jid);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 local _, _, target_resource = jid_split(target_jid);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
385
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
386 if shall_store(store_user, target_bare) then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 module:log("debug", "Archiving stanza: %s", stanza:top_tag());
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 --local id = uuid();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
390 local when = time_now();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
391 -- And stash it
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
392 local ok, err = setsql([[
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
393 INSERT INTO `prosodyarchive`
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
394 (`host`, `user`, `store`, `when`, `with`, `resource`, `stanza`)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
395 VALUES (?, ?, ?, ?, ?, ?, ?);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
396 ]], store_host, store_user, archive_store, when, target_bare, target_resource, serialize(st.preserialize(stanza)))
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
397 if ok then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
398 sql.commit();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
399 else
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
400 module:log("error", "SQL error: %s", err);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
401 sql.rollback();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
403 --[[ This was dropped from the spec
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
404 if ok then
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
405 stanza:tag("archived", { xmlns = xmlns_mam, by = host, id = id }):up();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 --]]
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
408 else
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
409 module:log("debug", "Not archiving stanza: %s", stanza:top_tag());
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
410 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
411 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
412
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
413 local function c2s_message_handler(event)
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
414 return message_handler(event, true);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
415 end
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
416
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
417 -- Stanzas sent by local clients
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
418 module:hook("pre-message/bare", c2s_message_handler, 2);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
419 module:hook("pre-message/full", c2s_message_handler, 2);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
420 -- Stanszas to local clients
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
421 module:hook("message/bare", message_handler, 2);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
422 module:hook("message/full", message_handler, 2);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
423
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424 module:add_feature(xmlns_mam);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
425
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
426 -- In the telnet console, run:
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 -- >hosts["this host"].modules.mam_sql.environment.create_sql()
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428 function create_sql()
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
429 local stm = getsql[[
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430 CREATE TABLE `prosodyarchive` (
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 `host` TEXT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
432 `user` TEXT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433 `store` TEXT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
434 `id` INTEGER PRIMARY KEY AUTOINCREMENT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
435 `when` INTEGER,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436 `with` TEXT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
437 `resource` TEXT,
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
438 `stanza` TEXT
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
439 );
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
440 CREATE INDEX `hus` ON `prosodyarchive` (`host`, `user`, `store`);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
441 CREATE INDEX `with` ON `prosodyarchive` (`with`);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
442 CREATE INDEX `thetime` ON `prosodyarchive` (`when`);
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
443 ]];
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
444 stm:execute();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
445 sql.commit();
1e0d273bcb75 mod_mam_sql: Fork of mod_mam using SQL.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
446 end