Skip to content

Commit 59dd90d

Browse files
committed
ra_key: add support for BINARY type values
Signed-off-by: Eduardo Silva <[email protected]>
1 parent 805df0a commit 59dd90d

File tree

2 files changed

+105
-26
lines changed

2 files changed

+105
-26
lines changed

include/fluent-bit/flb_ra_key.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ enum ra_types {
3232
FLB_RA_INT,
3333
FLB_RA_FLOAT,
3434
FLB_RA_STRING,
35-
FLB_RA_NULL
35+
FLB_RA_NULL,
36+
FLB_RA_BINARY
37+
};
38+
39+
enum ra_storage_type {
40+
FLB_RA_COPY = 0,
41+
FLB_RA_REF
3642
};
3743

3844
/* condition value types */
@@ -41,15 +47,27 @@ typedef union {
4147
int64_t i64;
4248
double f64;
4349
flb_sds_t string;
50+
flb_sds_t binary;
51+
struct {
52+
const char *buf;
53+
size_t len;
54+
} ref;
4455
} ra_val;
4556

4657
/* Represent any value object */
4758
struct flb_ra_value {
4859
int type;
60+
int storage; /* FLB_RA_COPY or FLB_RA_REF */
4961
msgpack_object o;
5062
ra_val val;
5163
};
5264

65+
const char *flb_ra_value_buffer(struct flb_ra_value *v, size_t *len);
66+
67+
struct flb_ra_value *flb_ra_key_to_value_ext(flb_sds_t ckey,
68+
msgpack_object map,
69+
struct mk_list *subkeys,
70+
int copy);
5371
struct flb_ra_value *flb_ra_key_to_value(flb_sds_t ckey,
5472
msgpack_object map,
5573
struct mk_list *subkeys);

src/flb_ra_key.c

Lines changed: 86 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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.
@@ -29,47 +29,75 @@
2929

3030
/* Map msgpack object into flb_ra_value representation */
3131
static 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 */
123151
static 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+
267303
int 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

807842
void 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

Comments
 (0)