瀏覽代碼

HPCC-24371 Avoid loading/parsing query archive when loading roxie query

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 5 年之前
父節點
當前提交
1ecd6a5db8

+ 5 - 0
common/dllserver/thorplugin.cpp

@@ -731,6 +731,11 @@ extern DLLSERVER_API bool getWorkunitXMLFromFile(const char *filename, StringBuf
     return getResourceXMLFromFile(filename, "WORKUNIT", 1000, xml);
 }
 
+extern DLLSERVER_API bool getArchiveXMLFromFile(const char *filename, StringBuffer &xml)
+{
+    return getResourceXMLFromFile(filename, "ARCHIVE", 1000, xml);
+}
+
 extern DLLSERVER_API bool getManifestXMLFromFile(const char *filename, StringBuffer &xml)
 {
     return getResourceXMLFromFile(filename, "MANIFEST", 1000, xml);

+ 1 - 0
common/dllserver/thorplugin.hpp

@@ -45,6 +45,7 @@ extern DLLSERVER_API bool checkEmbeddedWorkUnitXML(ILoadedDllEntry *dll);
 extern DLLSERVER_API bool getResourceFromFile(const char *filename, MemoryBuffer &data, const char * type, unsigned id);
 extern DLLSERVER_API bool getResourceXMLFromFile(const char *filename, const char *type, unsigned id, StringBuffer &xml);
 extern DLLSERVER_API bool getWorkunitXMLFromFile(const char *filename, StringBuffer &xml);
+extern DLLSERVER_API bool getArchiveXMLFromFile(const char *filename, StringBuffer &xml);
 extern DLLSERVER_API bool getManifestXMLFromFile(const char *filename, StringBuffer &xml);
 
 extern DLLSERVER_API bool decompressResource(size32_t len, const void *data, StringBuffer &result);

+ 14 - 8
ecl/eclcc/eclcc.cpp

@@ -852,6 +852,20 @@ void EclCC::instantECL(EclCompileInstance & instance, IWorkUnit *wu, const char
                 }
                 generator->setSaveGeneratedFiles(optSaveCpp);
 
+                if (optSaveQueryArchive && instance.wu && instance.archive)
+                {
+                    StringBuffer buf;
+                    toXML(instance.archive, buf);
+                    if (optWorkUnit)
+                    {
+                        Owned<IWUQuery> q = instance.wu->updateQuery();
+                        q->setQueryText(buf);
+                    }
+                    else
+                    {
+                        generator->addArchiveAsResource(buf);
+                    }
+                }
                 bool generateOk = generator->processQuery(instance.query, target);  // NB: May clear instance.query
                 instance.stats.cppSize = generator->getGeneratedSize();
                 if (generateOk && !optNoCompile)
@@ -1433,14 +1447,6 @@ void EclCC::processSingleQuery(EclCompileInstance & instance,
     if (syntaxChecking || optGenerateMeta || optEvaluateResult)
         return;
 
-    if (optSaveQueryArchive && instance.wu && instance.archive)
-    {
-        Owned<IWUQuery> q = instance.wu->updateQuery();
-        StringBuffer buf;
-        toXML(instance.archive, buf);
-        q->setQueryText(buf);
-    }
-
     StringBuffer targetFilename;
     const char * outputFilename = instance.outputFilename;
     if (!outputFilename)

+ 4 - 1
ecl/eclccserver/eclccserver.cpp

@@ -429,7 +429,10 @@ class EclccCompileThread : implements IPooledThread, implements IErrorReporter,
                 if (!workunit->getDebugValueBool("obfuscateOutput", false))
                 {
                     Owned<IWUQuery> query = workunit->updateQuery();
-                    query->setQueryText(eclQuery.s.str());
+                    if (getArchiveXMLFromFile(realdllfilename, wuXML.clear()))  // MORE - if what was submitted was an archive, this is probably pointless?
+                        query->setQueryText(wuXML.str());
+                    else
+                        query->setQueryText(eclQuery.s.str());
                 }
 
                 createUNCFilename(realdllfilename.str(), dllurl);

+ 5 - 0
ecl/hqlcpp/hqlecl.cpp

@@ -193,6 +193,7 @@ protected:
     void addCppName(const char * filename, unsigned minActivity, unsigned maxActivity);
     void addLibrariesToCompiler();
     void addWorkUnitAsResource();
+    void addArchiveAsResource(StringBuffer &buf);
     void calculateHash(IHqlExpression * expr);
     bool doCompile(ICppCompiler * compiler);
     void doExpand(HqlCppTranslator & translator);
@@ -608,6 +609,10 @@ void HqlDllGenerator::addWorkUnitAsResource()
     code->addCompressResource("WORKUNIT", wuXML.length(), wuXML.str(), NULL, 1000);
 }
 
+void HqlDllGenerator::addArchiveAsResource(StringBuffer &buf)
+{
+    code->addCompressResource("ARCHIVE", buf.length(), buf.str(), nullptr, 1000);
+}
 
 void HqlDllGenerator::insertStandAloneCode()
 {

+ 1 - 0
ecl/hqlcpp/hqlecl.hpp

@@ -49,6 +49,7 @@ public:
     virtual void addManifestsFromArchive(IPropertyTree *archive) = 0;
     virtual void addWebServiceInfo(IPropertyTree *wsinfo) = 0;
     virtual void setSaveGeneratedFiles(bool value) = 0;
+    virtual void addArchiveAsResource(StringBuffer &buf) = 0;
 };
 
 extern HQLCPP_API IHqlExprDllGenerator * createDllGenerator(IErrorReceiver * errs, const char *wuname, const char * targetdir, IWorkUnit *wu, ClusterType targetClusterType, ICodegenContextCallback * ctxCallback, bool checkForLocalFileUploads, bool okToAbort);

+ 13 - 3
tools/wuget/wuget.cpp

@@ -76,6 +76,11 @@ int main(int argc, char **argv)
                     if (xml.length())
                     {
                         Owned<ILocalWorkUnit> wu = createLocalWorkUnit(xml);
+                        if (getArchiveXMLFromFile(filename, xml.clear()))
+                        {
+                            Owned<IWUQuery> q = wu->updateQuery();
+                            q->setQueryText(xml);
+                        }
                         if (doWorkunit)
                         {
                             exportWorkUnitToXML(wu, xml.clear(), true, false, true);
@@ -84,9 +89,14 @@ int main(int argc, char **argv)
                         if (doArchive)
                         {
                             Owned<IConstWUQuery> query = wu->getQuery();
-                            SCMStringBuffer text;
-                            query->getQueryText(text);
-                            printf("%s\n", text.s.str());
+                            if (query)
+                            {
+                                SCMStringBuffer text;
+                                query->getQueryText(text);
+                                printf("%s\n", text.s.str());
+                            }
+                            else
+                                printf("No archive found\n");
                         }
                     }
                     else