Сообщения, полученные из порта в erlang-sqlite3 - PullRequest
2 голосов
/ 20 октября 2010

Erlang-sqlite3 использует драйвер порта для соединения с базой данных SQLite, а получает сообщения от порта :

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.

Я думал, что сообщения от портов должны выглядеть как this :

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

Итак, когда раскомментируете строку io:format в предложении {Port, Reply}, я должен ожидать увидеть {data, ...} для фактических ответов.Я не;вместо этого я вижу (для 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. Куда я иду не так?
  2. Будут ли сообщения, которые я получаю при ошибке порта, выглядеть как {'EXIT',Port,Reason} или нет?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

Соответствующий пример в http://www.erlang.org/doc/apps/erts/driver.html является последним. Оказывается, при использовании driver_output_term термин отправляется сам по себе:

receive
    Result ->
        Result
end.

вместо

receive
    {Port, {data, Result}} ->
        Result
end.
0 голосов
/ 21 октября 2010

Кажется, что между вашим процессом и портом находится другой процесс, который декодирует сообщения реального порта.Вы уверены, что Порт действительно Порт?Попробуйте io:format("Port: ~p~n", [Port]) Если вы увидите что-то вроде #Port<0.500>, это порт, если это будет что-то вроде <0.38.0>, то посередине человек.

...