Question

Erlang-sqlite3 utilise un pilote de port pour communiquer avec la base de données SQLite, et reçoit des messages du port :

wait_result(Port) ->
  receive
    {Port, Reply} ->
      % io:format("Reply: ~p~n", [Reply]),
      Reply;
    {error, Reason} ->
      io:format("Error: ~p~n", [Reason]),
      {error, Reason};
    _Else ->
      io:format("Else: ~p~n", [_Else]),
      _Else
  end.

Je pense que les messages de ports devraient ressembler à cette :

{Port,{data,Data}}    Data is received from the external program.
{Port,closed}         Reply to Port ! {Pid,close}.
{Port,connected}      Reply to Port ! {Pid,{connect,NewPid}}
{'EXIT',Port,Reason}  If the port has terminated for some reason.

Alors, quand décommentant la ligne io:format à la clause de {Port, Reply}, j'attendre à voir {data, ...} des réponses réelles. Je ne; au lieu que je vois (pour test.erl)

Reply: {ok,101}
Reply: [{columns,["name"]},{rows,[{<<"user">>}]}]
Reply: [{columns,["sql"]},
        {rows,[{<<"CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, wage INTEGER)">>}]}]
Reply: {id,1}
Reply: {id,2}
Reply: [{columns,["id","name","age","wage"]},
        {rows,[{1,<<"abby">>,20,2000},{2,<<"marge">>,30,2000}]}]
Reply: [{columns,["id","name","age","wage"]},{rows,[{1,<<"abby">>,20,2000}]}]
Reply: [{columns,["id","name","age","wage"]},
        {rows,[{1,<<"abby">>,20,2000},{2,<<"marge">>,30,2000}]}]
Reply: {ok,101}
Reply: [{columns,["id","name","age","wage"]},{rows,[{1,<<"abby">>,20,2000}]}]
Reply: {ok,101}
  1. Où vais-je tort?
  2. Messages Aurais-je sur un regard d'erreur de port comme {'EXIT',Port,Reason} ou non?
Était-ce utile?

La solution 2

L'exemple pertinent dans http://www.erlang.org/doc/ apps / erts / driver.html est le dernier. Il se trouve que lors de l'utilisation driver_output_term, le terme est envoyé par lui-même:

receive
    Result ->
        Result
end.

au lieu de

receive
    {Port, {data, Result}} ->
        Result
end.

Autres conseils

Il semble qu'entre votre processus et le port est un autre processus impliqué qui décode les messages réels du port. Êtes-vous sûr que le port est vraiment Port ?. Essayez io:format("Port: ~p~n", [Port]) Si vous voyez quelque chose comme #Port<0.500> il est le port, si ce sera quelque chose comme <0.38.0> il y a l'homme au milieu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top