Software /
code /
prosody-modules
Comparison
mod_archive/mod_archive.lua @ 233:4ff8068b4d94
mod_archive: fixed some serious bugs.
author | shinysky<shinysky1986(AT)gmail.com> |
---|---|
date | Wed, 04 Aug 2010 12:36:27 +0800 |
parent | 230:0b9e8721b9c2 |
child | 237:d900be0dee3e |
comparison
equal
deleted
inserted
replaced
232:0ca669b18ef3 | 233:4ff8068b4d94 |
---|---|
40 | 40 |
41 local function os_date() | 41 local function os_date() |
42 return os.date("!*t"); | 42 return os.date("!*t"); |
43 end | 43 end |
44 | 44 |
45 local function date_time(t) | 45 local function date_time(localtime) |
46 return datetime.datetime(t); | 46 return datetime.datetime(localtime); |
47 end | |
48 | |
49 local function date_format(s) | |
50 return os.date("%Y-%m-%dT%H:%M:%SZ", s); | |
47 end | 51 end |
48 | 52 |
49 local function date_parse(s) | 53 local function date_parse(s) |
50 local year, month, day, hour, min, sec = s:match("(....)-?(..)-?(..)T(..):(..):(..)Z"); | 54 local year, month, day, hour, min, sec = s:match("(....)-?(..)-?(..)T(..):(..):(..)Z"); |
51 return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec}); | 55 return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec}); |
58 end | 62 end |
59 | 63 |
60 -- local function list_push(node, host, collection) | 64 -- local function list_push(node, host, collection) |
61 -- local data = dm.list_load(node, host, ARCHIVE_DIR); | 65 -- local data = dm.list_load(node, host, ARCHIVE_DIR); |
62 -- if data then | 66 -- if data then |
63 -- table.insert(data, collection, 1); | 67 -- table.insert(data, 1, collection); |
64 -- dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); | 68 -- dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); |
65 -- else | 69 -- else |
66 -- dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); | 70 -- dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); |
67 -- end | 71 -- end |
68 -- end | 72 -- end |
72 if data then | 76 if data then |
73 local s, e = 1, #data; | 77 local s, e = 1, #data; |
74 while true do | 78 while true do |
75 local c = st.deserialize(data[s]); | 79 local c = st.deserialize(data[s]); |
76 if collection.attr["start"] >= c.attr["start"] then | 80 if collection.attr["start"] >= c.attr["start"] then |
77 table.insert(data, collection, s); | 81 table.insert(data, s, collection); |
78 break; | 82 break; |
79 end | 83 end |
80 c = st.deserialize(data[e]); | 84 c = st.deserialize(data[e]); |
81 if collection.attr["start"] <= c.attr["start"] then | 85 if collection.attr["start"] <= c.attr["start"] then |
82 table.insert(data, collection, e+1); | 86 table.insert(data, e+1, collection); |
83 break; | 87 break; |
84 end | 88 end |
85 local m = math.floor((s + e) / 2); | 89 local m = math.floor((s + e) / 2); |
86 c = st.deserialize(data[m]); | 90 c = st.deserialize(data[m]); |
87 if collection.attr["start"] > c.attr["start"] then | 91 if collection.attr["start"] > c.attr["start"] then |
88 e = m - 1; | 92 e = m - 1; |
89 elseif collection.attr["start"] < c.attr["start"] then | 93 elseif collection.attr["start"] < c.attr["start"] then |
90 s = m + 1; | 94 s = m + 1; |
91 else | 95 else |
92 table.insert(data, collection, m); | 96 table.insert(data, m, collection); |
93 break; | 97 break; |
94 end | 98 end |
95 end | 99 end |
96 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); | 100 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); |
97 else | 101 else |
105 local data = dm.list_load(node, host, ARCHIVE_DIR); | 109 local data = dm.list_load(node, host, ARCHIVE_DIR); |
106 local tag = isfrom and "from" or "to"; | 110 local tag = isfrom and "from" or "to"; |
107 local with = isfrom and msg.attr.to or msg.attr.from; | 111 local with = isfrom and msg.attr.to or msg.attr.from; |
108 local utc = os_date(); | 112 local utc = os_date(); |
109 local utc_secs = os.time(utc); | 113 local utc_secs = os.time(utc); |
110 local utc_datetime = date_time(utc); | 114 local utc_datetime = date_format(utc_secs); |
111 if data then | 115 if data then |
112 -- The collection list are in REVERSE chronological order | 116 -- The collection list are in REVERSE chronological order |
113 for k, v in ipairs(data) do | 117 for k, v in ipairs(data) do |
114 local collection = st.deserialize(v); | 118 local collection = st.deserialize(v); |
115 local do_save = function() | 119 local do_save = function() |
134 return; | 138 return; |
135 end | 139 end |
136 else | 140 else |
137 local dt = os.difftime(utc_secs, date_parse(collection.attr["start"])); | 141 local dt = os.difftime(utc_secs, date_parse(collection.attr["start"])); |
138 if dt >= 14400 then break end | 142 if dt >= 14400 then break end |
139 if collection.attr["with"] == with then | 143 if collection.attr["with"] == with then -- JID matching? |
140 do_save(); | 144 do_save(); |
141 return; | 145 return; |
142 end | 146 end |
143 end | 147 end |
144 end | 148 end |
418 end | 422 end |
419 | 423 |
420 ------------------------------------------------------------ | 424 ------------------------------------------------------------ |
421 -- Archive Management | 425 -- Archive Management |
422 ------------------------------------------------------------ | 426 ------------------------------------------------------------ |
423 local function match_jid(rule, jid) | 427 local function match_jid(rule, id) |
424 return not rule or jid.compare(jid, rule); | 428 return not rule or jid.compare(id, rule); |
425 end | 429 end |
426 | 430 |
427 local function is_earlier(start, coll_start) | 431 local function is_earlier(start, coll_start) |
428 return not start or start <= coll_start; | 432 return not start or start <= coll_start; |
429 end | 433 end |