diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2022-02-03 23:36:47 -0500 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2022-02-11 17:55:51 -0500 |
commit | f3d4c9f36c03c680ade9d0d8925394eed2d4ac08 (patch) | |
tree | 5d4526e7c5dbe2c2ad38fd1e6abf334da1306bbd | |
parent | 732c3fde0d04479cde7baf61a0f07068dbc554ca (diff) | |
download | couchdb-f3d4c9f36c03c680ade9d0d8925394eed2d4ac08.tar.gz |
Add get_collator_version/0 libicu NIF function
get_collator_version/0 calls ucol_getVersion() C API [1]. It returns
an opaque sequence of 4 bytes which encodes both the base UCA version
and any tailorings which may affect collation order.
[1] https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/ucol_8h.html#a0f98dd01ba7a64069ade6f0fda13528d
-rw-r--r-- | src/couch/priv/couch_ejson_compare/couch_ejson_compare.c | 19 | ||||
-rw-r--r-- | src/couch/src/couch_ejson_compare.erl | 6 | ||||
-rw-r--r-- | src/couch/test/eunit/couch_ejson_compare_tests.erl | 9 |
3 files changed, 32 insertions, 2 deletions
diff --git a/src/couch/priv/couch_ejson_compare/couch_ejson_compare.c b/src/couch/priv/couch_ejson_compare/couch_ejson_compare.c index 49a3a5396..a4e9d1cfa 100644 --- a/src/couch/priv/couch_ejson_compare/couch_ejson_compare.c +++ b/src/couch/priv/couch_ejson_compare/couch_ejson_compare.c @@ -65,6 +65,7 @@ static ERL_NIF_TERM less_json_nif(ErlNifEnv*, int, const ERL_NIF_TERM []); static ERL_NIF_TERM compare_strings_nif(ErlNifEnv*, int, const ERL_NIF_TERM []); static ERL_NIF_TERM get_icu_version(ErlNifEnv*, int, const ERL_NIF_TERM []); static ERL_NIF_TERM get_uca_version(ErlNifEnv*, int, const ERL_NIF_TERM []); +static ERL_NIF_TERM get_collator_version(ErlNifEnv*, int, const ERL_NIF_TERM []); static int on_load(ErlNifEnv*, void**, ERL_NIF_TERM); static void on_unload(ErlNifEnv*, void*); static __inline int less_json(int, ctx_t*, ERL_NIF_TERM, ERL_NIF_TERM); @@ -203,6 +204,21 @@ get_uca_version(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) return enif_make_tuple_from_array(env, tup, U_MAX_VERSION_LENGTH); } +ERL_NIF_TERM +get_collator_version(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + UVersionInfo ver = {0}; + ERL_NIF_TERM tup[U_MAX_VERSION_LENGTH] = {0}; + int i; + + ucol_getVersion(get_collator(), ver); + + for (i = 0; i < U_MAX_VERSION_LENGTH; i++) { + tup[i] = enif_make_int(env, ver[i]); + } + + return enif_make_tuple_from_array(env, tup, U_MAX_VERSION_LENGTH); +} int less_json(int depth, ctx_t* ctx, ERL_NIF_TERM a, ERL_NIF_TERM b) @@ -571,7 +587,8 @@ static ErlNifFunc nif_functions[] = { {"less_nif", 2, less_json_nif}, {"compare_strings_nif", 2, compare_strings_nif}, {"get_icu_version", 0, get_icu_version}, - {"get_uca_version", 0, get_uca_version} + {"get_uca_version", 0, get_uca_version}, + {"get_collator_version", 0, get_collator_version} }; diff --git a/src/couch/src/couch_ejson_compare.erl b/src/couch/src/couch_ejson_compare.erl index 628bc2fab..669f41364 100644 --- a/src/couch/src/couch_ejson_compare.erl +++ b/src/couch/src/couch_ejson_compare.erl @@ -17,7 +17,8 @@ less_json_ids/2, less_json/2, get_icu_version/0, - get_uca_version/0 + get_uca_version/0, + get_collator_version/0 ]). % For testing @@ -63,6 +64,9 @@ get_icu_version() -> get_uca_version() -> erlang:nif_error(get_uca_version). +get_collator_version() -> + erlang:nif_error(get_collator_version). + less_nif(A, B) -> erlang:nif_error(less_nif_load_error, [A, B]). diff --git a/src/couch/test/eunit/couch_ejson_compare_tests.erl b/src/couch/test/eunit/couch_ejson_compare_tests.erl index f74e40b23..ae4a5ff7c 100644 --- a/src/couch/test/eunit/couch_ejson_compare_tests.erl +++ b/src/couch/test/eunit/couch_ejson_compare_tests.erl @@ -185,6 +185,15 @@ get_uca_version_test() -> ?assert(is_integer(V3) andalso V3 >= 0), ?assert(is_integer(V4) andalso V4 >= 0). +get_collator_version_test() -> + Ver = couch_ejson_compare:get_collator_version(), + ?assertMatch({_, _, _, _}, Ver), + {V1, V2, V3, V4} = Ver, + ?assert(is_integer(V1) andalso V1 > 0), + ?assert(is_integer(V2) andalso V2 >= 0), + ?assert(is_integer(V3) andalso V3 >= 0), + ?assert(is_integer(V4) andalso V4 >= 0). + max_depth_error_list_test() -> % NIF can handle terms with depth <= 9 Nested9 = nest_list(<<"val">>, 9), |