@@ -678,7 +678,7 @@ JsonInit(Json *json)
678
678
}
679
679
680
680
static Size
681
- jsonGetFlatSize2 (Json * json )
681
+ jsonGetFlatSize2 (Json * json , void * * context )
682
682
{
683
683
Size size ;
684
684
@@ -693,7 +693,10 @@ jsonGetFlatSize2(Json *json)
693
693
{
694
694
char * str = JsonToCString (& json -> root );
695
695
size = VARHDRSZ + strlen (str );
696
- pfree (str );
696
+ if (context )
697
+ * context = str ;
698
+ else
699
+ pfree (str );
697
700
}
698
701
}
699
702
#endif
@@ -709,7 +712,10 @@ jsonGetFlatSize2(Json *json)
709
712
JsonValue val ;
710
713
void * js = JsonValueToJsonb (JsonToJsonValue (json ,& val ));
711
714
size = VARSIZE (js );
712
- pfree (js );
715
+ if (context )
716
+ * context = js ;
717
+ else
718
+ pfree (js );
713
719
}
714
720
}
715
721
#endif
@@ -718,7 +724,7 @@ jsonGetFlatSize2(Json *json)
718
724
}
719
725
720
726
static void *
721
- jsonFlatten (Json * json )
727
+ jsonFlatten (Json * json , void * * context )
722
728
{
723
729
#ifdef JSON_FLATTEN_INTO_TARGET
724
730
if (json -> is_json )
@@ -729,7 +735,7 @@ jsonFlatten(Json *json)
729
735
return cstring_to_text_with_len (json -> root .data ,json -> root .len );
730
736
else
731
737
{
732
- char * str = JsonToCString (JsonRoot (json ));
738
+ char * str = context ? ( char * ) * context : JsonToCString (JsonRoot (json ));
733
739
text * text = cstring_to_text (str );
734
740
pfree (str );
735
741
return text ;
@@ -748,6 +754,8 @@ jsonFlatten(Json *json)
748
754
memcpy (VARDATA (res ),json -> root .data ,json -> root .len );
749
755
return res ;
750
756
}
757
+ else if (context )
758
+ return * context ;
751
759
else
752
760
{
753
761
JsonValue val ;
@@ -758,7 +766,7 @@ jsonFlatten(Json *json)
758
766
}
759
767
760
768
static Size
761
- jsonGetFlatSize (ExpandedObjectHeader * eoh )
769
+ jsonGetFlatSize (ExpandedObjectHeader * eoh , void * * context )
762
770
{
763
771
Json * json = (Json * )eoh ;
764
772
@@ -773,19 +781,20 @@ jsonGetFlatSize(ExpandedObjectHeader *eoh)
773
781
{
774
782
tmp .data = NULL ;
775
783
tmp .ops = flatContainerOps ;
776
- tmp .len = jsonGetFlatSize2 (json )- VARHDRSZ ;
784
+ tmp .len = jsonGetFlatSize2 (json , context )- VARHDRSZ ;
777
785
flat = & tmp ;
778
786
}
779
787
780
788
return jsonGetExtendedSize (flat );
781
789
}
782
790
#else
783
- return jsonGetFlatSize2 (json );
791
+ return jsonGetFlatSize2 (json , context );
784
792
#endif
785
793
}
786
794
787
795
static void
788
- jsonFlattenInto (ExpandedObjectHeader * eoh ,void * result ,Size allocated_size )
796
+ jsonFlattenInto (ExpandedObjectHeader * eoh ,void * result ,Size allocated_size ,
797
+ void * * context )
789
798
{
790
799
Json * json = (Json * )eoh ;
791
800
@@ -799,7 +808,7 @@ jsonFlattenInto(ExpandedObjectHeader *eoh, void *result, Size allocated_size)
799
808
800
809
if (flat -> ops == & jsonvContainerOps )
801
810
{
802
- tmpData = jsonFlatten (json );
811
+ tmpData = jsonFlatten (json , context );
803
812
804
813
tmp .ops = flatContainerOps ;
805
814
tmp .data = VARDATA (tmpData );
@@ -815,7 +824,7 @@ jsonFlattenInto(ExpandedObjectHeader *eoh, void *result, Size allocated_size)
815
824
}
816
825
#else
817
826
{
818
- void * data = jsonFlatten (json );
827
+ void * data = jsonFlatten (json , context );
819
828
memcpy (result ,data ,allocated_size );
820
829
pfree (data );
821
830
}