Current section

Files

Jump to
efirebirdsql src efirebirdsql_socket.erl
Raw

src/efirebirdsql_socket.erl

%%% The MIT License (MIT)
%%% Copyright (c) 2019 Hajime Nakagami<nakagami@gmail.com>
-module(efirebirdsql_socket).
-export([send/2, recv/2, recv_align/2, recv_null_bitmap/2]).
-include("efirebirdsql.hrl").
send(State, Data) when State#state.write_state =:= undefined ->
gen_tcp:send(State#state.sock, Data),
State;
send(State, Message) ->
{NewWriteState, Encrypted} = crypto:stream_encrypt(State#state.write_state, Message),
gen_tcp:send(State#state.sock, Encrypted),
State#state{write_state=NewWriteState}.
recv(State, Len) when Len =:= 0 ->
{ok, [], State};
recv(State, Len) when State#state.read_state =:= undefined ->
{T, V} = gen_tcp:recv(State#state.sock, Len),
{T, V, State};
recv(State, Len) ->
{T, Encrypted} = gen_tcp:recv(State#state.sock, Len),
{NewReadState, Message} = crypto:stream_decrypt(State#state.read_state, Encrypted),
{T, Message, State#state{read_state=NewReadState}}.
recv_align(State, Len) ->
{T, V, S2} = recv(State, Len),
S4 = case Len rem 4 of
0 -> S2;
1 -> {_, _, S3} = recv(S2, 3), S3;
2 -> {_, _, S3} = recv(S2, 2), S3;
3 -> {_, _, S3} = recv(S2, 1), S3
end,
{T, V, S4}.
recv_null_bitmap(State, BitLen) when BitLen =:= 0 ->
{[], State};
recv_null_bitmap(State, BitLen) ->
Div8 = BitLen div 8,
Len = if
BitLen rem 8 =:= 0 -> Div8;
BitLen rem 8 =/= 0 -> Div8 + 1
end,
{ok, Buf, S2} = recv_align(State, Len),
<<Bitmap:Len/little-unit:8>> = Buf,
{Bitmap, S2}.