2016-01-04 4 views
0

J'essaie d'enregistrer des messages ejabberd hors connexion dans Riak. J'avais auparavant des problèmes de connexion à Riak mais ceux-ci sont résolus maintenant avec l'aide de ce forum. Mais maintenant, avec ma compréhension limitée d'Erlang/ejabberd, je n'arrive pas à enregistrer le paquet ejabberd sous forme de chaîne, puis à le mettre sur Riak. Essentiellement, lorsque le mode offline_message_hook est verrouillé, je prends l'argument Packet et je veux ensuite mettre une barre oblique inverse pour chaque double guillemet, afin que je puisse ensuite prendre cette chaîne révisée et la sauvegarder en tant que valeur de chaîne sur Riak. Cependant, je semble avoir du mal à modifier le paquet entrant pour remplacer les "chars with \".Stockage des paquets ejabberd dans Riak

Est-ce la bonne approche? Ou est-ce qu'il me manque quelque chose dans mon design? Mon application repose sur le format xml, donc je devrais plutôt analyser le paquet en utilisant le module p1_xml et reconstruire le xml en utilisant les éléments de données extraits avant de le stocker sur Riak.

Excuses pour les questions très basiques et multiples mais apprécient si quelqu'un peut jeter de la lumière ici!

Le code que j'utilise pour essayer de remplacer le « avec \ » dans le paquet entrant est: (cela ne fonctionne pas tout à fait):

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

Donc, essentiellement, je passerai la NewPacket en tant que valeur à mes appels Riak.

+0

Les paquets sont probablement déjà analysés là où vous les avez traités dans ejabberd. –

+0

Salut @ MickaëlRémond - désolé n'a pas compris - voulez-vous dire que je devrais tirer parti du module xml pour extraire les points de données du paquet ejabberd? Quand j'imprime le paquet à offline_message_hook, je reçois quelque chose comme ci-dessous - donc je crois que je dois soit mettre cela entre guillemets doubles (comment?) Et ensuite mettre sur Riak, ou bien je devrais utiliser l'analyseur xml pour extraire/enregistrer les données dans une structure? – vikram17000

+0

'{xmlel, <<"message">>, [{<<"type">], <<"chat">>}, {<<"id">>, <<" purplefe7f4130 ">>}, {<<"to">>, <<" [email protected] ">>} ], [{xmlel, <<"active">>, [{<<"xmlns">>], << "http://jabber.org/protocol/chatstates" >>}], []}, {xmlel, <<"body">>, [], [{xmlcdata , << "mon message texte" >>}]}]} ' – vikram17000

Répondre

1

ejabberd est compatible avec Riak et il stocke déjà des paquets dans Riak. Par exemple, mod_offline fait cela.

Vous pouvez regarder directement dans le code ejabberd pour trouver comment faire cela. Par exemple, dans mod_offline, voici comment magasin ejabberd le message hors-ligne:

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. 

Le code de ejabberd_riak:put/3 est:

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). 

Vous devriez déjà avoir l'API appropriée pour faire ce que vous voulez dans ejabberd en ce qui concerne Riak paquet de stockage.

+0

Merci beaucoup @ MickaëlRémond - c'est très utile ... très apprécié. J'aurais dû faire des recherches suffisantes pour avoir été capable de comprendre cela ... j'ai été trompé par la méthode store_packet dans mod_offline que je ne pouvais pas comprendre. – vikram17000