Prechádzať zdrojové kódy

Merge pull request #3512 from afishbeck/wu_xmlschema3154

HPCC-3154 Improve XmlSchema availability options through WsWorkunits

Reviewed-By: Gordon Smith <gordon.smith@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 12 rokov pred
rodič
commit
1cf3b844cd

+ 1 - 1
common/fileview2/fileview.hpp

@@ -216,7 +216,7 @@ extern FILEVIEW_API INewResultSet* createNewResultSetSeqName(IResultSetFactory &
 
 
 extern FILEVIEW_API IResultSetFactory * getResultSetFactory(const char * username, const char * password);
-extern FILEVIEW_API IResultSetFactory * getSecResultSetFactory(ISecManager &secmgr, ISecUser &secuser);
+extern FILEVIEW_API IResultSetFactory * getSecResultSetFactory(ISecManager *secmgr, ISecUser *secuser, const char * username, const char * password);
 
 extern FILEVIEW_API IResultSetFactory * getRemoteResultSetFactory(const char * remoteServer, const char * username, const char * password);
 extern FILEVIEW_API IResultSetFactory * getSecRemoteResultSetFactory(const char * remoteServer, ISecManager &secmgr, ISecUser &secuser);

+ 4 - 2
common/fileview2/fvresultset.cpp

@@ -3308,9 +3308,11 @@ IResultSetFactory * getResultSetFactory(const char * username, const char * pass
     return new CResultSetFactory(username, password);
 }
 
-IResultSetFactory * getSecResultSetFactory(ISecManager &secmgr, ISecUser &secuser)
+IResultSetFactory * getSecResultSetFactory(ISecManager *secmgr, ISecUser *secuser, const char *username, const char *password)
 {
-    return new CResultSetFactory(secmgr, secuser);
+    if (secmgr)
+        return new CResultSetFactory(*secmgr, *secuser);
+    return getResultSetFactory(username, password);
 }
 
 IResultSetFactory * getRemoteResultSetFactory(const char * remoteServer, const char * username, const char * password)

+ 3 - 0
esp/scm/ws_workunits.ecm

@@ -51,6 +51,7 @@ ESPStruct [nil_remove] ECLResult
     int64  Total;
 
     ESParray<ESPstruct ECLSchemaItem>    ECLSchemas;
+    [min_ver("1.39")] string XmlSchema;
 };
 //  ===========================================================================
 ESPStruct [nil_remove] ECLTimingData
@@ -578,6 +579,7 @@ ESPrequest WUInfoRequest
     [min_ver("1.16")] bool IncludeDebugValues(true);
     [min_ver("1.16")] bool IncludeApplicationValues(true);
     [min_ver("1.16")] bool IncludeWorkflows(true);
+    [min_ver("1.39")] bool IncludeXmlSchemas(false);
     [min_ver("1.16")] bool SuppressResultSchemas(false);
     [min_ver("1.25")] string ThorSlaveIP;
 };
@@ -670,6 +672,7 @@ ESPrequest WUResultRequest
     string ResultName;
     string LogicalName;
     string Cluster;
+    bool SuppressXmlSchema(0);
 
     int64 Start(0);
     int Count;

+ 3 - 19
esp/services/ws_dfu/ws_dfuService.cpp

@@ -3273,12 +3273,7 @@ bool CWsDfuEx::onDFUGetDataColumns(IEspContext &context, IEspDFUGetDataColumnsRe
                     throw MakeStringException(ECLWATCH_INVALID_ACTION,"This feature is not designed to work with a superfile which contains multiple subfiles.");
             }
 
-            Owned<IResultSetFactory> resultSetFactory;
-            if (context.querySecManager())
-                resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-            else
-                resultSetFactory.setown(getResultSetFactory(username, passwd));
-
+            Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
             Owned<INewResultSet> result;
             if (m_clusterName.length() > 0)
             {
@@ -4029,12 +4024,7 @@ bool CWsDfuEx::onDFUBrowseData(IEspContext &context, IEspDFUBrowseDataRequest &r
             ;
         }
 
-        Owned<IResultSetFactory> resultSetFactory;
-        if (context.querySecManager())
-            resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-        else
-            resultSetFactory.setown(getResultSetFactory(username, passwd));
-
+        Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), *context.queryUser());
         Owned<INewResultSet> result;
         if (eclqueue && *eclqueue && cluster && *cluster)
         {
@@ -5033,14 +5023,8 @@ int CWsDfuEx::GetIndexData(IEspContext &context, bool bSchemaOnly, const char* i
         DBGLOG("Unknown Exception - view data file: %s", indexName);
     }
 
-    Owned<IResultSetFactory> resultSetFactory;
-    if (context.querySecManager())
-        resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-    else
-        resultSetFactory.setown(getResultSetFactory(username, passwd));
-
+    Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
     Owned<IViewFileWeb> web;
-    //Owned<INewResultSet> result;
     if (cluster && *cluster)
     {
         web.setown(createViewFileWeb(*resultSetFactory, cluster));

+ 12 - 8
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -1318,14 +1318,7 @@ void WsWuInfo::getResult(IConstWUResult &r, IArrayOf<IEspECLResult>& results, un
                 value.set(val->queryProp(NULL));
             else
             {
-                StringBuffer user, password;
-                context.getUserID(user);
-                context.getPassword(password);
-                Owned<IResultSetFactory> resultSetFactory;
-                if (context.querySecManager())
-                    resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-                else
-                    resultSetFactory.setown(getResultSetFactory(user, password));
+                Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
                 Owned<INewResultSet> result;
                 result.setown(resultSetFactory->createNewResultSet(&r, wuid.str()));
                 Owned<IResultSetCursor> cursor(result->createCursor());
@@ -1392,6 +1385,17 @@ void WsWuInfo::getResult(IConstWUResult &r, IArrayOf<IEspECLResult>& results, un
         if (getResultEclSchemas(r, schemas))
             result->setECLSchemas(schemas);
     }
+    if (flags & WUINFO_IncludeXmlSchema)
+    {
+        Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
+        Owned<INewResultSet> rs = resultSetFactory->createNewResultSet(&r, wuid.str());
+        Owned<IResultSetCursor> cursor(rs->createCursor());
+
+        SCMStringBuffer xsd;
+        const IResultSetMetaData & meta = cursor->queryResultSet()->getMetaData();
+        meta.getXmlXPathSchema(xsd, false);
+        result->setXmlSchema(xsd.str());
+    }
 
     if (filename.length())
         result->setShowFileContent(shouldFileContentBeShown(context, filename.str()));

+ 14 - 13
esp/services/ws_workunits/ws_workunitsHelpers.hpp

@@ -103,19 +103,20 @@ private:
     int numinf;
 };
 
-#define WUINFO_TruncateEclTo64k         0x001
-#define WUINFO_IncludeExceptions        0x002
-#define WUINFO_IncludeGraphs            0x004
-#define WUINFO_IncludeResults           0x008
-#define WUINFO_IncludeVariables         0x010
-#define WUINFO_IncludeTimers            0x020
-#define WUINFO_IncludeDebugValues       0x040
-#define WUINFO_IncludeApplicationValues 0x080
-#define WUINFO_IncludeWorkflows         0x100
-#define WUINFO_IncludeEclSchemas        0x200
-#define WUINFO_IncludeSourceFiles       0x400
-#define WUINFO_IncludeResultsViewNames  0x800
-#define WUINFO_All                      0xFFF
+#define WUINFO_TruncateEclTo64k         0x0001
+#define WUINFO_IncludeExceptions        0x0002
+#define WUINFO_IncludeGraphs            0x0004
+#define WUINFO_IncludeResults           0x0008
+#define WUINFO_IncludeVariables         0x0010
+#define WUINFO_IncludeTimers            0x0020
+#define WUINFO_IncludeDebugValues       0x0040
+#define WUINFO_IncludeApplicationValues 0x0080
+#define WUINFO_IncludeWorkflows         0x0100
+#define WUINFO_IncludeEclSchemas        0x0200
+#define WUINFO_IncludeSourceFiles       0x0400
+#define WUINFO_IncludeResultsViewNames  0x0800
+#define WUINFO_IncludeXmlSchema         0x1000
+#define WUINFO_All                      0xFFFF
 
 class WsWuInfo
 {

+ 18 - 23
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -1726,7 +1726,8 @@ bool CWsWorkunitsEx::onWUInfo(IEspContext &context, IEspWUInfoRequest &req, IEsp
                 flags|=WUINFO_IncludeWorkflows;
             if (!req.getSuppressResultSchemas())
                 flags|=WUINFO_IncludeEclSchemas;
-
+            if (req.getIncludeXmlSchemas())
+                flags|=WUINFO_IncludeXmlSchema;
             try
             {
                 WsWuInfo winfo(context, wuid.str());
@@ -2403,7 +2404,7 @@ bool CWsWorkunitsEx::onWUQuery(IEspContext &context, IEspWUQueryRequest & req, I
     return true;
 }
 
-void appendResultSet(MemoryBuffer& mb, INewResultSet* result, const char *name, __int64 start, unsigned& count, __int64& total, bool bin)
+void appendResultSet(MemoryBuffer& mb, INewResultSet* result, const char *name, __int64 start, unsigned& count, __int64& total, bool bin, bool xsd)
 {
     if (!result)
         return;
@@ -2429,11 +2430,11 @@ void appendResultSet(MemoryBuffer& mb, INewResultSet* result, const char *name,
             MemoryBuffer & buffer;
         } adaptor(mb);
 
-        count = getResultXml(adaptor, result, name, (unsigned) start, count, "myschema");
+        count = getResultXml(adaptor, result, name, (unsigned) start, count, (xsd) ? "myschema" : NULL);
     }
 }
 
-void getWsWuResult(IEspContext &context, const char* wuid, const char *name, const char *logical, unsigned index, __int64 start, unsigned& count, __int64& total, IStringVal& resname, bool bin, MemoryBuffer& mb)
+void getWsWuResult(IEspContext &context, const char* wuid, const char *name, const char *logical, unsigned index, __int64 start, unsigned& count, __int64& total, IStringVal& resname, bool bin, MemoryBuffer& mb, bool xsd=true)
 {
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
@@ -2465,12 +2466,7 @@ void getWsWuResult(IEspContext &context, const char* wuid, const char *name, con
     if (!resname.length())
         result->getResultName(resname);
 
-    Owned<IResultSetFactory> resultSetFactory;
-    if (context.querySecManager())
-        resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-    else
-        resultSetFactory.setown(getResultSetFactory(context.queryUserId(), context.queryPassword()));
-
+    Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
     SCMStringBuffer logicalName;
     result->getResultLogicalName(logicalName);
     Owned<INewResultSet> rs;
@@ -2481,7 +2477,7 @@ void getWsWuResult(IEspContext &context, const char* wuid, const char *name, con
     }
     else
         rs.setown(resultSetFactory->createNewResultSet(result, wuid));
-    appendResultSet(mb, rs, name, start, count, total, bin);
+    appendResultSet(mb, rs, name, start, count, total, bin, xsd);
 }
 
 void openSaveFile(IEspContext &context, int opt, const char* filename, const char* origMimeType, MemoryBuffer& buf, IEspWULogFileResponse &resp)
@@ -2820,16 +2816,11 @@ bool CWsWorkunitsEx::onWUResultSummary(IEspContext &context, IEspWUResultSummary
     return true;
 }
 
-void getFileResults(IEspContext &context, const char* logicalName, const char* cluster,__int64 start, unsigned& count,__int64& total,IStringVal& resname,bool bin, MemoryBuffer& buf)
+void getFileResults(IEspContext &context, const char* logicalName, const char* cluster,__int64 start, unsigned& count,__int64& total,IStringVal& resname,bool bin, MemoryBuffer& buf, bool xsd)
 {
-    Owned<IResultSetFactory> resultSetFactory;
-    if (context.querySecManager())
-        resultSetFactory.setown(getSecResultSetFactory(*context.querySecManager(), *context.queryUser()));
-    else
-        resultSetFactory.setown(getResultSetFactory(context.queryUserId(), context.queryPassword()));
-
+    Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
     Owned<INewResultSet> result(resultSetFactory->createNewFileResultSet(logicalName, cluster));
-    appendResultSet(buf, result, resname.str(), start, count, total, bin);
+    appendResultSet(buf, result, resname.str(), start, count, total, bin, xsd);
 }
 
 void getWorkunitCluster(IEspContext &context, const char* wuid, SCMStringBuffer& cluster, bool checkArchiveWUs)
@@ -2871,6 +2862,7 @@ bool CWsWorkunitsEx::onWUResult(IEspContext &context, IEspWUResultRequest &req,
         __int64 start = req.getStart() > 0 ? req.getStart() : 0;
         unsigned count=req.getCount() ? req.getCount() : 100, requested=count;
         unsigned seq = req.getSequence();
+        bool inclXsd = !req.getSuppressXmlSchema();
 
         VStringBuffer filter("start=%"I64F"d;count=%d", start, count);
         addToQueryString(filter, "clusterName", req.getCluster(), ';');
@@ -2879,10 +2871,13 @@ bool CWsWorkunitsEx::onWUResult(IEspContext &context, IEspWUResultRequest &req,
             addToQueryString(filter, "wuid", wuid, ';');
         addToQueryString(filter, "resultName", req.getResultName(), ';');
         filter.appendf(";seq=%d;", seq);
+        if (inclXsd)
+            filter.append("xsd;");
 
         const char* logicalName = req.getLogicalName();
         const char* clusterName = req.getCluster();
         const char* resultName = req.getResultName();
+
         Owned<DataCacheElement> data = dataCache->lookup(context, filter, awusCacheMinutes);
         if (data)
         {
@@ -2917,12 +2912,12 @@ bool CWsWorkunitsEx::onWUResult(IEspContext &context, IEspWUResultRequest &req,
                     getWorkunitCluster(context, lwuid.str(), cluster, true);
                 if (cluster.length())
                 {
-                    getFileResults(context, logicalName, cluster.str(), start, count, total, name, false, mb);
+                    getFileResults(context, logicalName, cluster.str(), start, count, total, name, false, mb, inclXsd);
                     resp.setLogicalName(logicalName);
                 }
                 else if (notEmpty(clusterName))
                 {
-                    getFileResults(context, logicalName, clusterName, start, count, total, name, false, mb);
+                    getFileResults(context, logicalName, clusterName, start, count, total, name, false, mb, inclXsd);
                     resp.setLogicalName(logicalName);
                 }
                 else
@@ -2931,13 +2926,13 @@ bool CWsWorkunitsEx::onWUResult(IEspContext &context, IEspWUResultRequest &req,
             else if (notEmpty(wuid) && notEmpty(resultName))
             {
                 name.set(resultName);
-                getWsWuResult(context, wuid, resultName, NULL, 0, start, count, total, name, false, mb);
+                getWsWuResult(context, wuid, resultName, NULL, 0, start, count, total, name, false, mb, inclXsd);
                 resp.setWuid(wuid);
                 resp.setSequence(seq);
             }
             else
             {
-                getWsWuResult(context, wuid, NULL, NULL, seq, start, count, total, name, false, mb);
+                getWsWuResult(context, wuid, NULL, NULL, seq, start, count, total, name, false, mb, inclXsd);
                 resp.setWuid(wuid);
                 resp.setSequence(seq);
             }