22
33/* Fluent Bit
44 * ==========
5- * Copyright (C) 2015-2024 The Fluent Bit Authors
5+ * Copyright (C) 2015-2025 The Fluent Bit Authors
66 *
77 * Licensed under the Apache License, Version 2.0 (the "License");
88 * you may not use this file except in compliance with the License.
2929
3030/* Map msgpack object into flb_ra_value representation */
3131static int msgpack_object_to_ra_value (msgpack_object o ,
32- struct flb_ra_value * result )
32+ struct flb_ra_value * result ,
33+ int copy )
3334{
3435 result -> o = o ;
3536
3637 /* Compose result with found value */
3738 if (o .type == MSGPACK_OBJECT_BOOLEAN ) {
3839 result -> type = FLB_RA_BOOL ;
40+ result -> storage = FLB_RA_COPY ;
3941 result -> val .boolean = o .via .boolean ;
4042 return 0 ;
4143 }
4244 else if (o .type == MSGPACK_OBJECT_POSITIVE_INTEGER ||
4345 o .type == MSGPACK_OBJECT_NEGATIVE_INTEGER ) {
4446 result -> type = FLB_RA_INT ;
47+ result -> storage = FLB_RA_COPY ;
4548 result -> val .i64 = o .via .i64 ;
4649 return 0 ;
4750 }
4851 else if (o .type == MSGPACK_OBJECT_FLOAT32 ||
4952 o .type == MSGPACK_OBJECT_FLOAT ) {
5053 result -> type = FLB_RA_FLOAT ;
54+ result -> storage = FLB_RA_COPY ;
5155 result -> val .f64 = o .via .f64 ;
5256 return 0 ;
5357 }
5458 else if (o .type == MSGPACK_OBJECT_STR ) {
5559 result -> type = FLB_RA_STRING ;
56- result -> val .string = flb_sds_create_len ((char * ) o .via .str .ptr ,
57- o .via .str .size );
58-
59- /* Handle cases where flb_sds_create_len fails */
60- if (result -> val .string == NULL ) {
61- return -1 ;
60+ if (copy ) {
61+ result -> storage = FLB_RA_COPY ;
62+ result -> val .string = flb_sds_create_len ((char * ) o .via .str .ptr , o .via .str .size );
63+ if (result -> val .string == NULL ) {
64+ return -1 ;
65+ }
66+ }
67+ else {
68+ result -> storage = FLB_RA_REF ;
69+ result -> val .ref .buf = (const char * ) o .via .str .ptr ;
70+ result -> val .ref .len = o .via .str .size ;
6271 }
6372 return 0 ;
6473 }
6574 else if (o .type == MSGPACK_OBJECT_MAP ) {
6675 /* return boolean 'true', just denoting the existence of the key */
6776 result -> type = FLB_RA_BOOL ;
77+ result -> storage = FLB_RA_COPY ;
6878 result -> val .boolean = true;
6979 return 0 ;
7080 }
81+ else if (o .type == MSGPACK_OBJECT_BIN ) {
82+ result -> type = FLB_RA_BINARY ;
83+ if (copy ) {
84+ result -> storage = FLB_RA_COPY ;
85+ result -> val .binary = flb_sds_create_len ((char * ) o .via .bin .ptr , o .via .bin .size );
86+ if (result -> val .binary == NULL ) {
87+ flb_errno ();
88+ return -1 ;
89+ }
90+ }
91+ else {
92+ result -> storage = FLB_RA_REF ;
93+ result -> val .ref .buf = (const char * ) o .via .bin .ptr ;
94+ result -> val .ref .len = o .via .bin .size ;
95+ }
96+ return 0 ;
97+ }
7198 else if (o .type == MSGPACK_OBJECT_NIL ) {
7299 result -> type = FLB_RA_NULL ;
100+ result -> storage = FLB_RA_COPY ;
73101 return 0 ;
74102 }
75103
@@ -121,7 +149,7 @@ static int msgpack_object_strcmp(msgpack_object o, char *str, int len)
121149
122150/* Lookup perfect match of sub-keys and map content */
123151static int subkey_to_object (msgpack_object * map , struct mk_list * subkeys ,
124- msgpack_object * * out_key , msgpack_object * * out_val )
152+ msgpack_object * * out_key , msgpack_object * * out_val )
125153{
126154 int i = 0 ;
127155 int levels ;
@@ -207,9 +235,10 @@ static int subkey_to_object(msgpack_object *map, struct mk_list *subkeys,
207235 return 0 ;
208236}
209237
210- struct flb_ra_value * flb_ra_key_to_value (flb_sds_t ckey ,
211- msgpack_object map ,
212- struct mk_list * subkeys )
238+ struct flb_ra_value * flb_ra_key_to_value_ext (flb_sds_t ckey ,
239+ msgpack_object map ,
240+ struct mk_list * subkeys ,
241+ int copy )
213242{
214243 int i ;
215244 int ret ;
@@ -240,7 +269,7 @@ struct flb_ra_value *flb_ra_key_to_value(flb_sds_t ckey,
240269
241270 ret = subkey_to_object (& val , subkeys , & out_key , & out_val );
242271 if (ret == 0 ) {
243- ret = msgpack_object_to_ra_value (* out_val , result );
272+ ret = msgpack_object_to_ra_value (* out_val , result , copy );
244273 if (ret == -1 ) {
245274 flb_free (result );
246275 return NULL ;
@@ -253,7 +282,7 @@ struct flb_ra_value *flb_ra_key_to_value(flb_sds_t ckey,
253282 }
254283 }
255284 else {
256- ret = msgpack_object_to_ra_value (val , result );
285+ ret = msgpack_object_to_ra_value (val , result , copy );
257286 if (ret == -1 ) {
258287 flb_error ("[ra key] cannot process key value" );
259288 flb_free (result );
@@ -264,6 +293,13 @@ struct flb_ra_value *flb_ra_key_to_value(flb_sds_t ckey,
264293 return result ;
265294}
266295
296+ struct flb_ra_value * flb_ra_key_to_value (flb_sds_t ckey ,
297+ msgpack_object map ,
298+ struct mk_list * subkeys )
299+ {
300+ return flb_ra_key_to_value_ext (ckey , map , subkeys , FLB_TRUE );
301+ }
302+
267303int flb_ra_key_value_get (flb_sds_t ckey , msgpack_object map ,
268304 struct mk_list * subkeys ,
269305 msgpack_object * * start_key ,
@@ -429,7 +465,7 @@ static int update_subkey_array(msgpack_object *obj, struct mk_list *subkeys,
429465 }
430466
431467 msgpack_pack_array (mp_pck , size );
432- for (i = 0 ; i < size ; i ++ ) {
468+ for (i = 0 ; i < size ; i ++ ) {
433469 if (i != entry -> array_id ) {
434470 msgpack_pack_object (mp_pck , obj -> via .array .ptr [i ]);
435471 continue ;
@@ -483,7 +519,7 @@ static int update_subkey_map(msgpack_object *obj, struct mk_list *subkeys,
483519 }
484520
485521 msgpack_pack_map (mp_pck , size );
486- for (i = 0 ; i < size ; i ++ ) {
522+ for (i = 0 ; i < size ; i ++ ) {
487523 if (i != ret_id ) {
488524 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].key );
489525 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].val );
@@ -561,7 +597,7 @@ int flb_ra_key_value_update(struct flb_ra_parser *rp, msgpack_object map,
561597 msgpack_pack_map (mp_pck , map_size );
562598 if (levels == 0 ) {
563599 /* no subkeys */
564- for (i = 0 ; i < map_size ; i ++ ) {
600+ for (i = 0 ; i < map_size ; i ++ ) {
565601 if (i != kv_id ) {
566602 /* pack original key/val */
567603 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].key );
@@ -586,7 +622,7 @@ int flb_ra_key_value_update(struct flb_ra_parser *rp, msgpack_object map,
586622 return 0 ;
587623 }
588624
589- for (i = 0 ; i < map_size ; i ++ ) {
625+ for (i = 0 ; i < map_size ; i ++ ) {
590626 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].key );
591627 if (i != kv_id ) {
592628 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].val );
@@ -647,7 +683,7 @@ static int append_subkey_array(msgpack_object *obj, struct mk_list *subkeys,
647683 }
648684
649685 msgpack_pack_array (mp_pck , size );
650- for (i = 0 ; i < size ; i ++ ) {
686+ for (i = 0 ; i < size ; i ++ ) {
651687 if (i != entry -> array_id ) {
652688 msgpack_pack_object (mp_pck , obj -> via .array .ptr [i ]);
653689 continue ;
@@ -691,7 +727,7 @@ static int append_subkey_map(msgpack_object *obj, struct mk_list *subkeys,
691727 if (levels == * matched ) {
692728 /* append val */
693729 msgpack_pack_map (mp_pck , size + 1 );
694- for (i = 0 ; i < size ; i ++ ) {
730+ for (i = 0 ; i < size ; i ++ ) {
695731 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].key );
696732 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].val );
697733 }
@@ -703,15 +739,14 @@ static int append_subkey_map(msgpack_object *obj, struct mk_list *subkeys,
703739 return 0 ;
704740 }
705741
706-
707742 ret_id = ra_key_val_id (entry -> str , * obj );
708743 if (ret_id < 0 ) {
709744 flb_trace ("%s: not found" , __FUNCTION__ );
710745 return -1 ;
711746 }
712747
713748 msgpack_pack_map (mp_pck , size );
714- for (i = 0 ; i < size ; i ++ ) {
749+ for (i = 0 ; i < size ; i ++ ) {
715750 if (i != ret_id ) {
716751 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].key );
717752 msgpack_pack_object (mp_pck , obj -> via .map .ptr [i ].val );
@@ -770,7 +805,7 @@ int flb_ra_key_value_append(struct flb_ra_parser *rp, msgpack_object map,
770805 if (ref_level < 0 ) {
771806 /* no subkeys */
772807 msgpack_pack_map (mp_pck , map_size + 1 );
773- for (i = 0 ; i < map_size ; i ++ ) {
808+ for (i = 0 ; i < map_size ; i ++ ) {
774809 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].key );
775810 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].val );
776811 }
@@ -787,7 +822,7 @@ int flb_ra_key_value_append(struct flb_ra_parser *rp, msgpack_object map,
787822 }
788823
789824 msgpack_pack_map (mp_pck , map_size );
790- for (i = 0 ; i < map_size ; i ++ ) {
825+ for (i = 0 ; i < map_size ; i ++ ) {
791826 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].key );
792827 if (i != kv_id ) {
793828 msgpack_pack_object (mp_pck , map .via .map .ptr [i ].val );
@@ -806,8 +841,34 @@ int flb_ra_key_value_append(struct flb_ra_parser *rp, msgpack_object map,
806841
807842void flb_ra_key_value_destroy (struct flb_ra_value * v )
808843{
809- if (v -> type == FLB_RA_STRING ) {
844+ if (v -> type == FLB_RA_STRING && v -> storage == FLB_RA_COPY ) {
810845 flb_sds_destroy (v -> val .string );
811846 }
847+ else if (v -> type == FLB_RA_BINARY && v -> storage == FLB_RA_COPY ) {
848+ flb_sds_destroy (v -> val .binary );
849+ }
812850 flb_free (v );
813851}
852+
853+ const char * flb_ra_value_buffer (struct flb_ra_value * v , size_t * len )
854+ {
855+ if (v -> storage == FLB_RA_REF ) {
856+ if (len ) {
857+ * len = v -> val .ref .len ;
858+ }
859+ return v -> val .ref .buf ;
860+ }
861+
862+ if (len ) {
863+ if (v -> type == FLB_RA_STRING ) {
864+ * len = flb_sds_len (v -> val .string );
865+ }
866+ else {
867+ * len = flb_sds_len (v -> val .binary );
868+ }
869+ }
870+ if (v -> type == FLB_RA_STRING ) {
871+ return v -> val .string ;
872+ }
873+ return v -> val .binary ;
874+ }
0 commit comments