浏览代码

HPCC-10861 Include XmlSchema in JSON formatted WsWorkunits::WUResult

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 11 年之前
父节点
当前提交
a7a6863fcb

+ 1 - 1
common/fileview2/fileview.hpp

@@ -191,7 +191,7 @@ extern FILEVIEW_API int findResultSetColumn(const INewResultSet * results, const
 
 extern FILEVIEW_API unsigned getResultCursorXml(IStringVal & ret, IResultSetCursor * cursor, const char * name, unsigned start=0, unsigned count=0, const char * schemaName=NULL);
 extern FILEVIEW_API unsigned getResultXml(IStringVal & ret, INewResultSet * cursor,  const char* name, unsigned start=0, unsigned count=0, const char * schemaName=NULL);
-extern FILEVIEW_API unsigned getResultJSON(IStringVal & ret, INewResultSet * cursor,  const char* name, unsigned start=0, unsigned count=0);
+extern FILEVIEW_API unsigned getResultJSON(IStringVal & ret, INewResultSet * cursor,  const char* name, unsigned start=0, unsigned count=0, const char * schemaName=NULL);
 extern FILEVIEW_API unsigned writeResultCursorXml(IXmlWriter & writer, IResultSetCursor * cursor, const char * name, unsigned start=0, unsigned count=0, const char * schemaName=NULL);
 extern FILEVIEW_API unsigned writeResultXml(IXmlWriter & writer, INewResultSet * cursor,  const char* name, unsigned start=0, unsigned count=0, const char * schemaName=NULL);
 

+ 9 - 13
common/fileview2/fvresultset.cpp

@@ -3655,12 +3655,12 @@ extern FILEVIEW_API unsigned getResultXml(IStringVal & ret, INewResultSet * resu
     return getResultCursorXml(ret, cursor, name, start, count, schemaName);
 }
 
-extern FILEVIEW_API unsigned getResultJSON(IStringVal & ret, INewResultSet * result, const char* name,unsigned start, unsigned count)
+extern FILEVIEW_API unsigned getResultJSON(IStringVal & ret, INewResultSet * result, const char* name,unsigned start, unsigned count, const char * schemaName)
 {
     Owned<IResultSetCursor> cursor = result->createCursor();
     Owned<CommonJsonWriter> writer = new CommonJsonWriter(0);
     writer->outputBeginRoot();
-    unsigned rc = writeResultCursorXml(*writer, cursor, name, start, count, NULL);
+    unsigned rc = writeResultCursorXml(*writer, cursor, name, start, count, schemaName);
     writer->outputEndRoot();
     ret.set(writer->str());
     return rc;
@@ -3670,17 +3670,13 @@ extern FILEVIEW_API unsigned writeResultCursorXml(IXmlWriter & writer, IResultSe
 {
     if (schemaName)
     {
-        CommonXmlWriter *xmlwriter = dynamic_cast<CommonXmlWriter *>(&writer);
-        if (xmlwriter)
-        {
-            StringBuffer xsd;
-            xsd.append("<XmlSchema name=\"").append(schemaName).append("\">");
-            const IResultSetMetaData & meta = cursor->queryResultSet()->getMetaData();
-            StringBufferAdaptor adaptor(xsd);
-            meta.getXmlXPathSchema(adaptor, false);
-            xsd.append("</XmlSchema>").newline();
-            xmlwriter->outputInlineXml(xsd.str());
-        }
+        writer.outputBeginNested("XmlSchema", false);
+        writer.outputUtf8(strlen(schemaName), schemaName, "@name");
+        SCMStringBuffer xsd;
+        const IResultSetMetaData & meta = cursor->queryResultSet()->getMetaData();
+        meta.getXmlXPathSchema(xsd, false);
+        writer.outputInlineXml(xsd.str());
+        writer.outputEndNested("XmlSchema");
     }
 
     writer.outputBeginDataset(name, true);

+ 1 - 0
common/thorhelper/roxiedebug.cpp

@@ -407,6 +407,7 @@ public:
     }
 
     IMPLEMENT_IINTERFACE;
+    virtual void outputInlineXml(const char *xml){}
     virtual void outputQuoted(const char *text) { }
 
     virtual void outputString(unsigned len, const char *field, const char *fieldname) 

+ 8 - 1
common/thorhelper/thorxmlwrite.hpp

@@ -48,10 +48,10 @@ public:
     unsigned length() const                                 { return out.length(); }
     const char * str() const                                { return out.str(); }
 
-    void outputInlineXml(const char *text){out.append(text); flush(false);} //for appending xml only content
     void outputBeginNested(const char *fieldname, bool nestChildren, bool doIndent);
     void outputEndNested(const char *fieldname, bool doIndent);
 
+    virtual void outputInlineXml(const char *text){out.append(text); flush(false);} //for appending raw xml content
     virtual void outputQuoted(const char *text);
     virtual void outputQString(unsigned len, const char *field, const char *fieldname);
     virtual void outputString(unsigned len, const char *field, const char *fieldname);
@@ -103,6 +103,11 @@ public:
     void checkDelimit(int inc=0);
     void checkFormat(bool doDelimit, bool needDelimiter=true, int inc=0);
 
+    virtual void outputInlineXml(const char *text) //for appending raw xml content
+    {
+        if (text && *text)
+            outputUtf8(strlen(text), text, "xml");
+    }
     virtual void outputQuoted(const char *text);
     virtual void outputQString(unsigned len, const char *field, const char *fieldname);
     virtual void outputString(unsigned len, const char *field, const char *fieldname);
@@ -218,6 +223,8 @@ public:
     virtual void outputBeginArray(const char *fieldname){}
     virtual void outputEndArray(const char *fieldname){}
     virtual void outputSetAll();
+    virtual void outputInlineXml(const char *text){} //for appending raw xml content
+
 
     void newline();
 protected:

+ 1 - 1
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -2502,7 +2502,7 @@ void appendResultSet(MemoryBuffer& mb, INewResultSet* result, const char *name,
         } adaptor(mb);
 
         if (fmt==ESPSerializationJSON)
-            count = getResultJSON(adaptor, result, name, (unsigned) start, count);
+            count = getResultJSON(adaptor, result, name, (unsigned) start, count, (xsd) ? "myschema" : NULL);
         else
             count = getResultXml(adaptor, result, name, (unsigned) start, count, (xsd) ? "myschema" : NULL);
     }

+ 1 - 0
rtl/include/eclhelper.hpp

@@ -176,6 +176,7 @@ public:
     virtual void outputUtf8(unsigned len, const char *field, const char *fieldname) = 0;
     virtual void outputBeginArray(const char *fieldname) = 0;
     virtual void outputEndArray(const char *fieldname) = 0;
+    virtual void outputInlineXml(const char *text) = 0; //for appending raw xml content
     inline void outputCString(const char *field, const char *fieldname) { outputString((size32_t)strlen(field), field, fieldname); }
 };