2016-01-04 2 views
0

Я пытаюсь сохранить автономные сообщения ejabberd в Riak. Раньше у меня были проблемы с подключением к Riak, но теперь они разрешаются с помощью этого форума. Но теперь, с моим ограниченным пониманием Erlang/ejabberd, я не могу получить пакет ejabberd, сохраненный как строка, а затем надеть Riak. По сути, когда offline_message_hook заперт, я беру аргумент Packet, а затем хочу поместить обратную косую черту для каждой двойной кавычки, чтобы затем я мог взять эту исправленную строку и сохранить как строковое значение на Riak. Однако я, кажется, борюсь с изменением входящего пакета, чтобы заменить «символы с».Хранение пакетов ejabberd в Riak

Это правильный подход? Или я что-то пропустил в своем дизайне? Мое приложение опирается на формат xml, поэтому вместо этого я должен анализировать пакет с помощью модуля p1_xml и восстанавливать xml, используя извлеченные элементы данных, прежде чем хранить его на Riak.

Извините за самые простые и многочисленные вопросы, но оцените, если кто-то может пролить свет здесь!

Код, который я использую, чтобы попытаться заменить «с \» во входящем пакете: (это не делает достаточно работы):

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">>, [{<<"xmlns">>, << "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 - это очень полезно ... высоко ценится. Я должен был сделать достаточное исследование, чтобы понять это ... введя в заблуждение метод store_packet в mod_offline, который я не мог понять. – vikram17000