diff --git a/.travis.yml b/.travis.yml index 0c3e76c0..d4c1852c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,9 @@ before_script: script: "make test" otp_release: - - 17.0-rc1 + - 17.3 + - 17.1 + - 17.0 - R16B03-1 - R16B - R15B03 diff --git a/rebar.config b/rebar.config index e61983a8..9f490f4e 100644 --- a/rebar.config +++ b/rebar.config @@ -1,9 +1,6 @@ % -*- Erlang -*- % vim: ts=4 sw=4 et ft=erlang {erl_opts, [ - nowarn_deprecated_type -]}. -{pre_hooks,[ - {"linux|bsd|darwin|solaris", compile, "escript ./support/crypto_compat.escript"}, - {"win32", compile, "escript.exe support/crypto_compat.escript"} + nowarn_deprecated_type, + {platform_define, "^[0-9]+", maps_available} ]}. diff --git a/src/emysql.erl b/src/emysql.erl index a373de9a..63e8d97f 100644 --- a/src/emysql.erl +++ b/src/emysql.erl @@ -123,11 +123,15 @@ as_record/4 ]). +-ifdef(maps_available). +-export([as_maps/1]). +-endif. + %% Result Data API - Handle results from Mysql -export([ - affected_rows/1, - result_type/1, - field_names/1, + affected_rows/1, + result_type/1, + field_names/1, insert_id/1 ]). @@ -692,6 +696,12 @@ as_json(Res) -> emysql_conv:as_json(Res). PropRow :: proplists:proplist(). as_proplist(Res) -> emysql_conv:as_proplist(Res). +-ifdef(maps_available). +%% @doc package row data as erlang maps +as_maps(Res) -> emysql_conv:as_maps(Res). +-endif. + + %% @equiv as_record(Res, Recname, Fields, fun(A) -> A end) as_record(Res, Recname, Fields) -> emysql_conv:as_record(Res, Recname, Fields). diff --git a/src/emysql_conv.erl b/src/emysql_conv.erl index 28af9dd8..7ee9e370 100644 --- a/src/emysql_conv.erl +++ b/src/emysql_conv.erl @@ -14,6 +14,10 @@ as_record/4 ]). +-ifdef(maps_available). +-export([as_maps/1]). +-endif. + %% @see emysql:as_dict/1 as_dict(Res = #result_packet{}) -> dict:from_list(lists:flatten(as_proplist(Res))). @@ -78,3 +82,14 @@ json_val({datetime,{ {Year,Month,Day}, {Hour,Min,Sec} }}) -> [Year, Month, Day, Hour, Min, Sec])); json_val(Value) -> Value. + +-ifdef(maps_available). +%% @see emysql:as_maps/1 +as_maps(#result_packet { rows = Rows } = Result) -> + Fields = emysql:field_names(Result), + [begin + maps:from_list([{binary_to_atom(K, utf8), V} || + {K, V} <- lists:zip(Fields, Row)]) + end || Row <- Rows]. +-endif. + diff --git a/src/emysql_util.erl b/src/emysql_util.erl index 71848cd9..e7962edd 100644 --- a/src/emysql_util.erl +++ b/src/emysql_util.erl @@ -44,6 +44,10 @@ as_record/4 ]). +-ifdef(maps_available). +-export([as_maps/1]). +-endif. + affected_rows(P) -> emysql:affected_rows(P). field_names(R) -> emysql:field_names(R). insert_id(P) -> emysql:insert_id(P). @@ -52,6 +56,12 @@ result_type(R) -> emysql:result_type(R). as_dict(Res) -> emysql:as_dict(Res). as_json(Res) -> emysql:as_json(Res). as_proplist(Res) -> emysql:as_proplist(Res). -as_record(Res, RecName, Fields) -> emysql:as_record(Res, RecName, Fields). -as_record(Res, RecName, Fields, Fun) -> emysql:as_record(Res, RecName, Fields, Fun). +-ifdef(maps_available). +as_maps(Res) -> emysql:as_maps(Res). +-endif. + +as_record(Res, RecName, Fields) -> + emysql:as_record(Res, RecName, Fields). +as_record(Res, RecName, Fields, Fun) -> + emysql:as_record(Res, RecName, Fields, Fun). diff --git a/test/basics_SUITE.erl b/test/basics_SUITE.erl index 055d18bf..f20f57df 100644 --- a/test/basics_SUITE.erl +++ b/test/basics_SUITE.erl @@ -58,6 +58,7 @@ all() -> emit_warnings, {group, conversion}]. +-ifdef(maps_available). groups() -> [{conversion, [parallel], [dict_empty_test, @@ -66,11 +67,31 @@ groups() -> proplist_empty_test, proplist_single_test, proplist_multi_test, + maps_empty_test, + maps_single_test, + maps_multi_test, json_empty_test, json_single_test, json_multi_test, record_test]} ]. +-else. +groups() -> + [{conversion, [parallel], + [dict_empty_test, + dict_single_test, + dict_multi_test, + proplist_empty_test, + proplist_single_test, + proplist_multi_test, + json_empty_test, + json_single_test, + json_multi_test, + record_test]} + ]. +-endif. + + %% Optional suite pre test initialization %%-------------------------------------------------------------------- @@ -449,6 +470,25 @@ proplist_multi_test(_) -> Expect = emysql:as_proplist(get_multi_test()), ok. +-ifdef(maps_available). +maps_empty_test(_) -> + [] = emysql_util:as_maps(get_empty_test()), + [] = emysql:as_maps(get_empty_test()), + ok. + +maps_single_test(_) -> + Expect = [#{'HelloField' => <<"Hello">>}], + Expect = emysql_util:as_maps(get_single_test()), + Expect = emysql:as_maps(get_single_test()), + ok. + +maps_multi_test(_) -> + Expect = [#{'ByeField' => <<"Bye">>, 'HelloField' => <<"Hello">>, 'HiField' => <<"Hi">>}], + Expect = emysql_util:as_maps(get_multi_test()), + Expect = emysql:as_maps(get_multi_test()), + ok. +-endif. + json_empty_test(_) -> [] = emysql_util:as_json(get_empty_test()), [] = emysql:as_json(get_empty_test()), @@ -482,6 +522,7 @@ record_test(_Config) -> ok. + %%% Data generation %% -------------------------------------------------------------------------------------------- fields() ->