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

iilyak pushed a commit to branch couch-stats-resource-tracker-v3-rebase-http-4
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit bfcad8e0479a389db8e6ea6d74c1b48c2bc07183
Author: ILYA Khlopotov <[email protected]>
AuthorDate: Wed Jun 25 07:48:52 2025 -0700

    Support more key types in csrt_entry:key/1
---
 src/couch_stats/src/csrt_entry.erl | 66 +++++++++++++++++++++++++++++---------
 1 file changed, 50 insertions(+), 16 deletions(-)

diff --git a/src/couch_stats/src/csrt_entry.erl 
b/src/couch_stats/src/csrt_entry.erl
index 3b1cf3f50..61949c65f 100644
--- a/src/couch_stats/src/csrt_entry.erl
+++ b/src/couch_stats/src/csrt_entry.erl
@@ -40,21 +40,55 @@ value(#rctx{get_kp_node = Val}, get_kp_node) -> Val;
 value(#rctx{started_at = Val}, started_at) -> Val;
 value(#rctx{updated_at = Val}, updated_at) -> Val.
 
--spec key(BinKey :: binary() | string()) -> Key :: rctx_field()
+-spec key(BinKey :: binary() | string() | atom()) -> Key :: rctx_field()
     | throw({bad_request, Reason :: binary()}).
 
-key(<<"pid_ref">>) -> pid_ref;
-key(<<"nonce">>) -> nonce;
-key(<<"type">>) -> type;
-key(<<"dbname">>) -> dbname;
-key(<<"username">>) -> username;
-key(<<"db_open">>) -> db_open;
-key(<<"docs_read">>) -> docs_read;
-key(<<"rows_read">>) -> rows_read;
-key(<<"changes_returned">>) -> changes_returned;
-key(<<"ioq_calls">>) -> ioq_calls;
-key(<<"js_filter">>) -> js_filter;
-key(<<"js_filtered_docs">>) -> js_filtered_docs;
-key(<<"get_kv_node">>) -> get_kv_node;
-key(<<"get_kp_node">>) -> get_kp_node;
-key(Other) when is_binary(Other) -> throw({bad_request, <<"Invalid key '", 
Other/binary, "'">>}).
+key(Key) when is_atom(Key) ->
+    key_from_atom(Key);
+key(Key) when is_binary(Key) ->
+    key_from_binary(Key);
+key(Key) when is_list(Key) ->
+    case key_from_binary(list_to_binary(Key)) of
+        {error, {invalid_key, _Key}} ->
+            {error, {invalid_key, Key}};
+        Res ->
+            Res
+    end;
+key(Other) ->
+    key_error(Other).
+
+key_from_atom(pid_ref) -> pid_ref;
+key_from_atom(nonce) -> nonce;
+key_from_atom(type) -> type;
+key_from_atom(dbname) -> dbname;
+key_from_atom(username) -> username;
+key_from_atom(db_open) -> db_open;
+key_from_atom(docs_read) -> docs_read;
+key_from_atom(rows_read) -> rows_read;
+key_from_atom(changes_returned) -> changes_returned;
+key_from_atom(ioq_calls) -> ioq_calls;
+key_from_atom(js_filter) -> js_filter;
+key_from_atom(js_filtered_docs) -> js_filtered_docs;
+key_from_atom(get_kv_node) -> get_kv_node;
+key_from_atom(get_kp_node) -> get_kp_node;
+key_from_atom(Other) -> key_error(Other).
+
+key_from_binary(<<"pid_ref">>) -> pid_ref;
+key_from_binary(<<"nonce">>) -> nonce;
+key_from_binary(<<"type">>) -> type;
+key_from_binary(<<"dbname">>) -> dbname;
+key_from_binary(<<"username">>) -> username;
+key_from_binary(<<"db_open">>) -> db_open;
+key_from_binary(<<"docs_read">>) -> docs_read;
+key_from_binary(<<"rows_read">>) -> rows_read;
+key_from_binary(<<"changes_returned">>) -> changes_returned;
+key_from_binary(<<"ioq_calls">>) -> ioq_calls;
+key_from_binary(<<"js_filter">>) -> js_filter;
+key_from_binary(<<"js_filtered_docs">>) -> js_filtered_docs;
+key_from_binary(<<"get_kv_node">>) -> get_kv_node;
+key_from_binary(<<"get_kp_node">>) -> get_kp_node;
+key_from_binary(Other) -> key_error(Other).
+
+key_error(Key) ->
+    {error, {invalid_key, Key}}.
+

Reply via email to