@ -1,8 +1,6 @@ | |||||
{erl_opts, [{i, "include"}]}. | {erl_opts, [{i, "include"}]}. | ||||
{edoc_opts, [{preprocess, true}]}. | |||||
{deps, [ | {deps, [ | ||||
{eVPack, {git, "http://192.168.0.88:53000/SisMaker/eVPack.git", {branch, master}}} | {eVPack, {git, "http://192.168.0.88:53000/SisMaker/eVPack.git", {branch, master}}} | ||||
%%{jiffy, {git, "https://github.com/davisp/jiffy.git", {tag, "1.0.5"}}} | |||||
%% {jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "v3.0.0"}}} | |||||
]}. | ]}. | ||||
@ -0,0 +1,196 @@ | |||||
-module(agVstProtoPl). | |||||
-include("agVstCli.hrl"). | |||||
-compile(inline). | |||||
-compile({inline_size, 128}). | |||||
-export([ | |||||
request/7 | |||||
, response/7 | |||||
]). | |||||
-spec request(boolean(), method(), binary(), path(), queryPars(), headers(), body()) -> iolist(). | |||||
request(false, Method, DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, DbName, Method, Path, QueryPars, Headers]), Body]; | |||||
request(_, Method, _DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, <<"/_db/_system">>, Method, Path, QueryPars, Headers]), Body]. | |||||
-spec response(AgStatus :: pos_integer(), MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary(), Data :: binary()) -> | |||||
{?AgUndef, DoneCnt :: pos_integer()} | | |||||
{?AgCHeader, DoneCnt :: pos_integer(), ChunkBuffer :: binary()} | | |||||
{?AgCBodyStart, DoneCnt :: pos_integer(), MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary()} | | |||||
{?AgCBodyGoOn, DoneCnt :: pos_integer(), ChunkBuffer :: binary}. | |||||
response(?AgUndef, DoneCnt, _MessageId, _ChunkIdx, _ChunkSize, _ChunkBuffer, DataBuffer) -> | |||||
case DataBuffer of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBuffer/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBuffer), | |||||
ChunkSize = Length - ?AgHeaderSize, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, LeftBuffer), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt} | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer}; | |||||
true -> | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer} | |||||
end; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<ChunkBin:ChunkSize/binary, NextBuffer/binary>> = LeftBuffer, | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer); | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, ChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer) | |||||
end | |||||
end | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, DoneCnt, DataBuffer} | |||||
end; | |||||
response(?AgCHeader, DoneCnt, _MessageId, _ChunkIdx, _ChunkSize, ChunkBuffer, DataBuffer) -> | |||||
NewDataBuffer = <<ChunkBuffer/binary, DataBuffer/binary>>, | |||||
case NewDataBuffer of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBuffer/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBuffer), | |||||
ChunkSize = Length - ?AgHeaderSize, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, LeftBuffer), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt} | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer}; | |||||
true -> | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer} | |||||
end; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<ChunkBin:ChunkSize/binary, NextBuffer/binary>> = LeftBuffer, | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer); | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, ChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer) | |||||
end | |||||
end | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, DoneCnt, NewDataBuffer} | |||||
end; | |||||
response(?AgCBody, DoneCnt, MessageId, ChunkIdx, ChunkSize, ChunkBuffer, DataBuffer) -> | |||||
NewCkBuffer = <<ChunkBuffer/binary, DataBuffer/binary>>, | |||||
ByteSize = erlang:byte_size(NewCkBuffer), | |||||
if | |||||
ChunkSize == ByteSize -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
if | |||||
ChunkIdx >= ChunkCnt -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, NewCkBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
ChunkIdx < ChunkCnt -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, NewCkBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 11 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_chunkIdx} | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
{?AgCBodyGoOn, DoneCnt, NewCkBuffer}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<LastChunkBin:ChunkSize/binary, LeftBin/binary>> = NewCkBuffer, | |||||
if | |||||
ChunkIdx >= ChunkCnt -> | |||||
<<LastChunkBin:ChunkSize/binary, LeftBin/binary>> = NewCkBuffer, | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LastChunkBin/binary>>), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, LeftBin); | |||||
ChunkIdx < ChunkCnt -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LastChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, LeftBin); | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 11 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_chunkIdx} | |||||
end | |||||
end. |
@ -0,0 +1,196 @@ | |||||
-module(agVstProtoSp). | |||||
-include("agVstCli.hrl"). | |||||
-compile(inline). | |||||
-compile({inline_size, 128}). | |||||
-export([ | |||||
request/7 | |||||
, response/7 | |||||
]). | |||||
-spec request(boolean(), method(), binary(), path(), queryPars(), headers(), body()) -> iolist(). | |||||
request(false, Method, DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, DbName, Method, Path, QueryPars, Headers]), Body]; | |||||
request(_, Method, _DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, <<"/_db/_system">>, Method, Path, QueryPars, Headers]), Body]. | |||||
-spec response(AgStatus :: pos_integer(), MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary(), Data :: binary()) -> | |||||
{?AgUndef, DoneCnt :: pos_integer()} | | |||||
{?AgCHeader, DoneCnt :: pos_integer(), ChunkBuffer :: binary()} | | |||||
{?AgCBodyStart, DoneCnt :: pos_integer(), MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary()} | | |||||
{?AgCBodyGoOn, DoneCnt :: pos_integer(), ChunkBuffer :: binary}. | |||||
response(?AgUndef, DoneCnt, _MessageId, _ChunkIdx, _ChunkSize, _ChunkBuffer, DataBuffer) -> | |||||
case DataBuffer of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBuffer/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBuffer), | |||||
ChunkSize = Length - ?AgHeaderSize, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, LeftBuffer), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt} | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer}; | |||||
true -> | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer} | |||||
end; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<ChunkBin:ChunkSize/binary, NextBuffer/binary>> = LeftBuffer, | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer); | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, ChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer) | |||||
end | |||||
end | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, DoneCnt, DataBuffer} | |||||
end; | |||||
response(?AgCHeader, DoneCnt, _MessageId, _ChunkIdx, _ChunkSize, ChunkBuffer, DataBuffer) -> | |||||
NewDataBuffer = <<ChunkBuffer/binary, DataBuffer/binary>>, | |||||
case NewDataBuffer of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBuffer/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBuffer), | |||||
ChunkSize = Length - ?AgHeaderSize, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, LeftBuffer), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt} | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer}; | |||||
true -> | |||||
{?AgCBodyStart, DoneCnt, MessageId, 1, ChunkSize, LeftBuffer} | |||||
end; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<ChunkBin:ChunkSize/binary, NextBuffer/binary>> = LeftBuffer, | |||||
if | |||||
IsFirst == ChunkX -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBuffer), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer); | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkX >= ChunkCnt of | |||||
true -> | |||||
agAgencyUtils:agencyReply(MessageId, ChunkBin), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, NextBuffer); | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, ChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, NextBuffer) | |||||
end | |||||
end | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, DoneCnt, NewDataBuffer} | |||||
end; | |||||
response(?AgCBody, DoneCnt, MessageId, ChunkIdx, ChunkSize, ChunkBuffer, DataBuffer) -> | |||||
NewCkBuffer = <<ChunkBuffer/binary, DataBuffer/binary>>, | |||||
ByteSize = erlang:byte_size(NewCkBuffer), | |||||
if | |||||
ChunkSize == ByteSize -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
if | |||||
ChunkIdx >= ChunkCnt -> | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, NewCkBuffer/binary>>), | |||||
{?AgUndef, DoneCnt + 1}; | |||||
ChunkIdx < ChunkCnt -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, NewCkBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
{?AgUndef, DoneCnt}; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 11 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_chunkIdx} | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
{?AgCBodyGoOn, DoneCnt, NewCkBuffer}; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
<<LastChunkBin:ChunkSize/binary, LeftBin/binary>> = NewCkBuffer, | |||||
if | |||||
ChunkIdx >= ChunkCnt -> | |||||
<<LastChunkBin:ChunkSize/binary, LeftBin/binary>> = NewCkBuffer, | |||||
agAgencyUtils:agencyReply(MessageId, <<MsgBuffer/binary, LastChunkBin/binary>>), | |||||
response(?AgUndef, DoneCnt + 1, 0, 0, 0, <<>>, LeftBin); | |||||
ChunkIdx < ChunkCnt -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LastChunkBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
response(?AgUndef, DoneCnt, 0, 0, 0, <<>>, LeftBin); | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 11 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_chunkIdx} | |||||
end | |||||
end. |
@ -1,138 +0,0 @@ | |||||
-module(agVstProtocol). | |||||
-include("agVstCli.hrl"). | |||||
-compile(inline). | |||||
-compile({inline_size, 128}). | |||||
-export([ | |||||
request/7 | |||||
, response/6 | |||||
]). | |||||
-spec request(boolean(), method(), binary(), path(), queryPars(), headers(), body()) -> iolist(). | |||||
request(false, Method, DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, DbName, Method, Path, QueryPars, Headers]), Body]; | |||||
request(_, Method, _DbName, Path, QueryPars, Headers, Body) -> | |||||
[eVPack:encode([1, 1, <<"/_db/_system">>, Method, Path, QueryPars, Headers]), Body]. | |||||
-spec response(AgStatus :: pos_integer(), MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary(), Data :: binary()) -> | |||||
?AgCDone | | |||||
{?AgCHeader, ChunkBuffer :: binary()} | | |||||
{?AgMDone, MsgBuffer :: binary()} | | |||||
{?AgCBodyStart, MessageId :: pos_integer(), ChunkIdx :: pos_integer(), ChunkSize :: pos_integer(), ChunkBuffer :: binary()} | | |||||
{?AgCBodyGoOn, ChunkBuffer} | | |||||
error(). | |||||
response(?AgCUndef, _MessageId, _ChunkIdx, _ChunkSize, _ChunkBuffer, Data) -> | |||||
case Data of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBin/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBin), | |||||
ChunkSize = Length - 24, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
{?AgMDone, LeftBin}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBin), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
?AgCDone; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkCnt == ChunkX of | |||||
true -> | |||||
{?AgMDone, <<MsgBuffer/binary, LeftBin/binary>>}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
?AgCDone | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, MessageId, 1, ChunkSize, LeftBin}; | |||||
true -> | |||||
{?AgCBodyStart, MessageId, 1, ChunkSize, LeftBin} | |||||
end; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_undef, "there is not should come ~p ~p ~p ~n", [ByteSize, ChunkSize, {Length, ChunkX, IsFirst, MessageId}]), | |||||
{error, error_bad_size} | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, Data} | |||||
end; | |||||
response(?AgCHeader, _MessageId, _ChunkIdx, _ChunkSize, ChunkBuffer, Data) -> | |||||
NewData = <<ChunkBuffer/binary, Data/binary>>, | |||||
case NewData of | |||||
<<Length:32/integer-little-unsigned, ChunkX:31/integer-little-unsigned, IsFirst:1/integer-little-unsigned, MessageId:64/integer-little-unsigned, _MessageLength:64/integer-little-unsigned, LeftBin/binary>> -> | |||||
ByteSize = erlang:byte_size(LeftBin), | |||||
ChunkSize = Length - 24, | |||||
if | |||||
ByteSize == ChunkSize -> | |||||
if | |||||
IsFirst == ChunkX -> | |||||
{?AgMDone, LeftBin}; | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, LeftBin), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgMB, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
?AgCDone; | |||||
true -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
case ChunkCnt == ChunkX of | |||||
true -> | |||||
{?AgMDone, <<MsgBuffer/binary, LeftBin/binary>>}; | |||||
_ -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, LeftBin/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
?AgCDone | |||||
end | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
if | |||||
IsFirst == 1 -> | |||||
MsgCache = erlang:get(MessageId), | |||||
MsgCC = erlang:setelement(?AgCCIdx, MsgCache, ChunkX), | |||||
erlang:put(MessageId, MsgCC), | |||||
{?AgCBodyStart, MessageId, 1, ChunkSize, LeftBin}; | |||||
true -> | |||||
{?AgCBodyStart, MessageId, 1, ChunkSize, LeftBin} | |||||
end; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_undef, "there is not should come ~p ~p ~p ~n", [ByteSize, ChunkSize, {Length, ChunkX, IsFirst, MessageId}]), | |||||
{error, error_bad_size} | |||||
end; | |||||
_ -> | |||||
{?AgCHeader, Data} | |||||
end; | |||||
response(?AgCBody, MessageId, ChunkIdx, ChunkSize, ChunkBuffer, Data) -> | |||||
NewCkBuffer = <<ChunkBuffer/binary, Data/binary>>, | |||||
ByteSize = erlang:byte_size(NewCkBuffer), | |||||
if | |||||
ChunkSize == ByteSize -> | |||||
{_PidFrom, _TimerRef, ChunkCnt, MsgBuffer} = MsgCache = erlang:get(MessageId), | |||||
if | |||||
ChunkIdx == ChunkCnt -> | |||||
{?AgMDone, <<MsgBuffer/binary, NewCkBuffer/binary>>}; | |||||
ChunkIdx < ChunkCnt -> | |||||
MsgMB = erlang:setelement(?AgMBIdx, MsgCache, <<MsgBuffer/binary, NewCkBuffer/binary>>), | |||||
erlang:put(MessageId, MsgMB), | |||||
?AgCDone; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 11 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_chunkIdx} | |||||
end; | |||||
ByteSize < ChunkSize -> | |||||
{?AgCBodyGoOn, NewCkBuffer}; | |||||
true -> | |||||
?AgWarn(agVstProtocol_response_body, "there is not should come 22 ~p ~p ~n", [ByteSize, ChunkSize]), | |||||
{error, error_bad_size} | |||||
end. | |||||