You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2022/02/11 22:55:57 UTC

[couchdb] 01/04: Add get_collator_version/0 libicu NIF function

This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit f3d4c9f36c03c680ade9d0d8925394eed2d4ac08
Author: Nick Vatamaniuc <va...@apache.org>
AuthorDate: Thu Feb 3 23:36:47 2022 -0500

    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
---
 .../priv/couch_ejson_compare/couch_ejson_compare.c    | 19 ++++++++++++++++++-
 src/couch/src/couch_ejson_compare.erl                 |  6 +++++-
 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 49a3a53..a4e9d1c 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 628bc2f..669f413 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 f74e40b..ae4a5ff 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),