2016-01-04 21 views
0

我试图在Riak中保存离线ejabberd消息。我早些时候遇到了连接到Riak的问题,但现在在这个论坛的帮助下解决了这些问题。但是现在,由于我对Erlang/ejabberd有限的理解,我没有把ejabberd包保存为一个字符串,然后放到Riak上。实际上,当offline_message_hook被锁存时,我采用Packet参数,然后希望为每个双引号放置一个反斜杠,以便我可以将此修订后的字符串保存为Riak上的字符串值。不过,我似乎正在努力修改传入的数据包以替换“与\”的字符。在Riak中存储ejabberd数据包

这是正确的做法吗?或者我在设计中错过了一些东西?我的应用程序依赖于xml格式,因此我应该使用p1_xml模块解析数据包,并在将其存储在Riak上之前使用提取的数据元素重建xml。

非常基本的和多个问题的道歉,但如果有人可以在这里抛出一些光明感谢!

,我使用传入数据包中,以尝试将“与\”替换的代码为:(它不相当的工作):

NewPacket = re:replace(Packet, "\"", "\\\"", [{return, list}, global]), 

所以基本上,我会被传递NewPacket作为一种价值给我的Riak电话。

+0

这个数据包可能已经在ejabberd中处理它们的地方被解析了。 –

+0

嗨@MickaëlRémond - 抱歉不明白 - 你的意思是说我应该利用xml模块从ejabberd数据包中提取数据点?当我在offline_message_hook上打印数据包时,我得到了类似于下面的内容 - 所以我相信我确实需要将它放在双引号中(如何?),然后放在Riak上,否则我应该使用xml解析器来提取/将数据保存在某个结构中? – vikram17000

+0

'{xmlel,<<"message">>,{{<<"type">>,<<"chat">>},{<<"id">>,<<“purplefe7f4130”>>},{<<"to">>,<<“[email protected]”>>} ],[{xmlel,<<"active">>,[<< http://jabber.org/protocol/chatstates >> >>}],[]},{xmlel,<<"body">>,[],[{xmlcdata ,<<“我的短信”>>}]}]}' – vikram17000

回答

1

ejabberd符合Riak,它已经在Riak中存储数据包。例如,mod_offline这样做。

您可以直接在ejabberd代码中找到如何做到这一点。例如,在mod_offline,这里是如何ejabberd店离线消息:

store_offline_msg(Host, {User, _}, Msgs, Len, MaxOfflineMsgs, 
        riak) -> 
    Count = if MaxOfflineMsgs =/= infinity -> 
        Len + count_offline_messages(User, Host); 
       true -> 0 
      end, 
    if 
     Count > MaxOfflineMsgs -> 
      discard_warn_sender(Msgs); 
     true -> 
      lists:foreach(
       fun(#offline_msg{us = US, 
           timestamp = TS} = M) -> 
         ejabberd_riak:put(M, offline_msg_schema(), 
             [{i, TS}, {'2i', [{<<"us">>, US}]}]) 
       end, Msgs) 
    end. 

ejabberd_riak:put/3的代码是:

put(Rec, RecSchema, IndexInfo) -> 
    Key = encode_key(proplists:get_value(i, IndexInfo, element(2, Rec))), 
    SecIdxs = [encode_index_key(K, V) || 
        {K, V} <- proplists:get_value('2i', IndexInfo, [])], 
    Table = element(1, Rec), 
    Value = encode_record(Rec, RecSchema), 
    case put_raw(Table, Key, Value, SecIdxs) of 
     ok -> 
      ok; 
     {error, _} = Error -> 
      log_error(Error, put, [{record, Rec}, 
            {index_info, IndexInfo}]), 
      Error 
    end. 

put_raw(Table, Key, Value, Indexes) -> 
    Bucket = make_bucket(Table), 
    Obj = riakc_obj:new(Bucket, Key, Value, "application/x-erlang-term"), 
    Obj1 = if Indexes /= [] -> 
        MetaData = dict:store(<<"index">>, Indexes, dict:new()), 
        riakc_obj:update_metadata(Obj, MetaData); 
       true -> 
        Obj 
      end, 
    catch riakc_pb_socket:put(get_random_pid(), Obj1). 

您应该已经正确的API做你想做的事,ejabberd有关Riak数据包存储。

+0

非常感谢@MickaëlRémond - 这非常有帮助...非常感谢。我应该自己做足够的研究,以便能够弄清楚......在mod_offline中被store_packet方法误导,实际上我无法理解。 – vikram17000