Browse Source

Fix dialyzer errors

* Older versions of dialyzer doesn't support behaviour optional callbacks
* Some fixes for improper lists
* Some missing type exports
* Typos
* Fix for dict:dict/2
* gen_tcp:socket/0 isn't exported prior to erl 18
Сергей Прохоров 7 years ago
parent
commit
b8c903b32f

+ 3 - 1
src/datatypes/epgsql_codec_boolean.erl

@@ -9,7 +9,7 @@
 -module(epgsql_codec_boolean).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -27,3 +27,5 @@ encode(false, bool, _) ->
 
 decode(<<1:1/big-signed-unit:8>>, bool, _) -> true;
 decode(<<0:1/big-signed-unit:8>>, bool, _) -> false.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_bpchar.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_bpchar).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -28,3 +28,5 @@ encode(Bin, bpchar, _) when is_binary(Bin) ->
 
 decode(<<C:1/big-unsigned-unit:8>>, _, _) -> C;
 decode(Bin, bpchar, _) -> Bin.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_datetime.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_datetime).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 -export_type([pg_date/0,
@@ -51,3 +51,5 @@ encode(Val, Type, Mod) ->
 
 decode(Bin, Type, Mod) ->
     Mod:decode(Type, Bin).
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_float.erl

@@ -8,7 +8,7 @@
 -module(epgsql_codec_float).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -53,3 +53,5 @@ decode(?NEG_INF, float4, _) -> minus_infinity;
 decode(?NEG_INF8, float8, _) -> minus_infinity;
 decode(?NAN_PATTERN, float4, _) -> nan;
 decode(?NAN_PATTERN8, float8, _) -> nan.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_geometric.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_geometric).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -28,3 +28,5 @@ encode({X, Y}, point, _) when is_number(X), is_number(Y) ->
 
 decode(<<X:1/big-float-unit:64, Y:1/big-float-unit:64>>, point, _) ->
     {X, Y}.
+
+decode_text(V, _, _) -> V.

+ 5 - 2
src/datatypes/epgsql_codec_hstore.erl

@@ -11,7 +11,7 @@
 -module(epgsql_codec_hstore).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -include("protocol.hrl").
 
@@ -34,7 +34,8 @@ names() ->
 
 encode({Hstore}, hstore, _) when is_list(Hstore) ->
     Size = length(Hstore),
-    Body = [[encode_key(K) | encode_value(V)]
+    %% TODO: construct improper list when support for Erl 17 will be dropped
+    Body = [[encode_key(K), encode_value(V)]
            || {K, V} <- Hstore],
     [<<Size:?int32>> | Body].
 
@@ -71,3 +72,5 @@ do_decode(N, <<KeyLen:?int32, Key:KeyLen/binary, -1:?int32, Rest/binary>>) ->
 do_decode(N, <<KeyLen:?int32, Key:KeyLen/binary,
                ValLen:?int32, Value:ValLen/binary, Rest/binary>>) ->
     [{Key, Value} | do_decode(N - 1, Rest)].
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_integer.erl

@@ -9,7 +9,7 @@
 -module(epgsql_codec_integer).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -36,3 +36,5 @@ encode(N, int8, _) ->
 decode(<<N:1/big-signed-unit:16>>, int2, _)    -> N;
 decode(<<N:1/big-signed-unit:32>>, int4, _)    -> N;
 decode(<<N:1/big-signed-unit:64>>, int8, _)    -> N.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_intrange.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_intrange).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -include("protocol.hrl").
 
@@ -86,3 +86,5 @@ decode_int8range(<<18:1/big-signed-unit:8, 8:?int32, From:?int64>>) ->
     {From, plus_infinity};
 decode_int8range(<<24:1/big-signed-unit:8>>) ->
     {minus_infinity, plus_infinity}.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_json.erl

@@ -9,7 +9,7 @@
 -module(epgsql_codec_json).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -33,3 +33,5 @@ decode(Bin, json, _) ->
     Bin;
 decode(<<?JSONB_VERSION_1:8, Bin/binary>>, jsonb, _) ->
     Bin.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_net.erl

@@ -9,7 +9,7 @@
 -module(epgsql_codec_net).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -70,3 +70,5 @@ decode_net(<<?INET, ?MAX_IP_MASK, 0, ?IP_SIZE, Bin/binary>>) ->
     list_to_tuple(binary_to_list(Bin));
 decode_net(<<?INET6, ?MAX_IP6_MASK, 0, ?IP6_SIZE, Bin/binary>>) ->
     list_to_tuple([X || <<X:16>> <= Bin]).
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_postgis.erl

@@ -8,7 +8,7 @@
 -module(epgsql_codec_postgis).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -24,3 +24,5 @@ encode(Geo, geometry, _) ->
 
 decode(Bin, geometry, _) ->
     ewkb:decode_geometry(Bin).
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_text.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_text).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -47,3 +47,5 @@ encode_compat(F) when is_float(F)   -> float_to_binary(F).
 
 
 decode(Bin, _, _) -> Bin.
+
+decode_text(V, _, _) -> V.

+ 3 - 1
src/datatypes/epgsql_codec_uuid.erl

@@ -10,7 +10,7 @@
 -module(epgsql_codec_uuid).
 -behaviour(epgsql_codec).
 
--export([init/2, names/0, encode/3, decode/3]).
+-export([init/2, names/0, encode/3, decode/3, decode_text/3]).
 
 -export_type([data/0]).
 
@@ -33,3 +33,5 @@ encode(Uuid, uuid, _) when is_binary(Uuid) ->
 decode(<<U0:32, U1:16, U2:16, U3:16, U4:48>>, uuid, _) ->
     Format = "~8.16.0b-~4.16.0b-~4.16.0b-~4.16.0b-~12.16.0b",
     iolist_to_binary(io_lib:format(Format, [U0, U1, U2, U3, U4])).
+
+decode_text(V, _, _) -> V.

+ 2 - 2
src/epgsql_binary.erl

@@ -25,7 +25,7 @@
 -opaque codec() :: #codec{}.
 -opaque decoder() :: {fun((binary(), epgsql:type_name(), epgsql_codec:codec_state()) -> any()),
                       epgsql:type_name(),
-                      epgsql_codec:state()}.
+                      epgsql_codec:codec_state()}.
 
 -type type() :: epgsql:type_name() | {array, epgsql:type_name()}.
 -type maybe_unknown_type() :: type() | {unknown_oid, epgsql_oid_db:oid()}.
@@ -267,7 +267,7 @@ supports(Oid, #codec{oid_db = Db}) ->
 
 %% Default codec set
 %% XXX: maybe move to application env?
--spec default_codecs() -> [epgsql_codec:codec_entry()].
+-spec default_codecs() -> [{epgsql_codec:codec_mod(), any()}].
 default_codecs() ->
     [{epgsql_codec_boolean,[]},
      {epgsql_codec_bpchar,[]},

+ 1 - 1
src/epgsql_codec.erl

@@ -9,7 +9,7 @@
 -module(epgsql_codec).
 -export([init_mods/2]).
 
--export_type([codec_state/0, codec_mod/0]).
+-export_type([codec_state/0, codec_mod/0, codec_entry/0]).
 
 %%
 %% Behaviour

+ 1 - 1
src/epgsql_command.erl

@@ -5,7 +5,7 @@
 -module(epgsql_command).
 -export([init/2, execute/3, handle_message/5]).
 
--export_type([command/0]).
+-export_type([command/0, state/0]).
 
 -type command() :: module().
 -type state() :: any().

+ 2 - 2
src/epgsql_oid_db.erl

@@ -21,7 +21,7 @@
          codec_state :: any()}).
 -record(oid_db,
         {by_oid :: kv(oid(), #type{}),
-         by_name :: kv(epgsql:type_name(), oid())}).
+         by_name :: kv({epgsql:type_name(), boolean()}, oid())}).
 
 -type oid() :: non_neg_integer().
 %% Row of `typname', `oid', `typarray' from pg_type table.
@@ -172,7 +172,7 @@ kv_merge(Map1, Map2) ->
 
 -else.
 
--type kv(K, V) :: dict:dict(K, V).
+-type kv(_K, _V) :: any(). % dict:dict(K, V) causes dialyzer errors on erl <= 17
 
 kv_from_list(L) ->
     dict:from_list(L).

+ 6 - 4
src/epgsql_sock.erl

@@ -56,8 +56,10 @@
                    | {cast, pid(), reference()}
                    | {incremental, pid(), reference()}.
 
+-type tcp_socket() :: port(). %gen_tcp:socket() isn't exported prior to erl 18
+
 -record(state, {mod :: gen_tcp | ssl | undefined,
-                sock :: gen_tcp:socket() | ssl:sslsocket() | undefined,
+                sock :: tcp_socket() | ssl:sslsocket() | undefined,
                 data = <<>>,
                 backend :: {Pid :: integer(), Key :: integer()} | undefined,
                 handler = on_message :: on_message | on_replication | undefined,
@@ -87,11 +89,11 @@ close(C) when is_pid(C) ->
     catch gen_server:cast(C, stop),
     ok.
 
--spec sync_command(epgsql:conection(), epgsql_command:command(), any()) -> any().
+-spec sync_command(epgsql:connection(), epgsql_command:command(), any()) -> any().
 sync_command(C, Command, Args) ->
     gen_server:call(C, {command, Command, Args}, infinity).
 
--spec async_command(epgsql:conection(), cast | incremental,
+-spec async_command(epgsql:connection(), cast | incremental,
                     epgsql_command:command(), any()) -> reference().
 async_command(C, Transport, Command, Args) ->
     Ref = make_ref(),
@@ -118,7 +120,7 @@ cancel(S) ->
 %% send()
 %% send_many()
 
--spec set_net_socket(gen_tcp | ssl, gen_tcp:socket() | ssl:sslsocket(), pg_sock()) -> pg_sock().
+-spec set_net_socket(gen_tcp | ssl, tcp_socket() | ssl:sslsocket(), pg_sock()) -> pg_sock().
 set_net_socket(Mod, Socket, State) ->
     State1 = State#state{mod = Mod, sock = Socket},
     setopts(State1, [{active, true}]),