From 4fe4f484beb0784e133d0a30d421f2cf5f63ffeb Mon Sep 17 00:00:00 2001 From: dcy Date: Wed, 5 Nov 2014 01:18:39 +0800 Subject: [PATCH 1/5] add fun as_maps --- src/emysql.erl | 5 +++++ src/emysql_conv.erl | 9 +++++++++ src/emysql_util.erl | 2 ++ test/basics_SUITE.erl | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/src/emysql.erl b/src/emysql.erl index a373de9a..4eec8847 100644 --- a/src/emysql.erl +++ b/src/emysql.erl @@ -119,6 +119,7 @@ as_dict/1, as_json/1, as_proplist/1, + as_maps/1, as_record/3, as_record/4 ]). @@ -692,6 +693,10 @@ as_json(Res) -> emysql_conv:as_json(Res). PropRow :: proplists:proplist(). as_proplist(Res) -> emysql_conv:as_proplist(Res). +%% @doc package row data as erlang maps +as_maps(Res) -> emysql_conv:as_maps(Res). + + %% @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..b8eaa963 100644 --- a/src/emysql_conv.erl +++ b/src/emysql_conv.erl @@ -10,6 +10,7 @@ as_dict/1, as_json/1, as_proplist/1, + as_maps/1, as_record/3, as_record/4 ]). @@ -78,3 +79,11 @@ json_val({datetime,{ {Year,Month,Day}, {Hour,Min,Sec} }}) -> [Year, Month, Day, Hour, Min, Sec])); json_val(Value) -> Value. + +%% @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]. + diff --git a/src/emysql_util.erl b/src/emysql_util.erl index 71848cd9..e1335296 100644 --- a/src/emysql_util.erl +++ b/src/emysql_util.erl @@ -40,6 +40,7 @@ as_dict/1, as_json/1, as_proplist/1, + as_maps/1, as_record/3, as_record/4 ]). @@ -52,6 +53,7 @@ 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_maps(Res) -> emysql:as_maps(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). diff --git a/test/basics_SUITE.erl b/test/basics_SUITE.erl index 055d18bf..7f3b2d97 100644 --- a/test/basics_SUITE.erl +++ b/test/basics_SUITE.erl @@ -66,6 +66,9 @@ 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, @@ -449,6 +452,23 @@ proplist_multi_test(_) -> Expect = emysql:as_proplist(get_multi_test()), ok. +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. + json_empty_test(_) -> [] = emysql_util:as_json(get_empty_test()), [] = emysql:as_json(get_empty_test()), From 6fe507ab11255d1dba221b01ce8da3a3aa93a893 Mon Sep 17 00:00:00 2001 From: dcy Date: Wed, 19 Nov 2014 00:35:41 +0800 Subject: [PATCH 2/5] as_maps only export and tests >= 17 --- rebar.config | 3 ++- src/emysql.erl | 5 ++++- test/basics_SUITE.erl | 46 ++++++++++++++++++++++++++++++++----------- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/rebar.config b/rebar.config index e61983a8..d8d44a5b 100644 --- a/rebar.config +++ b/rebar.config @@ -1,7 +1,8 @@ % -*- Erlang -*- % vim: ts=4 sw=4 et ft=erlang {erl_opts, [ - nowarn_deprecated_type + nowarn_deprecated_type, + {platform_define, "^[0-9]+", maps_available} ]}. {pre_hooks,[ {"linux|bsd|darwin|solaris", compile, "escript ./support/crypto_compat.escript"}, diff --git a/src/emysql.erl b/src/emysql.erl index 4eec8847..2f9ab57a 100644 --- a/src/emysql.erl +++ b/src/emysql.erl @@ -119,11 +119,14 @@ as_dict/1, as_json/1, as_proplist/1, - as_maps/1, as_record/3, as_record/4 ]). +-ifdef(maps_available). +-export([as_maps/1]). +-endif. + %% Result Data API - Handle results from Mysql -export([ affected_rows/1, diff --git a/test/basics_SUITE.erl b/test/basics_SUITE.erl index 7f3b2d97..d5777482 100644 --- a/test/basics_SUITE.erl +++ b/test/basics_SUITE.erl @@ -75,6 +75,7 @@ groups() -> record_test]} ]. + %% Optional suite pre test initialization %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -453,21 +454,36 @@ proplist_multi_test(_) -> ok. maps_empty_test(_) -> - [] = emysql_util:as_maps(get_empty_test()), - [] = emysql:as_maps(get_empty_test()), - ok. + case is_before_17() of + true -> + ok; + false -> + [] = emysql_util:as_maps(get_empty_test()), + [] = emysql:as_maps(get_empty_test()), + ok + end. maps_single_test(_) -> - Expect = [#{'HelloField' => <<"Hello">>}], - Expect = emysql_util:as_maps(get_single_test()), - Expect = emysql:as_maps(get_single_test()), - ok. + case is_before_17() of + true -> + ok; + false -> + Expect = [#{'HelloField' => <<"Hello">>}], + Expect = emysql_util:as_maps(get_single_test()), + Expect = emysql:as_maps(get_single_test()), + ok + end. 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. + case is_before_17() of + true -> + ok; + false -> + Expect = [#{'ByeField' => <<"Bye">>, 'HelloField' => <<"Hello">>, 'HiField' => <<"Hi">>}], + Expect = emysql_util:as_maps(get_multi_test()), + Expect = emysql:as_maps(get_multi_test()), + ok + end. json_empty_test(_) -> [] = emysql_util:as_json(get_empty_test()), @@ -501,6 +517,14 @@ record_test(_Config) -> Expected = emysql:as_record(Result, person, record_info(fields, person)), ok. +is_before_17() -> + case erlang:system_info(otp_release) of + %% Rxx, before R16 + [$R|_] -> true; + %% "17", our future with map + _ -> false + end. + %%% Data generation %% -------------------------------------------------------------------------------------------- From d3b82011f778c2e52ce136c45317626352daf0b4 Mon Sep 17 00:00:00 2001 From: dcy Date: Wed, 19 Nov 2014 00:57:50 +0800 Subject: [PATCH 3/5] as_maps only export and tests >= 17 --- src/emysql.erl | 2 ++ src/emysql_conv.erl | 7 ++++- src/emysql_util.erl | 9 ++++++- test/basics_SUITE.erl | 63 +++++++++++++++++++++---------------------- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/emysql.erl b/src/emysql.erl index 2f9ab57a..97eac313 100644 --- a/src/emysql.erl +++ b/src/emysql.erl @@ -696,8 +696,10 @@ 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) diff --git a/src/emysql_conv.erl b/src/emysql_conv.erl index b8eaa963..e8b4de88 100644 --- a/src/emysql_conv.erl +++ b/src/emysql_conv.erl @@ -10,11 +10,14 @@ as_dict/1, as_json/1, as_proplist/1, - as_maps/1, as_record/3, 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))). @@ -80,10 +83,12 @@ json_val({datetime,{ {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 e1335296..59c90487 100644 --- a/src/emysql_util.erl +++ b/src/emysql_util.erl @@ -40,11 +40,14 @@ as_dict/1, as_json/1, as_proplist/1, - as_maps/1, as_record/3, 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). @@ -53,7 +56,11 @@ 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). + +-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 d5777482..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, @@ -74,6 +75,22 @@ groups() -> 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 @@ -453,37 +470,24 @@ proplist_multi_test(_) -> Expect = emysql:as_proplist(get_multi_test()), ok. +-ifdef(maps_available). maps_empty_test(_) -> - case is_before_17() of - true -> - ok; - false -> - [] = emysql_util:as_maps(get_empty_test()), - [] = emysql:as_maps(get_empty_test()), - ok - end. + [] = emysql_util:as_maps(get_empty_test()), + [] = emysql:as_maps(get_empty_test()), + ok. maps_single_test(_) -> - case is_before_17() of - true -> - ok; - false -> - Expect = [#{'HelloField' => <<"Hello">>}], - Expect = emysql_util:as_maps(get_single_test()), - Expect = emysql:as_maps(get_single_test()), - ok - end. + Expect = [#{'HelloField' => <<"Hello">>}], + Expect = emysql_util:as_maps(get_single_test()), + Expect = emysql:as_maps(get_single_test()), + ok. maps_multi_test(_) -> - case is_before_17() of - true -> - ok; - false -> - Expect = [#{'ByeField' => <<"Bye">>, 'HelloField' => <<"Hello">>, 'HiField' => <<"Hi">>}], - Expect = emysql_util:as_maps(get_multi_test()), - Expect = emysql:as_maps(get_multi_test()), - ok - end. + 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()), @@ -517,13 +521,6 @@ record_test(_Config) -> Expected = emysql:as_record(Result, person, record_info(fields, person)), ok. -is_before_17() -> - case erlang:system_info(otp_release) of - %% Rxx, before R16 - [$R|_] -> true; - %% "17", our future with map - _ -> false - end. %%% Data generation From 9a2b3d7a3bce3545c3bc8e717b1cbfac36155a2a Mon Sep 17 00:00:00 2001 From: dcy Date: Thu, 20 Nov 2014 19:55:41 +0800 Subject: [PATCH 4/5] as_maps only export and tests >= 17 --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 From e1f5d8b954fe856d86fb067465d1cce63ca99dc4 Mon Sep 17 00:00:00 2001 From: dcy Date: Fri, 9 Jun 2017 15:25:13 +0800 Subject: [PATCH 5/5] indent fix --- rebar.config | 4 ---- src/emysql.erl | 6 +++--- src/emysql_conv.erl | 3 ++- src/emysql_util.erl | 7 ++++--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/rebar.config b/rebar.config index d8d44a5b..9f490f4e 100644 --- a/rebar.config +++ b/rebar.config @@ -4,7 +4,3 @@ nowarn_deprecated_type, {platform_define, "^[0-9]+", maps_available} ]}. -{pre_hooks,[ - {"linux|bsd|darwin|solaris", compile, "escript ./support/crypto_compat.escript"}, - {"win32", compile, "escript.exe support/crypto_compat.escript"} -]}. diff --git a/src/emysql.erl b/src/emysql.erl index 97eac313..63e8d97f 100644 --- a/src/emysql.erl +++ b/src/emysql.erl @@ -129,9 +129,9 @@ %% 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 ]). diff --git a/src/emysql_conv.erl b/src/emysql_conv.erl index e8b4de88..7ee9e370 100644 --- a/src/emysql_conv.erl +++ b/src/emysql_conv.erl @@ -88,7 +88,8 @@ json_val(Value) -> 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)]) + 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 59c90487..e7962edd 100644 --- a/src/emysql_util.erl +++ b/src/emysql_util.erl @@ -61,6 +61,7 @@ as_proplist(Res) -> emysql:as_proplist(Res). 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). - +as_record(Res, RecName, Fields) -> + emysql:as_record(Res, RecName, Fields). +as_record(Res, RecName, Fields, Fun) -> + emysql:as_record(Res, RecName, Fields, Fun).