Pārlūkot izejas kodu

Merge pull request #5143 from afishbeck/eclgen_json_array

HPCC-10424 Make codegen use of IXmlWriter JSON compatible

Reviewed-By: Gavin Halliday <gavin.halliday@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 gadi atpakaļ
vecāks
revīzija
beed9de8d0

+ 4 - 0
ecl/hqlcpp/hqlcatom.cpp

@@ -458,9 +458,11 @@ IIdAtom * newWorkUnitReadArgId;
 IIdAtom * newWorkUnitWriteArgId;
 IIdAtom * offsetProviderId;
 IIdAtom * outputXmlBeginNestedId;
+IIdAtom * outputXmlBeginArrayId;
 IIdAtom * outputXmlBoolId;
 IIdAtom * outputXmlDataId;
 IIdAtom * outputXmlDecimalId;
+IIdAtom * outputXmlEndArrayId;
 IIdAtom * outputXmlEndNestedId;
 IIdAtom * outputXmlIntId;
 IIdAtom * outputXmlQStringId;
@@ -1097,10 +1099,12 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     MAKEID(newWorkUnitReadArg);
     MAKEID(newWorkUnitWriteArg);
     MAKEID(offsetProvider);
+    MAKEID(outputXmlBeginArray);
     MAKEID(outputXmlBeginNested);
     MAKEID(outputXmlBool);
     MAKEID(outputXmlData);
     MAKEID(outputXmlDecimal);
+    MAKEID(outputXmlEndArray);
     MAKEID(outputXmlEndNested);
     MAKEID(outputXmlInt);
     MAKEID(outputXmlQString);

+ 2 - 0
ecl/hqlcpp/hqlcatom.hpp

@@ -457,10 +457,12 @@ extern IIdAtom * newSplitArgId;
 extern IIdAtom * newWorkUnitReadArgId;
 extern IIdAtom * newWorkUnitWriteArgId;
 extern IIdAtom * offsetProviderId;
+extern IIdAtom * outputXmlBeginArrayId;
 extern IIdAtom * outputXmlBeginNestedId;
 extern IIdAtom * outputXmlBoolId;
 extern IIdAtom * outputXmlDataId;
 extern IIdAtom * outputXmlDecimalId;
+extern IIdAtom * outputXmlEndArrayId;
 extern IIdAtom * outputXmlEndNestedId;
 extern IIdAtom * outputXmlIntId;
 extern IIdAtom * outputXmlQStringId;

+ 2 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -1658,6 +1658,8 @@ public:
     void buildXmlSerializeSet(BuildCtx & ctx, IHqlExpression * field, IHqlExpression * value);
     void buildXmlSerializeSetValues(BuildCtx & ctx, IHqlExpression * value, IHqlExpression * itemName, bool includeAll);
     void buildXmlSerializeDataset(BuildCtx & ctx, IHqlExpression * field, IHqlExpression * value, HqlExprArray * assigns);
+    void buildXmlSerializeBeginArray(BuildCtx & ctx, IHqlExpression * name);
+    void buildXmlSerializeEndArray(BuildCtx & ctx, IHqlExpression * name);
     void buildXmlSerializeBeginNested(BuildCtx & ctx, IHqlExpression * name, bool doIndent);
     void buildXmlSerializeEndNested(BuildCtx & ctx, IHqlExpression * name);
     void buildXmlSerializeUsingMeta(BuildCtx & ctx, IHqlExpression * dataset, const char * self);

+ 2 - 0
ecl/hqlcpp/hqlcppsys.ecl

@@ -461,6 +461,8 @@ const char * cppSystemText[]  = {
     "   outputXmlUInt(unsigned8 value, const varstring name) :  eclrtl,omethod,entrypoint='outputUInt';",
     "   outputXmlUnicode(const unicode value, const varstring name) :   eclrtl,omethod,entrypoint='outputUnicode';",
     "   outputXmlUtf8(const utf8 value, const varstring name) : eclrtl,omethod,entrypoint='outputUtf8';",
+    "   outputXmlBeginArray(const varstring name) :  eclrtl,omethod,entrypoint='outputBeginArray';",
+    "   outputXmlEndArray(const varstring name) :  eclrtl,omethod,entrypoint='outputEndArray';",
     "   outputXmlBeginNested(const varstring name, boolean nestChildren) :  eclrtl,omethod,entrypoint='outputBeginNested';",
     "   outputXmlEndNested(const varstring name) :  eclrtl,omethod,entrypoint='outputEndNested';",
     "   outputXmlSetAll() : eclrtl,omethod,entrypoint='outputSetAll';",

+ 26 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -10571,6 +10571,28 @@ void HqlCppTranslator::buildXmlSerializeEndNested(BuildCtx & ctx, IHqlExpression
     }
 }
 
+void HqlCppTranslator::buildXmlSerializeBeginArray(BuildCtx & ctx, IHqlExpression * name)
+{
+    if (name)
+    {
+        HqlExprArray args;
+        args.append(*createVariable("out", makeBoolType()));
+        args.append(*LINK(name));
+        callProcedure(ctx, outputXmlBeginArrayId, args);
+    }
+}
+
+void HqlCppTranslator::buildXmlSerializeEndArray(BuildCtx & ctx, IHqlExpression * name)
+{
+    if (name)
+    {
+        HqlExprArray args;
+        args.append(*createVariable("out", makeBoolType()));
+        args.append(*LINK(name));
+        callProcedure(ctx, outputXmlEndArrayId, args);
+    }
+}
+
 void HqlCppTranslator::buildXmlSerializeSet(BuildCtx & ctx, IHqlExpression * field, IHqlExpression * value)
 {
     OwnedHqlExpr name, itemName;
@@ -10578,7 +10600,9 @@ void HqlCppTranslator::buildXmlSerializeSet(BuildCtx & ctx, IHqlExpression * fie
 
     HqlExprArray args;
     buildXmlSerializeBeginNested(ctx, name, false);
+    buildXmlSerializeBeginArray(ctx, itemName);
     buildXmlSerializeSetValues(ctx, value, itemName, (name != NULL));
+    buildXmlSerializeEndArray(ctx, itemName);
     buildXmlSerializeEndNested(ctx, name);
 }
 
@@ -10589,6 +10613,7 @@ void HqlCppTranslator::buildXmlSerializeDataset(BuildCtx & ctx, IHqlExpression *
 
     HqlExprArray args;
     buildXmlSerializeBeginNested(ctx, name, false);
+    buildXmlSerializeBeginArray(ctx, rowName);
 
     Owned<IHqlCppDatasetCursor> cursor = createDatasetSelector(ctx, value);
     BuildCtx subctx(ctx);
@@ -10601,6 +10626,7 @@ void HqlCppTranslator::buildXmlSerializeDataset(BuildCtx & ctx, IHqlExpression *
 
     buildXmlSerializeEndNested(subctx, rowName);
 
+    buildXmlSerializeEndArray(ctx, rowName);
     buildXmlSerializeEndNested(ctx, name);
 }