@@ -525,10 +525,12 @@ static flb_sds_t ra_translate_string(struct flb_ra_parser *rp, flb_sds_t buf)
525525static flb_sds_t ra_translate_keymap (struct flb_ra_parser * rp , flb_sds_t buf ,
526526 msgpack_object map , int * found )
527527{
528+ int i ;
528529 int len ;
529530 char * js ;
530531 char str [32 ];
531- flb_sds_t tmp = NULL ;
532+ const char * p ;
533+ flb_sds_t hex = NULL ;
532534 struct flb_ra_value * v ;
533535
534536 /* Lookup key or subkey value */
@@ -537,7 +539,7 @@ static flb_sds_t ra_translate_keymap(struct flb_ra_parser *rp, flb_sds_t buf,
537539 return buf ;
538540 }
539541
540- v = flb_ra_key_to_value (rp -> key -> name , map , rp -> key -> subkeys );
542+ v = flb_ra_key_to_value_ext (rp -> key -> name , map , rp -> key -> subkeys , FLB_TRUE );
541543 if (!v ) {
542544 * found = FLB_FALSE ;
543545 return buf ;
@@ -554,41 +556,66 @@ static flb_sds_t ra_translate_keymap(struct flb_ra_parser *rp, flb_sds_t buf,
554556 js = flb_msgpack_to_json_str (1024 , & v -> o );
555557 if (js ) {
556558 len = strlen (js );
557- tmp = flb_sds_cat ( buf , js , len );
559+ flb_sds_cat_safe ( & buf , js , len );
558560 flb_free (js );
559561 }
560562 }
561563 else if (v -> o .type == MSGPACK_OBJECT_BOOLEAN ) {
562564 if (v -> val .boolean ) {
563- tmp = flb_sds_cat ( buf , "true" , 4 );
565+ flb_sds_cat_safe ( & buf , "true" , 4 );
564566 }
565567 else {
566- tmp = flb_sds_cat ( buf , "false" , 5 );
568+ flb_sds_cat_safe ( & buf , "false" , 5 );
567569 }
568570 }
569571 }
570572 else if (v -> type == FLB_RA_INT ) {
571573 len = snprintf (str , sizeof (str ) - 1 , "%" PRId64 , v -> val .i64 );
572- tmp = flb_sds_cat ( buf , str , len );
574+ flb_sds_cat_safe ( & buf , str , len );
573575 }
574576 else if (v -> type == FLB_RA_FLOAT ) {
575577 len = snprintf (str , sizeof (str ) - 1 , "%f" , v -> val .f64 );
576578 if (len >= sizeof (str )) {
577- tmp = flb_sds_cat ( buf , str , sizeof (str )- 1 );
579+ flb_sds_cat_safe ( & buf , str , sizeof (str )- 1 );
578580 }
579581 else {
580- tmp = flb_sds_cat ( buf , str , len );
582+ flb_sds_cat_safe ( & buf , str , len );
581583 }
582584 }
583585 else if (v -> type == FLB_RA_STRING ) {
584- tmp = flb_sds_cat (buf , v -> val .string , flb_sds_len (v -> val .string ));
586+ if (v -> storage == FLB_RA_REF ) {
587+ flb_sds_cat_safe (& buf , v -> val .ref .buf , v -> val .ref .len );
588+ }
589+ else {
590+ flb_sds_cat_safe (& buf , v -> val .string , flb_sds_len (v -> val .string ));
591+ }
592+ }
593+ else if (v -> type == FLB_RA_BINARY ) {
594+ if (v -> storage == FLB_RA_REF ) {
595+ p = v -> val .ref .buf ;
596+ len = v -> val .ref .len ;
597+ }
598+ else {
599+ p = v -> val .binary ;
600+ len = flb_sds_len (v -> val .binary );
601+ }
602+
603+ hex = flb_sds_create_size (len * 2 );
604+ if (hex ) {
605+ for (i = 0 ; i < len ; i ++ ) {
606+ hex = flb_sds_printf (& hex , "%02x" ,
607+ (unsigned char ) p [i ]);
608+ }
609+ flb_sds_cat_safe (& buf , hex , flb_sds_len (hex ));
610+ flb_sds_destroy (hex );
611+ }
585612 }
586613 else if (v -> type == FLB_RA_NULL ) {
587- tmp = flb_sds_cat ( buf , "null" , 4 );
614+ flb_sds_cat_safe ( & buf , "null" , 4 );
588615 }
589616
590617 flb_ra_key_value_destroy (v );
591- return tmp ;
618+ return buf ;
592619}
593620
594621/*
@@ -783,7 +810,20 @@ struct flb_ra_value *flb_ra_get_value_object(struct flb_record_accessor *ra,
783810 return NULL ;
784811 }
785812
786- return flb_ra_key_to_value (rp -> key -> name , map , rp -> key -> subkeys );
813+ return flb_ra_key_to_value_ext (rp -> key -> name , map , rp -> key -> subkeys , FLB_TRUE );
814+ }
815+
816+ struct flb_ra_value * flb_ra_get_value_object_ref (struct flb_record_accessor * ra ,
817+ msgpack_object map )
818+ {
819+ struct flb_ra_parser * rp ;
820+
821+ rp = get_ra_parser (ra );
822+ if (rp == NULL ) {
823+ return NULL ;
824+ }
825+
826+ return flb_ra_key_to_value_ext (rp -> key -> name , map , rp -> key -> subkeys , FLB_FALSE );
787827}
788828
789829/**
0 commit comments