summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2022-02-03 23:36:47 -0500
committerNick Vatamaniuc <nickva@users.noreply.github.com>2022-02-11 17:55:51 -0500
commitf3d4c9f36c03c680ade9d0d8925394eed2d4ac08 (patch)
tree5d4526e7c5dbe2c2ad38fd1e6abf334da1306bbd
parent732c3fde0d04479cde7baf61a0f07068dbc554ca (diff)
downloadcouchdb-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.c19
-rw-r--r--src/couch/src/couch_ejson_compare.erl6
-rw-r--r--src/couch/test/eunit/couch_ejson_compare_tests.erl9
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),