浏览代码

HPCC-12250 Allow pluggable interface to workunit creation

First stab at the IWorkUnitInfo lightweight interface

Also changed to return const char * for all the functions in the lightweight
interface. And fixed some bugs I spotted on the way.

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 10 年之前
父节点
当前提交
a91ef1e5ff
共有 35 个文件被更改,包括 295 次插入497 次删除
  1. 2 2
      common/fileview2/fvdisksource.cpp
  2. 5 7
      common/fileview2/fvquerysource.cpp
  3. 1 10
      common/fileview2/fvresultset.cpp
  4. 50 77
      common/workunit/workunit.cpp
  5. 15 10
      common/workunit/workunit.hpp
  6. 2 3
      common/workunit/wujobq.cpp
  7. 9 13
      common/wuwebview/wuwebview.cpp
  8. 5 7
      dali/daliadmin/daliadmin.cpp
  9. 13 27
      ecl/eclagent/eclagent.cpp
  10. 6 17
      ecl/eclagent/eclgraph.cpp
  11. 9 11
      ecl/eclccserver/eclccserver.cpp
  12. 1 3
      ecl/hqlcpp/hqlcpp.cpp
  13. 1 3
      ecl/hqlcpp/hqlhtcpp.cpp
  14. 7 17
      ecl/hthor/hthor.cpp
  15. 14 30
      ecl/wutest/wutest.cpp
  16. 2 4
      esp/services/ecldirect/EclDirectService.cpp
  17. 5 11
      esp/services/ws_dfu/ws_dfuService.cpp
  18. 2 3
      esp/services/ws_ecl/ws_ecl_service.cpp
  19. 8 10
      esp/services/ws_smc/ws_smcService.cpp
  20. 29 48
      esp/services/ws_workunits/ws_workunitsHelpers.cpp
  21. 3 3
      esp/services/ws_workunits/ws_workunitsHelpers.hpp
  22. 7 7
      esp/services/ws_workunits/ws_workunitsQuerySets.cpp
  23. 28 43
      esp/services/ws_workunits/ws_workunitsService.cpp
  24. 24 36
      esp/smc/SMCLib/WUXMLInfo.cpp
  25. 2 3
      plugins/fileservices/fileservices.cpp
  26. 9 23
      roxie/ccd/ccdcontext.cpp
  27. 0 2
      roxie/ccd/ccdlistener.cpp
  28. 4 8
      roxie/ccd/ccdquery.cpp
  29. 0 2
      roxie/ccd/ccdqueue.cpp
  30. 6 10
      roxie/ccd/ccdserver.cpp
  31. 7 17
      thorlcr/graph/thgraphmaster.cpp
  32. 1 3
      thorlcr/master/thdemonserver.cpp
  33. 10 18
      thorlcr/master/thgraphmanager.cpp
  34. 3 4
      thorlcr/mfilemanager/thmfilemanager.cpp
  35. 5 5
      tools/swapnode/swapnodelib.cpp

+ 2 - 2
common/fileview2/fvdisksource.cpp

@@ -659,7 +659,7 @@ bool TranslatedDiskDataSource::createHelperWU()
     query->setQueryText(eclText.str());
     query->setQueryText(eclText.str());
     query->setQueryName(jobName.str());
     query->setQueryName(jobName.str());
 
 
-    StringAttrAdaptor xxx(helperWuid); workunit->getWuid(xxx);
+    helperWuid.set(workunit->queryWuid());
     return true;
     return true;
 }
 }
 
 
@@ -729,7 +729,7 @@ bool IndirectDiskDataSource::createBrowseWU()
     query->setQueryText(eclText.str());
     query->setQueryText(eclText.str());
     query->setQueryName(jobName.str());
     query->setQueryName(jobName.str());
 
 
-    StringAttrAdaptor xxx(browseWuid); workunit->getWuid(xxx);
+    browseWuid.set(workunit->queryWuid());
     return true;
     return true;
 }
 }
 
 

+ 5 - 7
common/fileview2/fvquerysource.cpp

@@ -71,15 +71,13 @@ bool QueryDataSource::createBrowseWU()
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
     Owned<IConstWorkUnit> parent = factory->openWorkUnit(wuid, false);
     Owned<IConstWorkUnit> parent = factory->openWorkUnit(wuid, false);
 
 
-    SCMStringBuffer user;
-    StringAttrAdaptor acluster(cluster);
-    parent->getClusterName(acluster);
-    parent->getUser(user);
+    cluster.set(parent->queryClusterName());
+    const char *user = parent->queryUser();
 
 
-    Owned<IWorkUnit> workunit = factory->createWorkUnit("fileViewer", user.str());
-    workunit->setUser(user.str());
+    Owned<IWorkUnit> workunit = factory->createWorkUnit("fileViewer", user);
+    workunit->setUser(user);
     workunit->setClusterName(cluster);
     workunit->setClusterName(cluster);
-    StringAttrAdaptor bwa(browseWuid); workunit->getWuid(bwa);
+    browseWuid.set(workunit->queryWuid());
 
 
     workunit->setDebugValueInt("importImplicitModules", false, true);
     workunit->setDebugValueInt("importImplicitModules", false, true);
     workunit->setDebugValueInt("importAllModules", false, true);
     workunit->setDebugValueInt("importAllModules", false, true);

+ 1 - 10
common/fileview2/fvresultset.cpp

@@ -3287,9 +3287,6 @@ inline const char *getSeverityTagname(WUExceptionSeverity severity, unsigned fla
 
 
 extern FILEVIEW_API void writeFullWorkUnitResults(const char *username, const char *password, const IConstWorkUnit *cw, IXmlWriter &writer, unsigned flags, WUExceptionSeverity minSeverity, const char *rootTag)
 extern FILEVIEW_API void writeFullWorkUnitResults(const char *username, const char *password, const IConstWorkUnit *cw, IXmlWriter &writer, unsigned flags, WUExceptionSeverity minSeverity, const char *rootTag)
 {
 {
-    SCMStringBuffer wuid;
-    cw->getWuid(wuid);
-
     if (rootTag && *rootTag && !(flags & WorkUnitXML_NoRoot))
     if (rootTag && *rootTag && !(flags & WorkUnitXML_NoRoot))
         writer.outputBeginNested(rootTag, true);
         writer.outputBeginNested(rootTag, true);
 
 
@@ -3335,7 +3332,7 @@ extern FILEVIEW_API void writeFullWorkUnitResults(const char *username, const ch
                 {
                 {
                     SCMStringBuffer name;
                     SCMStringBuffer name;
                     ds.getResultName(name);
                     ds.getResultName(name);
-                    Owned<INewResultSet> nr = factory->createNewResultSet(&ds, wuid.str());
+                    Owned<INewResultSet> nr = factory->createNewResultSet(&ds, cw->queryWuid());
                     const IProperties *xmlns = ds.queryResultXmlns();
                     const IProperties *xmlns = ds.queryResultXmlns();
                     writeResultXml(writer, nr.get(), name.str(), 0, 0, (flags & WorkUnitXML_InclSchema) ? name.str() : NULL, xmlns);
                     writeResultXml(writer, nr.get(), name.str(), 0, 0, (flags & WorkUnitXML_InclSchema) ? name.str() : NULL, xmlns);
                 }
                 }
@@ -3356,9 +3353,6 @@ extern FILEVIEW_API void writeFullWorkUnitResults(const char *username, const ch
 
 
 extern FILEVIEW_API IStringVal& getFullWorkUnitResultsXML(const char *username, const char *password, const IConstWorkUnit *cw, IStringVal &str, unsigned flags, WUExceptionSeverity minSeverity)
 extern FILEVIEW_API IStringVal& getFullWorkUnitResultsXML(const char *username, const char *password, const IConstWorkUnit *cw, IStringVal &str, unsigned flags, WUExceptionSeverity minSeverity)
 {
 {
-    SCMStringBuffer wuid;
-    cw->getWuid(wuid);
-
     Owned<CommonXmlWriter> writer = CreateCommonXmlWriter(XWFexpandempty);
     Owned<CommonXmlWriter> writer = CreateCommonXmlWriter(XWFexpandempty);
     writeFullWorkUnitResults(username, password, cw, *writer, flags, minSeverity, "Result");
     writeFullWorkUnitResults(username, password, cw, *writer, flags, minSeverity, "Result");
 
 
@@ -3372,9 +3366,6 @@ extern FILEVIEW_API IStringVal& getFullWorkUnitResultsXML(const char *username,
 
 
 extern FILEVIEW_API IStringVal& getFullWorkUnitResultsJSON(const char *username, const char *password, const IConstWorkUnit *cw, IStringVal &str, unsigned flags, WUExceptionSeverity minSeverity)
 extern FILEVIEW_API IStringVal& getFullWorkUnitResultsJSON(const char *username, const char *password, const IConstWorkUnit *cw, IStringVal &str, unsigned flags, WUExceptionSeverity minSeverity)
 {
 {
-    SCMStringBuffer wuid;
-    cw->getWuid(wuid);
-
     Owned<CommonJsonWriter> writer = new CommonJsonWriter(0);
     Owned<CommonJsonWriter> writer = new CommonJsonWriter(0);
     writer->outputBeginRoot();
     writer->outputBeginRoot();
     writeFullWorkUnitResults(username, password, cw, *writer, flags, minSeverity, "Results");
     writeFullWorkUnitResults(username, password, cw, *writer, flags, minSeverity, "Results");

+ 50 - 77
common/workunit/workunit.cpp

@@ -133,8 +133,7 @@ static bool checkWuSecAccess(IConstWorkUnit &cw, ISecManager &secmgr, ISecUser *
     bool ret=(!secuser) ? true : (secmgr.authorizeEx(RT_WORKUNIT_SCOPE, *secuser, cw.getWuScope(wuscope).str())>=required);
     bool ret=(!secuser) ? true : (secmgr.authorizeEx(RT_WORKUNIT_SCOPE, *secuser, cw.getWuScope(wuscope).str())>=required);
     if (!ret && (log || excpt))
     if (!ret && (log || excpt))
     {
     {
-        SCMStringBuffer wuid;
-        wuAccessError(secuser ? secuser->getName() : NULL, action, wuscope.str(), cw.getWuid(wuid).str(), excpt, log);
+        wuAccessError(secuser ? secuser->getName() : NULL, action, wuscope.str(), cw.queryWuid(), excpt, log);
     }
     }
     return ret;
     return ret;
 }
 }
@@ -1084,7 +1083,7 @@ public:
     virtual IConstLocalFileUploadIterator * getLocalFileUploads() const;
     virtual IConstLocalFileUploadIterator * getLocalFileUploads() const;
     virtual bool requiresLocalFileUpload() const;
     virtual bool requiresLocalFileUpload() const;
     virtual bool getIsQueryService() const;
     virtual bool getIsQueryService() const;
-    virtual IStringVal & getClusterName(IStringVal & str) const;
+    virtual const char *queryClusterName() const;
     virtual bool hasDebugValue(const char * propname) const;
     virtual bool hasDebugValue(const char * propname) const;
     virtual IStringVal & getDebugValue(const char * propname, IStringVal & str) const;
     virtual IStringVal & getDebugValue(const char * propname, IStringVal & str) const;
     virtual IStringIterator & getDebugValues() const;
     virtual IStringIterator & getDebugValues() const;
@@ -1104,7 +1103,7 @@ public:
     virtual IConstWUGraphMetaIterator & getGraphsMeta(WUGraphType type) const;
     virtual IConstWUGraphMetaIterator & getGraphsMeta(WUGraphType type) const;
     virtual IConstWUGraph * getGraph(const char *name) const;
     virtual IConstWUGraph * getGraph(const char *name) const;
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const;
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const;
-    virtual IStringVal & getJobName(IStringVal & str) const;
+    virtual const char *queryJobName() const;
     virtual IConstWUPlugin * getPluginByName(const char * name) const;
     virtual IConstWUPlugin * getPluginByName(const char * name) const;
     virtual IConstWUPluginIterator & getPlugins() const;
     virtual IConstWUPluginIterator & getPlugins() const;
     virtual IConstWULibraryIterator & getLibraries() const;
     virtual IConstWULibraryIterator & getLibraries() const;
@@ -1123,7 +1122,7 @@ public:
     virtual IStringVal & getStateEx(IStringVal & str) const;
     virtual IStringVal & getStateEx(IStringVal & str) const;
     virtual __int64 getAgentSession() const;
     virtual __int64 getAgentSession() const;
     virtual unsigned getAgentPID() const;
     virtual unsigned getAgentPID() const;
-    virtual IStringVal & getStateDesc(IStringVal & str) const;
+    virtual const char *queryStateDesc() const;
     virtual IConstWUResult * getTemporaryByName(const char * name) const;
     virtual IConstWUResult * getTemporaryByName(const char * name) const;
     virtual IConstWUResultIterator & getTemporaries() const;
     virtual IConstWUResultIterator & getTemporaries() const;
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const;
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const;
@@ -1140,11 +1139,11 @@ public:
     virtual bool getWuDate(unsigned & year, unsigned & month, unsigned& day);
     virtual bool getWuDate(unsigned & year, unsigned & month, unsigned& day);
     virtual IStringVal & getSnapshot(IStringVal & str) const;
     virtual IStringVal & getSnapshot(IStringVal & str) const;
 
 
-    virtual IStringVal & getUser(IStringVal & str) const;
+    virtual const char *queryUser() const;
     virtual IStringVal & getWuScope(IStringVal & str) const;
     virtual IStringVal & getWuScope(IStringVal & str) const;
     virtual IConstWUResult * getVariableByName(const char * name) const;
     virtual IConstWUResult * getVariableByName(const char * name) const;
     virtual IConstWUResultIterator & getVariables() const;
     virtual IConstWUResultIterator & getVariables() const;
-    virtual IStringVal & getWuid(IStringVal & str) const;
+    virtual const char *queryWuid() const;
     virtual bool getRunningGraph(IStringVal &graphName, WUGraphIDType &subId) const;
     virtual bool getRunningGraph(IStringVal &graphName, WUGraphIDType &subId) const;
     virtual bool isProtected() const;
     virtual bool isProtected() const;
     virtual bool isPausing() const;
     virtual bool isPausing() const;
@@ -1593,12 +1592,7 @@ public:
     ~CLockedWorkUnit()
     ~CLockedWorkUnit()
     {
     {
         if (workUnitTraceLevel > 1)
         if (workUnitTraceLevel > 1)
-        {
-            StringAttr x;
-            StringAttrAdaptor strval(x);
-            getWuid(strval);
-            PrintLog("Releasing locked workunit %s", x.get());
-        }
+            PrintLog("Releasing locked workunit %s", queryWuid());
         if (c)
         if (c)
             c->unlockRemote();
             c->unlockRemote();
     }
     }
@@ -1644,8 +1638,8 @@ public:
             { return c->getCloneable(); }
             { return c->getCloneable(); }
     virtual IUserDescriptor * queryUserDescriptor() const
     virtual IUserDescriptor * queryUserDescriptor() const
             { return c->queryUserDescriptor(); }
             { return c->queryUserDescriptor(); }
-    virtual IStringVal & getClusterName(IStringVal & str) const
-            { return c->getClusterName(str); }
+    virtual const char *queryClusterName() const
+            { return c->queryClusterName(); }
     virtual unsigned getCodeVersion() const
     virtual unsigned getCodeVersion() const
             { return c->getCodeVersion(); }
             { return c->getCodeVersion(); }
     virtual unsigned getWuidVersion() const
     virtual unsigned getWuidVersion() const
@@ -1688,8 +1682,8 @@ public:
             { return c->getGraph(name); }
             { return c->getGraph(name); }
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const
             { return c->getGraphProgress(name); }
             { return c->getGraphProgress(name); }
-    virtual IStringVal & getJobName(IStringVal & str) const
-            { return c->getJobName(str); }
+    virtual const char *queryJobName() const
+            { return c->queryJobName(); }
     virtual IConstWUPlugin * getPluginByName(const char * name) const
     virtual IConstWUPlugin * getPluginByName(const char * name) const
             { return c->getPluginByName(name); }
             { return c->getPluginByName(name); }
     virtual IConstWUPluginIterator & getPlugins() const
     virtual IConstWUPluginIterator & getPlugins() const
@@ -1732,8 +1726,8 @@ public:
             { return c->getAgentSession(); }
             { return c->getAgentSession(); }
     virtual unsigned getAgentPID() const
     virtual unsigned getAgentPID() const
             { return c->getAgentPID(); }
             { return c->getAgentPID(); }
-    virtual IStringVal & getStateDesc(IStringVal & str) const
-            { return c->getStateDesc(str); }
+    virtual const char *queryStateDesc() const
+            { return c->queryStateDesc(); }
     virtual bool getRunningGraph(IStringVal & graphName, WUGraphIDType & subId) const
     virtual bool getRunningGraph(IStringVal & graphName, WUGraphIDType & subId) const
             { return c->getRunningGraph(graphName, subId); }
             { return c->getRunningGraph(graphName, subId); }
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const
@@ -1745,12 +1739,12 @@ public:
 
 
     virtual IStringVal & getSnapshot(IStringVal & str) const
     virtual IStringVal & getSnapshot(IStringVal & str) const
             { return c->getSnapshot(str); } 
             { return c->getSnapshot(str); } 
-    virtual IStringVal & getUser(IStringVal & str) const
-            { return c->getUser(str); }
+    virtual const char *queryUser() const
+            { return c->queryUser(); }
     virtual IStringVal & getWuScope(IStringVal & str) const
     virtual IStringVal & getWuScope(IStringVal & str) const
             { return c->getWuScope(str); }
             { return c->getWuScope(str); }
-    virtual IStringVal & getWuid(IStringVal & str) const
-            { return c->getWuid(str); }
+    virtual const char *queryWuid() const
+            { return c->queryWuid(); }
     virtual IConstWUResult * getGlobalByName(const char * name) const
     virtual IConstWUResult * getGlobalByName(const char * name) const
             { return c->getGlobalByName(name); }
             { return c->getGlobalByName(name); }
     virtual IConstWUResult * getTemporaryByName(const char * name) const
     virtual IConstWUResult * getTemporaryByName(const char * name) const
@@ -2207,7 +2201,6 @@ class CLocalWUGraph : public CInterface, implements IWUGraph
     Owned<IPropertyTree> p;
     Owned<IPropertyTree> p;
     mutable Owned<IPropertyTree> graph; // cached copy of graph xgmml
     mutable Owned<IPropertyTree> graph; // cached copy of graph xgmml
     mutable Linked<IConstWUGraphProgress> progress;
     mutable Linked<IConstWUGraphProgress> progress;
-    StringAttr wuid;
     unsigned wuidVersion;
     unsigned wuidVersion;
 
 
     void mergeProgress(IPropertyTree &tree, IPropertyTree &progressTree, const unsigned &progressV) const;
     void mergeProgress(IPropertyTree &tree, IPropertyTree &progressTree, const unsigned &progressV) const;
@@ -2606,11 +2599,7 @@ public:
             PrintLog("createWorkUnit created %s", wuid.str());
             PrintLog("createWorkUnit created %s", wuid.str());
         IWorkUnit* ret = createNamedWorkUnit(wuid.str(), app, user);
         IWorkUnit* ret = createNamedWorkUnit(wuid.str(), app, user);
         if (workUnitTraceLevel > 1)
         if (workUnitTraceLevel > 1)
-        {
-            SCMStringBuffer wuidName;
-            ret->getWuid(wuidName);
-            PrintLog("createWorkUnit created %s", wuidName.str());
-        }
+            PrintLog("createWorkUnit created %s", ret->queryWuid());
         addTimeStamp(ret, SSTglobal, NULL, StWhenCreated);
         addTimeStamp(ret, SSTglobal, NULL, StWhenCreated);
         return ret;
         return ret;
     }
     }
@@ -4056,11 +4045,10 @@ IWorkUnit& CLocalWorkUnit::lock()
     return lockRemote(true);
     return lockRemote(true);
 }
 }
 
 
-IStringVal& CLocalWorkUnit::getWuid(IStringVal &str) const
+const char *CLocalWorkUnit::queryWuid() const
 {
 {
     CriticalBlock block(crit);
     CriticalBlock block(crit);
-    str.set(p->queryName());
-    return str;
+    return p->queryName();
 }
 }
 
 
 unsigned CLocalWorkUnit::getDebugAgentListenerPort() const
 unsigned CLocalWorkUnit::getDebugAgentListenerPort() const
@@ -4112,11 +4100,13 @@ void CLocalWorkUnit::setJobName(const char *value)
     p->setProp("@jobName", value);
     p->setProp("@jobName", value);
 }
 }
 
 
-IStringVal& CLocalWorkUnit::getJobName(IStringVal &str) const
+const char *CLocalWorkUnit::queryJobName() const
 {
 {
     CriticalBlock block(crit);
     CriticalBlock block(crit);
-    str.set(p->queryProp("@jobName"));
-    return str;
+    const char *ret = p->queryProp("@jobName");
+    if (!ret)
+        ret = "";
+    return ret;
 }
 }
 
 
 void CLocalWorkUnit::setClusterName(const char *value)
 void CLocalWorkUnit::setClusterName(const char *value)
@@ -4125,11 +4115,13 @@ void CLocalWorkUnit::setClusterName(const char *value)
     p->setProp("@clusterName", value);
     p->setProp("@clusterName", value);
 }
 }
 
 
-IStringVal& CLocalWorkUnit::getClusterName(IStringVal &str) const
+const char *CLocalWorkUnit::queryClusterName() const
 {
 {
     CriticalBlock block(crit);
     CriticalBlock block(crit);
-    str.set(p->queryProp("@clusterName"));
-    return str;
+    const char *ret = p->queryProp("@clusterName");
+    if (!ret)
+        ret = "";
+    return ret;
 }
 }
 
 
 void CLocalWorkUnit::setAllowedClusters(const char *value)
 void CLocalWorkUnit::setAllowedClusters(const char *value)
@@ -4188,16 +4180,10 @@ void CLocalWorkUnit::remoteCheckAccess(IUserDescriptor *user, bool writeaccess)
                 perm = 0;
                 perm = 0;
         }
         }
     }
     }
-    if (!HASREADPERMISSION(perm)) {
-        SCMStringBuffer wuid;
-        getWuid(wuid);
-        throw MakeStringException(WUERR_WorkunitAccessDenied, "Read access denied for workunit %s",wuid.s.str());
-    }
-    if (writeaccess&&!HASWRITEPERMISSION(perm)) {
-        SCMStringBuffer wuid;
-        getWuid(wuid);
-        throw MakeStringException(WUERR_WorkunitAccessDenied, "Write access denied for workunit %s",wuid.s.str());
-    }
+    if (!HASREADPERMISSION(perm))
+        throw MakeStringException(WUERR_WorkunitAccessDenied, "Read access denied for workunit %s", queryWuid());
+    if (writeaccess && !HASWRITEPERMISSION(perm))
+        throw MakeStringException(WUERR_WorkunitAccessDenied, "Write access denied for workunit %s", queryWuid());
 }
 }
 
 
 
 
@@ -4207,11 +4193,13 @@ void CLocalWorkUnit::setUser(const char * value)
     p->setProp("@submitID", value); 
     p->setProp("@submitID", value); 
 }
 }
 
 
-IStringVal& CLocalWorkUnit::getUser(IStringVal &str) const 
+const char *CLocalWorkUnit::queryUser() const
 {
 {
     CriticalBlock block(crit);
     CriticalBlock block(crit);
-    str.set(p->queryProp("@submitID"));
-    return str;
+    const char *ret = p->queryProp("@submitID");
+    if (!ret)
+        ret = "";
+    return ret;
 }
 }
 
 
 void CLocalWorkUnit::setWuScope(const char * value) 
 void CLocalWorkUnit::setWuScope(const char * value) 
@@ -4444,19 +4432,18 @@ unsigned CLocalWorkUnit::getAgentPID() const
     return p->getPropInt("@agentPID", -1);
     return p->getPropInt("@agentPID", -1);
 }
 }
 
 
-IStringVal& CLocalWorkUnit::getStateDesc(IStringVal &str) const 
+const char * CLocalWorkUnit::queryStateDesc() const
 {
 {
     // MORE - not sure about this - may prefer a separate interface
     // MORE - not sure about this - may prefer a separate interface
     CriticalBlock block(crit);
     CriticalBlock block(crit);
     try
     try
     {
     {
-        str.set(getEnumText(getState(), states));
+        return getEnumText(getState(), states);
     }
     }
     catch (...)
     catch (...)
     {
     {
-        str.set("???");
+        return "???";
     }
     }
-    return str;
 }
 }
 
 
 mapEnums actions[] = {
 mapEnums actions[] = {
@@ -5250,9 +5237,7 @@ IUserDescriptor *CLocalWorkUnit::queryUserDescriptor() const
     {
     {
         SCMStringBuffer token, user, password;
         SCMStringBuffer token, user, password;
         getSecurityToken(token);
         getSecurityToken(token);
-        SCMStringBuffer wuid;
-        getWuid(wuid);
-        extractToken(token.str(), wuid.str(), user, password);
+        extractToken(token.str(), queryWuid(), user, password);
         userDesc.setown(createUserDescriptor());
         userDesc.setown(createUserDescriptor());
         userDesc->set(user.str(), password.str());
         userDesc->set(user.str(), password.str());
     }
     }
@@ -5987,10 +5972,7 @@ IConstWUStatistic * CLocalWorkUnit::getStatistic(const char * creator, const cha
 bool CLocalWorkUnit::getWuDate(unsigned & year, unsigned & month, unsigned& day)
 bool CLocalWorkUnit::getWuDate(unsigned & year, unsigned & month, unsigned& day)
 {
 {
     CriticalBlock block(crit);
     CriticalBlock block(crit);
-    SCMStringBuffer wuidstr;
-    const char *wuid = getWuid(wuidstr).str();
-
-    if (sscanf(wuid, "W%4u%2u%2u", &year, &month, &day)==3)
+    if (sscanf(queryWuid(), "W%4u%2u%2u", &year, &month, &day)==3)
     {
     {
     }
     }
     
     
@@ -6758,9 +6740,6 @@ mapEnums graphTypes[] = {
 
 
 CLocalWUGraph::CLocalWUGraph(const CLocalWorkUnit &_owner, IPropertyTree *props) : p(props), owner(_owner)
 CLocalWUGraph::CLocalWUGraph(const CLocalWorkUnit &_owner, IPropertyTree *props) : p(props), owner(_owner)
 {
 {
-    SCMStringBuffer str;
-    owner.getWuid(str);
-    wuid.set(str.s.str());
     wuidVersion = owner.getWuidVersion();
     wuidVersion = owner.getWuidVersion();
 }
 }
 
 
@@ -7138,7 +7117,7 @@ void CLocalWUGraph::setName(const char *str)
 {
 {
     p->setProp("@name", str);
     p->setProp("@name", str);
     progress.clear();
     progress.clear();
-    progress.setown(new CConstGraphProgress(wuid, str));
+    progress.setown(new CConstGraphProgress(owner.queryWuid(), str));
 }
 }
 
 
 void CLocalWUGraph::setLabel(const char *str)
 void CLocalWUGraph::setLabel(const char *str)
@@ -7270,7 +7249,7 @@ IPropertyTree * CLocalWUGraph::getXGMMLTree(bool doMergeProgress) const
         Owned<IConstWUGraphProgress> _progress;
         Owned<IConstWUGraphProgress> _progress;
         if (progress) _progress.set(progress);
         if (progress) _progress.set(progress);
         else
         else
-            _progress.setown(new CConstGraphProgress(wuid, p->queryProp("@name")));
+            _progress.setown(new CConstGraphProgress(owner.queryWuid(), p->queryProp("@name")));
 
 
         //MORE: Eventually this should directly access the new stats structure
         //MORE: Eventually this should directly access the new stats structure
         unsigned progressV = _progress->queryFormatVersion();
         unsigned progressV = _progress->queryFormatVersion();
@@ -9047,8 +9026,7 @@ extern WORKUNIT_API void submitWorkUnit(const char *wuid, const char *username,
     SCMStringBuffer token;
     SCMStringBuffer token;
     createToken(wuid, username, password, token);
     createToken(wuid, username, password, token);
     workunit->setSecurityToken(token.str());
     workunit->setSecurityToken(token.str());
-    SCMStringBuffer clusterName;
-    workunit->getClusterName(clusterName);
+    StringAttr clusterName(workunit->queryClusterName());
     if (!clusterName.length()) 
     if (!clusterName.length()) 
         throw MakeStringException(WUERR_InvalidCluster, "No target cluster specified");
         throw MakeStringException(WUERR_InvalidCluster, "No target cluster specified");
     workunit->commit();
     workunit->commit();
@@ -9226,15 +9204,13 @@ void CLocalWorkUnit::schedule()
     }
     }
 
 
     StringBuffer rootPath;
     StringBuffer rootPath;
-    SCMStringBuffer clusterName;
-    getClusterName(clusterName);
-    rootPath.append("/Schedule/").append(clusterName.str());
+    rootPath.append("/Schedule/").append(queryClusterName());
     Owned<IRemoteConnection> conn = querySDS().connect(rootPath.str(), myProcessSession(), RTM_LOCK_WRITE | RTM_CREATE_QUERY, SDS_LOCK_TIMEOUT);
     Owned<IRemoteConnection> conn = querySDS().connect(rootPath.str(), myProcessSession(), RTM_LOCK_WRITE | RTM_CREATE_QUERY, SDS_LOCK_TIMEOUT);
     Owned<IPropertyTree> root = conn->getRoot();
     Owned<IPropertyTree> root = conn->getRoot();
     if(!root->hasChildren())
     if(!root->hasChildren())
     {
     {
         StringBuffer addPath;
         StringBuffer addPath;
-        addPath.append("/Schedulers/").append(clusterName.str());
+        addPath.append("/Schedulers/").append(queryClusterName());
         Owned<IRemoteConnection> addConn = querySDS().connect(addPath.str(), myProcessSession(), RTM_LOCK_WRITE | RTM_CREATE_QUERY, SDS_LOCK_TIMEOUT);
         Owned<IRemoteConnection> addConn = querySDS().connect(addPath.str(), myProcessSession(), RTM_LOCK_WRITE | RTM_CREATE_QUERY, SDS_LOCK_TIMEOUT);
     }
     }
 
 
@@ -10473,9 +10449,6 @@ void addQueryToQuerySet(IWorkUnit *workunit, IPropertyTree *queryRegistry, const
     if (!dllName.length())
     if (!dllName.length())
         throw MakeStringException(WUERR_InvalidDll, "Cannot deploy query - no associated dll.");
         throw MakeStringException(WUERR_InvalidDll, "Cannot deploy query - no associated dll.");
 
 
-    SCMStringBuffer wuid;
-    workunit->getWuid(wuid);
-
     StringBuffer currentTargetClusterType;
     StringBuffer currentTargetClusterType;
     queryRegistry->getProp("@targetclustertype", currentTargetClusterType); 
     queryRegistry->getProp("@targetclustertype", currentTargetClusterType); 
 
 
@@ -10497,7 +10470,7 @@ void addQueryToQuerySet(IWorkUnit *workunit, IPropertyTree *queryRegistry, const
         }
         }
     }
     }
 
 
-    IPropertyTree *newEntry = addNamedQuery(queryRegistry, cleanQueryName, wuid.str(), dllName.str(), isLibrary(workunit), userid, snapshot.str());
+    IPropertyTree *newEntry = addNamedQuery(queryRegistry, cleanQueryName, workunit->queryWuid(), dllName.str(), isLibrary(workunit), userid, snapshot.str());
     Owned<IConstWULibraryIterator> libraries = &workunit->getLibraries();
     Owned<IConstWULibraryIterator> libraries = &workunit->getLibraries();
     checkAddLibrariesToQueryEntry(newEntry, libraries);
     checkAddLibrariesToQueryEntry(newEntry, libraries);
     newQueryId.append(newEntry->queryProp("@id"));
     newQueryId.append(newEntry->queryProp("@id"));

+ 15 - 10
common/workunit/workunit.hpp

@@ -974,9 +974,22 @@ interface IStringIterator : extends IScmIterator
     virtual IStringVal & str(IStringVal & str) = 0;
     virtual IStringVal & str(IStringVal & str) = 0;
 };
 };
 
 
-interface IConstWorkUnit : extends IInterface
+interface IConstWorkUnitInfo : extends IInterface
 {
 {
+    virtual const char *queryWuid() const = 0;
+    virtual const char *queryUser() const = 0;
+    virtual const char *queryJobName() const = 0;
+    virtual const char *queryClusterName() const = 0;
+    virtual WUState getState() const = 0;
+    virtual const char *queryStateDesc() const = 0;
+    virtual bool isProtected() const = 0;
+// Not sure about these ones...
     virtual bool aborting() const = 0;
     virtual bool aborting() const = 0;
+    virtual IJlibDateTime & getTimeScheduled(IJlibDateTime & val) const = 0;
+};
+
+interface IConstWorkUnit : extends IConstWorkUnitInfo
+{
     virtual void forceReload() = 0;
     virtual void forceReload() = 0;
     virtual WUAction getAction() const = 0;
     virtual WUAction getAction() const = 0;
     virtual IStringVal& getActionEx(IStringVal & str) const = 0;
     virtual IStringVal& getActionEx(IStringVal & str) const = 0;
@@ -991,7 +1004,6 @@ interface IConstWorkUnit : extends IInterface
     virtual IConstLocalFileUploadIterator * getLocalFileUploads() const = 0;
     virtual IConstLocalFileUploadIterator * getLocalFileUploads() const = 0;
     virtual bool requiresLocalFileUpload() const = 0;
     virtual bool requiresLocalFileUpload() const = 0;
     virtual bool getIsQueryService() const = 0;
     virtual bool getIsQueryService() const = 0;
-    virtual IStringVal & getClusterName(IStringVal & str) const = 0;
     virtual bool hasDebugValue(const char * propname) const = 0;
     virtual bool hasDebugValue(const char * propname) const = 0;
     virtual IStringVal & getDebugValue(const char * propname, IStringVal & str) const = 0;
     virtual IStringVal & getDebugValue(const char * propname, IStringVal & str) const = 0;
     virtual int getDebugValueInt(const char * propname, int defVal) const = 0;
     virtual int getDebugValueInt(const char * propname, int defVal) const = 0;
@@ -1006,7 +1018,6 @@ interface IConstWorkUnit : extends IInterface
     virtual IConstWUGraphIterator & getGraphs(WUGraphType type) const = 0;
     virtual IConstWUGraphIterator & getGraphs(WUGraphType type) const = 0;
     virtual IConstWUGraph * getGraph(const char * name) const = 0;
     virtual IConstWUGraph * getGraph(const char * name) const = 0;
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const = 0;
     virtual IConstWUGraphProgress * getGraphProgress(const char * name) const = 0;
-    virtual IStringVal & getJobName(IStringVal & str) const = 0;
     virtual IConstWUPlugin * getPluginByName(const char * name) const = 0;
     virtual IConstWUPlugin * getPluginByName(const char * name) const = 0;
     virtual IConstWUPluginIterator & getPlugins() const = 0;
     virtual IConstWUPluginIterator & getPlugins() const = 0;
     virtual IConstWULibraryIterator & getLibraries() const = 0;
     virtual IConstWULibraryIterator & getLibraries() const = 0;
@@ -1020,11 +1031,9 @@ interface IConstWorkUnit : extends IInterface
     virtual IConstWUResultIterator & getResults() const = 0;
     virtual IConstWUResultIterator & getResults() const = 0;
     virtual IStringVal & getScope(IStringVal & str) const = 0;
     virtual IStringVal & getScope(IStringVal & str) const = 0;
     virtual IStringVal & getSecurityToken(IStringVal & str) const = 0;
     virtual IStringVal & getSecurityToken(IStringVal & str) const = 0;
-    virtual WUState getState() const = 0;
     virtual IStringVal & getStateEx(IStringVal & str) const = 0;
     virtual IStringVal & getStateEx(IStringVal & str) const = 0;
     virtual __int64 getAgentSession() const = 0;
     virtual __int64 getAgentSession() const = 0;
     virtual unsigned getAgentPID() const = 0;
     virtual unsigned getAgentPID() const = 0;
-    virtual IStringVal & getStateDesc(IStringVal & str) const = 0;
     virtual IConstWUResult * getTemporaryByName(const char * name) const = 0;
     virtual IConstWUResult * getTemporaryByName(const char * name) const = 0;
     virtual IConstWUResultIterator & getTemporaries() const = 0;
     virtual IConstWUResultIterator & getTemporaries() const = 0;
     virtual bool getRunningGraph(IStringVal & graphName, WUGraphIDType & subId) const = 0;
     virtual bool getRunningGraph(IStringVal & graphName, WUGraphIDType & subId) const = 0;
@@ -1032,12 +1041,9 @@ interface IConstWorkUnit : extends IInterface
     virtual IConstWURoxieQueryInfo * getRoxieQueryInfo() const = 0;
     virtual IConstWURoxieQueryInfo * getRoxieQueryInfo() const = 0;
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const = 0; // filter must currently stay alive while the iterator does.
     virtual IConstWUStatisticIterator & getStatistics(const IStatisticsFilter * filter) const = 0; // filter must currently stay alive while the iterator does.
     virtual IConstWUStatistic * getStatistic(const char * creator, const char * scope, StatisticKind kind) const = 0;
     virtual IConstWUStatistic * getStatistic(const char * creator, const char * scope, StatisticKind kind) const = 0;
-    virtual IStringVal & getUser(IStringVal & str) const = 0;
     virtual IStringVal & getWuScope(IStringVal & str) const = 0;
     virtual IStringVal & getWuScope(IStringVal & str) const = 0;
     virtual IConstWUResult * getVariableByName(const char * name) const = 0;
     virtual IConstWUResult * getVariableByName(const char * name) const = 0;
     virtual IConstWUResultIterator & getVariables() const = 0;
     virtual IConstWUResultIterator & getVariables() const = 0;
-    virtual IStringVal & getWuid(IStringVal & str) const = 0;
-    virtual bool isProtected() const = 0;
     virtual bool isPausing() const = 0;
     virtual bool isPausing() const = 0;
     virtual IWorkUnit & lock() = 0;
     virtual IWorkUnit & lock() = 0;
     virtual void requestAbort() = 0;
     virtual void requestAbort() = 0;
@@ -1052,7 +1058,6 @@ interface IConstWorkUnit : extends IInterface
     virtual bool getCloneable() const = 0;
     virtual bool getCloneable() const = 0;
     virtual IUserDescriptor * queryUserDescriptor() const = 0;
     virtual IUserDescriptor * queryUserDescriptor() const = 0;
     virtual IStringVal & getSnapshot(IStringVal & str) const = 0;
     virtual IStringVal & getSnapshot(IStringVal & str) const = 0;
-    virtual IJlibDateTime & getTimeScheduled(IJlibDateTime & val) const = 0;
     virtual IPropertyTreeIterator & getFilesReadIterator() const = 0;
     virtual IPropertyTreeIterator & getFilesReadIterator() const = 0;
     virtual void protect(bool protectMode) = 0;
     virtual void protect(bool protectMode) = 0;
     virtual IStringVal & getAllowedClusters(IStringVal & str) const = 0;
     virtual IStringVal & getAllowedClusters(IStringVal & str) const = 0;
@@ -1167,7 +1172,7 @@ interface IWorkUnit : extends IConstWorkUnit
 
 
 interface IConstWorkUnitIterator : extends IScmIterator
 interface IConstWorkUnitIterator : extends IScmIterator
 {
 {
-    virtual IConstWorkUnit & query() = 0;
+    virtual IConstWorkUnitInfo & query() = 0;
 };
 };
 
 
 //! IWUTimers
 //! IWUTimers

+ 2 - 3
common/workunit/wujobq.cpp

@@ -1985,10 +1985,9 @@ extern bool WORKUNIT_API runWorkUnit(const char *wuid)
     Owned<IConstWorkUnit> w = factory->openWorkUnit(wuid, false);
     Owned<IConstWorkUnit> w = factory->openWorkUnit(wuid, false);
     if (w)
     if (w)
     {
     {
-        SCMStringBuffer clusterName;
-        w->getClusterName(clusterName);
+        StringAttr clusterName = (w->queryClusterName());
         w.clear();
         w.clear();
-        return runWorkUnit(wuid,clusterName.str());
+        return runWorkUnit(wuid, clusterName.str());
     }
     }
     else
     else
         return false;
         return false;

+ 9 - 13
common/wuwebview/wuwebview.cpp

@@ -76,10 +76,9 @@ public:
 
 
     void appendSingleResult(IConstWorkUnit *wu, const char *resultname, const char *username, const char *pw)
     void appendSingleResult(IConstWorkUnit *wu, const char *resultname, const char *username, const char *pw)
     {
     {
-        SCMStringBuffer wuid;
         StringBufferAdaptor resultXML(buffer);
         StringBufferAdaptor resultXML(buffer);
         Owned<IResultSetFactory> factory = getResultSetFactory(username, pw);
         Owned<IResultSetFactory> factory = getResultSetFactory(username, pw);
-        Owned<INewResultSet> nr = factory->createNewResultSet(wu->getWuid(wuid).str(), 0, resultname);
+        Owned<INewResultSet> nr = factory->createNewResultSet(wu->queryWuid(), 0, resultname);
         getResultXml(resultXML, nr.get(), resultname, 0, 0, NULL);
         getResultXml(resultXML, nr.get(), resultname, 0, 0, NULL);
     }
     }
 
 
@@ -323,7 +322,7 @@ public:
 
 
 protected:
 protected:
     SCMStringBuffer dllname;
     SCMStringBuffer dllname;
-    SCMStringBuffer name;
+    StringBuffer name;
     StringBuffer manifestDir;
     StringBuffer manifestDir;
     Owned<IConstWorkUnit> cw;
     Owned<IConstWorkUnit> cw;
     Owned<ILoadedDllEntry> dll;
     Owned<ILoadedDllEntry> dll;
@@ -477,14 +476,13 @@ unsigned WuWebView::getResourceURLCount()
 
 
 void WuWebView::getResourceURLs(StringArray &urls, const char *prefix)
 void WuWebView::getResourceURLs(StringArray &urls, const char *prefix)
 {
 {
-    SCMStringBuffer wuid;
-    cw->getWuid(wuid);
+    const char *wuid = cw->queryWuid();
     StringBuffer url(prefix);
     StringBuffer url(prefix);
     url.append("manifest/");
     url.append("manifest/");
     if (target.length() && name.length())
     if (target.length() && name.length())
         url.appendf("query/%s/%s", target.get(), name.str());
         url.appendf("query/%s/%s", target.get(), name.str());
     else
     else
-        url.append(wuid.str());
+        url.append(wuid);
     urls.append(url);
     urls.append(url);
 
 
     Owned<IPropertyTreeIterator> iter = ensureManifest()->getElements("Resource");
     Owned<IPropertyTreeIterator> iter = ensureManifest()->getElements("Resource");
@@ -495,7 +493,7 @@ void WuWebView::getResourceURLs(StringArray &urls, const char *prefix)
         if (target.length() && name.length())
         if (target.length() && name.length())
             url.appendf("query/%s/%s", target.get(), name.str());
             url.appendf("query/%s/%s", target.get(), name.str());
         else
         else
-            url.append(wuid.str());
+            url.append(wuid);
         if (res.hasProp("@ResourcePath"))
         if (res.hasProp("@ResourcePath"))
             urls.append(url.append(res.queryProp("@ResourcePath")));
             urls.append(url.append(res.queryProp("@ResourcePath")));
         else if (res.hasProp("@filename"))
         else if (res.hasProp("@filename"))
@@ -714,8 +712,7 @@ void WuWebView::createWuidResponse(StringBuffer &out, unsigned flags)
     flags |= WWV_OMIT_RESULT_TAG;
     flags |= WWV_OMIT_RESULT_TAG;
 
 
     WuExpandedResultBuffer expander(name.str(), flags);
     WuExpandedResultBuffer expander(name.str(), flags);
-    SCMStringBuffer wuid;
-    appendXMLTag(expander.buffer, "Wuid", cw->getWuid(wuid).str());
+    appendXMLTag(expander.buffer, "Wuid", cw->queryWuid());
     expander.finalize();
     expander.finalize();
     out.append(expander.buffer);
     out.append(expander.buffer);
 }
 }
@@ -772,8 +769,8 @@ void WuWebView::setWorkunit(IConstWorkUnit &_cw)
     cw.set(&_cw);
     cw.set(&_cw);
     if (!name.length())
     if (!name.length())
     {
     {
-        cw->getJobName(name);
-        name.s.replace(' ','_');
+        name.set(cw->queryJobName());
+        name.replace(' ','_');
     }
     }
     Owned<IConstWUQuery> q = cw->getQuery();
     Owned<IConstWUQuery> q = cw->getQuery();
     if (q)
     if (q)
@@ -898,8 +895,7 @@ extern WUWEBVIEW_API IWuWebView *createWuWebView(IConstWorkUnit &wu, const char
     }
     }
     catch (...)
     catch (...)
     {
     {
-        SCMStringBuffer wuid;
-        DBGLOG("ERROR loading workunit %s shared object.", wu.getWuid(wuid).str());
+        DBGLOG("ERROR loading workunit %s shared object.", wu.queryWuid());
     }
     }
     return NULL;
     return NULL;
 }
 }

+ 5 - 7
dali/daliadmin/daliadmin.cpp

@@ -2514,7 +2514,8 @@ static void wuidCompress(const char *match, const char *type, bool compress)
     Owned<IConstWorkUnitIterator> iter = factory->getWorkUnitsByXPath(match);
     Owned<IConstWorkUnitIterator> iter = factory->getWorkUnitsByXPath(match);
     ForEach(*iter)
     ForEach(*iter)
     {
     {
-        IConstWorkUnit &wuid = iter->query();
+        IConstWorkUnitInfo &wuidInfo = iter->query();
+        IConstWorkUnit &wuid = *factory->openWorkUnit(wuidInfo.queryWuid(), false);
 
 
         StringArray graphNames;
         StringArray graphNames;
         Owned<IConstWUGraphIterator> graphIter = &wuid.getGraphs(GraphTypeAny);
         Owned<IConstWUGraphIterator> graphIter = &wuid.getGraphs(GraphTypeAny);
@@ -2532,16 +2533,13 @@ static void wuidCompress(const char *match, const char *type, bool compress)
 
 
         if (graphNames.ordinality())
         if (graphNames.ordinality())
         {
         {
-            SCMStringBuffer wuidName;
-            wuid.getWuid(wuidName);
-            StringAttr msg;
-            msg.set(compress?"Compressing":"Uncompressing");
-            PROGLOG("%s graphs for workunit: %s", msg.get(), wuidName.s.str());
+            const char *msg = compress ? "Compressing" : "Uncompressing";
+            PROGLOG("%s graphs for workunit: %s", msg, wuidInfo.queryWuid());
             Owned<IWorkUnit> wWuid = &wuid.lock();
             Owned<IWorkUnit> wWuid = &wuid.lock();
             ForEachItemIn(n, graphNames)
             ForEachItemIn(n, graphNames)
             {
             {
                 Owned<IWUGraph> wGraph = wWuid->updateGraph(graphNames.item(n));
                 Owned<IWUGraph> wGraph = wWuid->updateGraph(graphNames.item(n));
-                PROGLOG("%s graph: %s", msg.get(), graphNames.item(n));
+                PROGLOG("%s graph: %s", msg, graphNames.item(n));
                 // get/set - will convert to/from new format (binary compress blob)
                 // get/set - will convert to/from new format (binary compress blob)
                 Owned<IPropertyTree> xgmml = wGraph->getXGMMLTree(false);
                 Owned<IPropertyTree> xgmml = wGraph->getXGMMLTree(false);
                 wGraph->setXGMMLTree(xgmml.getClear(), compress);
                 wGraph->setXGMMLTree(xgmml.getClear(), compress);

+ 13 - 27
ecl/eclagent/eclagent.cpp

@@ -511,11 +511,9 @@ EclAgent::EclAgent(IConstWorkUnit *wu, const char *_wuid, bool _checkVersion, bo
     resolveFilesLocally = false;
     resolveFilesLocally = false;
     writeResultsToStdout = false;
     writeResultsToStdout = false;
 
 
-    wuRead->getUser(StringAttrAdaptor(userid));
+    userid.set(wuRead->queryUser());
     useProductionLibraries = wuRead->getDebugValueBool("useProductionLibraries", false);
     useProductionLibraries = wuRead->getDebugValueBool("useProductionLibraries", false);
-    SCMStringBuffer clusterName;
-    wuRead->getClusterName(clusterName);
-    clusterNames.append(clusterName.str());
+    clusterNames.append(wuRead->queryClusterName());
     clusterWidth = -1;
     clusterWidth = -1;
     abortmonitor = new cAbortMonitor(*this);
     abortmonitor = new cAbortMonitor(*this);
     abortmonitor->start();
     abortmonitor->start();
@@ -549,8 +547,7 @@ EclAgent::EclAgent(IConstWorkUnit *wu, const char *_wuid, bool _checkVersion, bo
             destTree->addPropTree("Graph", graphTree.getClear());
             destTree->addPropTree("Graph", graphTree.getClear());
         }
         }
         debugContext.setown(new CHThorDebugContext(queryDummyContextLogger(), destTree.getClear(), this ));
         debugContext.setown(new CHThorDebugContext(queryDummyContextLogger(), destTree.getClear(), this ));
-        SCMStringBuffer jobName;
-        debugContext->debugInitialize(wuid, wu->getJobName(jobName).str(), true);
+        debugContext->debugInitialize(wuid, wu->queryJobName(), true);
     }
     }
     Owned<IWorkUnit> w = updateWorkUnit();
     Owned<IWorkUnit> w = updateWorkUnit();
     if (_queryXML)
     if (_queryXML)
@@ -1559,15 +1556,14 @@ char *EclAgent::getEnv(const char *name, const char *defaultValue) const
 
 
 void EclAgent::selectCluster(const char *newCluster)
 void EclAgent::selectCluster(const char *newCluster)
 {
 {
-    SCMStringBuffer oldCluster;
-    queryWorkUnit()->getClusterName(oldCluster);
+    const char *oldCluster = queryWorkUnit()->queryClusterName();
     if (getClusterType(clusterType)==HThorCluster)
     if (getClusterType(clusterType)==HThorCluster)
     {
     {
         // If the current cluster is an hthor cluster, it's an error to change it...
         // If the current cluster is an hthor cluster, it's an error to change it...
-        if (!streq(oldCluster.str(), newCluster))
+        if (!streq(oldCluster, newCluster))
             throw MakeStringException(-1, "Error - cannot switch cluster in hthor jobs");
             throw MakeStringException(-1, "Error - cannot switch cluster in hthor jobs");
     }
     }
-    clusterNames.append(oldCluster.str());
+    clusterNames.append(oldCluster);
     WorkunitUpdate wu = updateWorkUnit();
     WorkunitUpdate wu = updateWorkUnit();
     wu->setClusterName(newCluster);
     wu->setClusterName(newCluster);
     clusterWidth = -1;
     clusterWidth = -1;
@@ -1685,8 +1681,7 @@ EclAgentQueryLibrary * EclAgent::loadEclLibrary(const char * libraryName, unsign
 
 
 IConstWorkUnit * EclAgent::resolveLibrary(const char * libraryName, unsigned expectedInterfaceHash)
 IConstWorkUnit * EclAgent::resolveLibrary(const char * libraryName, unsigned expectedInterfaceHash)
 {
 {
-    StringAttr cluster;
-    queryWorkUnit()->getClusterName(StringAttrAdaptor(cluster));
+    StringAttr cluster = queryWorkUnit()->queryClusterName();
     Owned<IPropertyTree> queryRegistry = getQueryRegistry(cluster, false);
     Owned<IPropertyTree> queryRegistry = getQueryRegistry(cluster, false);
     Owned<IPropertyTree> resolved = queryRegistry ? resolveQueryAlias(queryRegistry, libraryName) : NULL;
     Owned<IPropertyTree> resolved = queryRegistry ? resolveQueryAlias(queryRegistry, libraryName) : NULL;
     if (!resolved)
     if (!resolved)
@@ -1945,10 +1940,7 @@ void EclAgent::doProcess()
                 catch(IException * e)
                 catch(IException * e)
                 {
                 {
                     int code = e->errorCode();
                     int code = e->errorCode();
-                    SCMStringBuffer wuid;
-                    queryWorkUnit()->getWuid(wuid);
-                    StringBuffer msg;
-                    msg.append("Failed to deschedule workunit ").append(wuid.str()).append(": ");
+                    VStringBuffer msg("Failed to deschedule workunit %s: ", w->queryWuid());
                     e->errorMessage(msg);
                     e->errorMessage(msg);
                     logException(ExceptionSeverityWarning, code, msg.str(), false);
                     logException(ExceptionSeverityWarning, code, msg.str(), false);
                     e->Release();
                     e->Release();
@@ -2774,23 +2766,17 @@ const char *EclAgent::queryWuid()
 
 
 char * EclAgent::getJobName()
 char * EclAgent::getJobName()
 {
 {
-    SCMStringBuffer out;
-    queryWorkUnit()->getJobName(out);
-    return out.s.detach();
+    return strdup(queryWorkUnit()->queryJobName());
 }
 }
 
 
 char * EclAgent::getJobOwner()
 char * EclAgent::getJobOwner()
 {
 {
-    SCMStringBuffer out;
-    queryWorkUnit()->getUser(out);
-    return out.s.detach();
+    return strdup(queryWorkUnit()->queryUser());
 }
 }
 
 
 char * EclAgent::getClusterName()
 char * EclAgent::getClusterName()
 {
 {
-    SCMStringBuffer out;
-    queryWorkUnit()->getClusterName(out);
-    return out.s.detach();
+    return strdup(queryWorkUnit()->queryClusterName());
 }
 }
 
 
 char * EclAgent::getGroupName()
 char * EclAgent::getGroupName()
@@ -3289,7 +3275,7 @@ extern int HTHOR_API eclagent_main(int argc, const char *argv[], StringBuffer *
         throw MakeStringException(0, "Invalid xml: %s", msg.str());
         throw MakeStringException(0, "Invalid xml: %s", msg.str());
     }
     }
 
 
-    SCMStringBuffer wuid;
+    StringBuffer wuid;
     StringBuffer daliServers;
     StringBuffer daliServers;
     if (!globals->getProp("DALISERVERS", daliServers) && !globals->getProp("-DALISERVERS", daliServers))
     if (!globals->getProp("DALISERVERS", daliServers) && !globals->getProp("-DALISERVERS", daliServers))
         daliServers.append(agentTopology->queryProp("@daliServers"));
         daliServers.append(agentTopology->queryProp("@daliServers"));
@@ -3352,7 +3338,7 @@ extern int HTHOR_API eclagent_main(int argc, const char *argv[], StringBuffer *
                 Owned<IWorkUnit> daliWu = factory->createWorkUnit("eclagent", "eclagent");
                 Owned<IWorkUnit> daliWu = factory->createWorkUnit("eclagent", "eclagent");
                 IExtendedWUInterface * extendedWu = queryExtendedWU(daliWu);
                 IExtendedWUInterface * extendedWu = queryExtendedWU(daliWu);
                 extendedWu->copyWorkUnit(standAloneWorkUnit, true);
                 extendedWu->copyWorkUnit(standAloneWorkUnit, true);
-                daliWu->getWuid(wuid);
+                wuid.set(daliWu->queryWuid());
                 globals->setProp("WUID", wuid.str());
                 globals->setProp("WUID", wuid.str());
 
 
                 standAloneUDesc.setown(createUserDescriptor());
                 standAloneUDesc.setown(createUserDescriptor());

+ 6 - 17
ecl/eclagent/eclgraph.cpp

@@ -1509,13 +1509,9 @@ extern IProbeManager *createDebugManager(IDebuggableContext *debugContext, const
 
 
 void EclAgent::executeThorGraph(const char * graphName)
 void EclAgent::executeThorGraph(const char * graphName)
 {
 {
-    SCMStringBuffer wuid;
-    wuRead->getWuid(wuid);
-
-    SCMStringBuffer cluster;
-    SCMStringBuffer owner;
-    wuRead->getClusterName(cluster);
-    wuRead->getUser(owner);
+    StringAttr wuid(wuRead->queryWuid());
+    StringAttr owner(wuRead->queryUser());
+    StringAttr cluster(wuRead->queryClusterName());
     int priority = wuRead->getPriorityValue();
     int priority = wuRead->getPriorityValue();
     unsigned timelimit = queryWorkUnit()->getDebugValueInt("thorConnectTimeout", config->getPropInt("@thorConnectTimeout", 60));
     unsigned timelimit = queryWorkUnit()->getDebugValueInt("thorConnectTimeout", config->getPropInt("@thorConnectTimeout", 60));
     Owned<IConstWUClusterInfo> c = getTargetClusterInfo(cluster.str());
     Owned<IConstWUClusterInfo> c = getTargetClusterInfo(cluster.str());
@@ -1553,9 +1549,7 @@ void EclAgent::executeThorGraph(const char * graphName)
             CWorkunitResumeHandler(IConstWorkUnit &_wu) : wu(_wu)
             CWorkunitResumeHandler(IConstWorkUnit &_wu) : wu(_wu)
             {
             {
                 xpath.append("/WorkUnits/");
                 xpath.append("/WorkUnits/");
-                SCMStringBuffer istr;
-                wu.getWuid(istr);
-                wuid.set(istr.str());
+                wuid.set(wu.queryWuid());
                 xpath.append(wuid.get()).append("/Action");
                 xpath.append(wuid.get()).append("/Action");
                 subId = 0;
                 subId = 0;
             }
             }
@@ -1581,9 +1575,7 @@ void EclAgent::executeThorGraph(const char * graphName)
                     wu.forceReload();
                     wu.forceReload();
                     if (WUStatePaused != wu.getState() || wu.aborting())
                     if (WUStatePaused != wu.getState() || wu.aborting())
                     {
                     {
-                        SCMStringBuffer str;
-                        wu.getStateDesc(str);
-                        PROGLOG("Aborting pause job %s, state : %s", wuid.get(), str.str());
+                        PROGLOG("Aborting pause job %s, state : %s", wuid.get(), wu.queryStateDesc());
                         ret = false;
                         ret = false;
                         break;
                         break;
                     }
                     }
@@ -1717,10 +1709,7 @@ void EclAgent::executeThorGraph(const char * graphName)
                 if (isException)
                 if (isException)
                 {
                 {
                     Owned<IException> e = deserializeException(reply);
                     Owned<IException> e = deserializeException(reply);
-                    StringBuffer str("Pausing job ");
-                    SCMStringBuffer istr;
-                    queryWorkUnit()->getWuid(istr);
-                    str.append(istr.str()).append(" caused exception");
+                    VStringBuffer str("Pausing job %s caused exception", queryWorkUnit()->queryWuid());
                     EXCLOG(e, str.str());
                     EXCLOG(e, str.str());
                 }
                 }
                 Owned <IWorkUnit> w = updateWorkUnit();
                 Owned <IWorkUnit> w = updateWorkUnit();

+ 9 - 11
ecl/eclccserver/eclccserver.cpp

@@ -395,9 +395,9 @@ class EclccCompileThread : public CInterface, implements IPooledThread, implemen
                     Owned<ILocalWorkUnit> embeddedWU = createLocalWorkUnit(wuXML);
                     Owned<ILocalWorkUnit> embeddedWU = createLocalWorkUnit(wuXML);
                     queryExtendedWU(workunit)->copyWorkUnit(embeddedWU, true);
                     queryExtendedWU(workunit)->copyWorkUnit(embeddedWU, true);
                     workunit->setIsClone(false);
                     workunit->setIsClone(false);
-                    SCMStringBuffer jobname;
-                    if (embeddedWU->getJobName(jobname).length()) //let ECL win naming job during initial compile
-                        workunit->setJobName(jobname.str());
+                    const char *jobname = embeddedWU->queryJobName();
+                    if (jobname && *jobname) //let ECL win naming job during initial compile
+                        workunit->setJobName(jobname);
                     Owned<IWUQuery> query = workunit->updateQuery();
                     Owned<IWUQuery> query = workunit->updateQuery();
                     query->setQueryText(eclQuery.s.str());
                     query->setQueryText(eclQuery.s.str());
                 }
                 }
@@ -467,8 +467,7 @@ public:
         serverstatus.queryProperties()->setProp("WorkUnit",wuid.get());
         serverstatus.queryProperties()->setProp("WorkUnit",wuid.get());
         serverstatus.commitProperties();
         serverstatus.commitProperties();
         workunit->setAgentSession(myProcessSession());
         workunit->setAgentSession(myProcessSession());
-        SCMStringBuffer clusterName;
-        workunit->getClusterName(clusterName);
+        StringAttr clusterName(workunit->queryClusterName());
         Owned<IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(clusterName.str());
         Owned<IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(clusterName.str());
         if (!clusterInfo)
         if (!clusterInfo)
         {
         {
@@ -495,20 +494,19 @@ public:
         if (ok)
         if (ok)
         {
         {
             workunit->setState(WUStateCompiled);
             workunit->setState(WUStateCompiled);
-            SCMStringBuffer newClusterName;
-            workunit->getClusterName(newClusterName);   // Workunit can change the cluster name via #workunit, so reload it
-            if (strcmp(newClusterName.str(), clusterName.str()) != 0)
+            const char *newClusterName = workunit->queryClusterName();   // Workunit can change the cluster name via #workunit, so reload it
+            if (strcmp(newClusterName, clusterName.str()) != 0)
             {
             {
-                clusterInfo.setown(getTargetClusterInfo(clusterName.str()));
+                clusterInfo.setown(getTargetClusterInfo(newClusterName));
                 if (!clusterInfo)
                 if (!clusterInfo)
                 {
                 {
-                    VStringBuffer errStr("Cluster %s by #workunit not recognized", clusterName.str());
+                    VStringBuffer errStr("Cluster %s by #workunit not recognized", newClusterName);
                     failCompilation(errStr);
                     failCompilation(errStr);
                     return;
                     return;
                 }
                 }
                 if (platform != clusterInfo->getPlatform())
                 if (platform != clusterInfo->getPlatform())
                 {
                 {
-                    VStringBuffer errStr("Cluster %s specified by #workunit is wrong type for this queue", clusterName.str());
+                    VStringBuffer errStr("Cluster %s specified by #workunit is wrong type for this queue", newClusterName);
                     failCompilation(errStr);
                     failCompilation(errStr);
                     return;
                     return;
                 }
                 }

+ 1 - 3
ecl/hqlcpp/hqlcpp.cpp

@@ -10014,9 +10014,7 @@ void HqlCppTranslator::doBuildExprIsValid(BuildCtx & ctx, IHqlExpression * expr,
 
 
 IHqlExpression * HqlCppTranslator::getConstWuid(IHqlExpression * expr)
 IHqlExpression * HqlCppTranslator::getConstWuid(IHqlExpression * expr)
 {
 {
-    SCMStringBuffer out;
-    wu()->getWuid(out);
-    OwnedHqlExpr wuid = createConstant(out.str());
+    OwnedHqlExpr wuid = createConstant(wu()->queryWuid());
     return ensureExprType(wuid, expr->queryType());
     return ensureExprType(wuid, expr->queryType());
 }
 }
 
 

+ 1 - 3
ecl/hqlcpp/hqlhtcpp.cpp

@@ -5653,9 +5653,7 @@ bool HqlCppTranslator::prepareToGenerate(HqlQueryContext & query, WorkflowArray
 
 
         if (!isEmbeddedLibrary)
         if (!isEmbeddedLibrary)
         {
         {
-            SCMStringBuffer libraryName;
-            wu()->getJobName(libraryName);
-            wu()->setLibraryInformation(libraryName.str(), outputLibrary->getInterfaceHash(), getLibraryCRC(query.expr));
+            wu()->setLibraryInformation(wu()->queryJobName(), outputLibrary->getInterfaceHash(), getLibraryCRC(query.expr));
         }
         }
     }
     }
     else
     else

+ 7 - 17
ecl/hthor/hthor.cpp

@@ -641,17 +641,14 @@ void CHThorDiskWriteActivity::publish()
     if (grouped)
     if (grouped)
         properties.setPropBool("@grouped", true);
         properties.setPropBool("@grouped", true);
     properties.setPropInt64("@recordCount", numRecords);
     properties.setPropInt64("@recordCount", numRecords);
-    SCMStringBuffer info;
-    properties.setProp("@owner", agent.queryWorkUnit()->getUser(info).str());
-    info.clear();
+    properties.setProp("@owner", agent.queryWorkUnit()->queryUser());
     if (helper.getFlags() & (TDWowned|TDXjobtemp|TDXtemporary))
     if (helper.getFlags() & (TDWowned|TDXjobtemp|TDXtemporary))
         properties.setPropBool("@owned", true);
         properties.setPropBool("@owned", true);
     if (helper.getFlags() & TDWresult)
     if (helper.getFlags() & TDWresult)
         properties.setPropBool("@result", true);
         properties.setPropBool("@result", true);
 
 
-    properties.setProp("@workunit", agent.queryWorkUnit()->getWuid(info).str());
-    info.clear();
-    properties.setProp("@job", agent.queryWorkUnit()->getJobName(info).str());
+    properties.setProp("@workunit", agent.queryWorkUnit()->queryWuid());
+    properties.setProp("@job", agent.queryWorkUnit()->queryJobName());
     setFormat(desc);
     setFormat(desc);
 
 
     if (helper.getFlags() & TDWexpires)
     if (helper.getFlags() & TDWexpires)
@@ -692,11 +689,7 @@ void CHThorDiskWriteActivity::updateWorkUnitResult(unsigned __int64 reccount)
         if (clusterHandler)
         if (clusterHandler)
             clusterHandler->getClusters(clusters);
             clusterHandler->getClusters(clusters);
         else
         else
-        {
-            SCMStringBuffer tgtCluster;
-            wu->getClusterName(tgtCluster);
-            clusters.append(tgtCluster.str());
-        }
+            clusters.append(wu->queryClusterName());
         unsigned flags = helper.getFlags();
         unsigned flags = helper.getFlags();
         if (!agent.queryResolveFilesLocally())
         if (!agent.queryResolveFilesLocally())
         {
         {
@@ -1178,12 +1171,9 @@ void CHThorIndexWriteActivity::execute()
     properties.setProp("@kind", "key");
     properties.setProp("@kind", "key");
     properties.setPropInt64("@size", indexFileSize);
     properties.setPropInt64("@size", indexFileSize);
     properties.setPropInt64("@recordCount", reccount);
     properties.setPropInt64("@recordCount", reccount);
-    SCMStringBuffer info;
-    properties.setProp("@owner", agent.queryWorkUnit()->getUser(info).str());
-    info.clear();
-    properties.setProp("@workunit", agent.queryWorkUnit()->getWuid(info).str());
-    info.clear();
-    properties.setProp("@job", agent.queryWorkUnit()->getJobName(info).str());
+    properties.setProp("@owner", agent.queryWorkUnit()->queryUser());
+    properties.setProp("@workunit", agent.queryWorkUnit()->queryWuid());
+    properties.setProp("@job", agent.queryWorkUnit()->queryJobName());
 #if 0
 #if 0
     IRecordSize * irecsize = helper.queryDiskRecordSize();
     IRecordSize * irecsize = helper.queryDiskRecordSize();
     if(irecsize && (irecsize->isFixedSize()))
     if(irecsize && (irecsize->isFixedSize()))

+ 14 - 30
ecl/wutest/wutest.cpp

@@ -47,11 +47,7 @@ bool dump(IConstWorkUnit &w, IProperties *globals)
     const char *action = globals->queryProp("#action");
     const char *action = globals->queryProp("#action");
     if (!action || stricmp(action, "list")==0)
     if (!action || stricmp(action, "list")==0)
     {
     {
-        SCMStringBuffer wuid, jobname, state;
-        w.getWuid(wuid);
-        w.getStateDesc(state);
-        w.getJobName(jobname);
-        printf("%-30s %-20s %-10s\n", wuid.str(), jobname.str(), state.str());
+        printf("%-30s %-20s %-10s\n", w.queryWuid(), w.queryJobName(), w.queryStateDesc());
     }
     }
     else if (stricmp(action, "results")==0)
     else if (stricmp(action, "results")==0)
     {
     {
@@ -87,11 +83,7 @@ bool dump(IConstWorkUnit &w, IProperties *globals)
     else if (stricmp(action, "delete")==0)
     else if (stricmp(action, "delete")==0)
     {
     {
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
-        SCMStringBuffer wuid, jobname;
-        {
-            MTIME_SECTION(queryActiveTimer(), "getWUID");
-            w.getWuid(wuid);
-        }
+        StringAttr wuid(w.queryWuid());
         {
         {
             MTIME_SECTION(queryActiveTimer(), "deleteWorkunit");
             MTIME_SECTION(queryActiveTimer(), "deleteWorkunit");
             factory->deleteWorkUnit(wuid.str());
             factory->deleteWorkUnit(wuid.str());
@@ -105,9 +97,8 @@ bool dump(IConstWorkUnit &w, IProperties *globals)
         globals->getProp("TO", to);
         globals->getProp("TO", to);
         if (to.length()==0)
         if (to.length()==0)
             to.append('.');
             to.append('.');
-        SCMStringBuffer wuid;
-        w.getWuid(wuid);
-        if (QUERYINTERFACE(&w, IExtendedWUInterface)->archiveWorkUnit(to.str(),globals->getPropBool("DEL",false),true,!globals->getPropBool("KEEPFILERESULTS", false)))
+        StringAttr wuid(w.queryWuid());
+        if (QUERYINTERFACE(&w, IExtendedWUInterface)->archiveWorkUnit(to.str(), globals->getPropBool("DEL", false), true, !globals->getPropBool("KEEPFILERESULTS", false)))
             printf("archived %s\n", wuid.str());
             printf("archived %s\n", wuid.str());
         else
         else
             printf("archive of %s failed\n", wuid.str());
             printf("archive of %s failed\n", wuid.str());
@@ -115,8 +106,7 @@ bool dump(IConstWorkUnit &w, IProperties *globals)
     else if ((stricmp(action, "pack")==0)||(stricmp(action, "unpack")==0))
     else if ((stricmp(action, "pack")==0)||(stricmp(action, "unpack")==0))
     {
     {
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
-        SCMStringBuffer wuid;
-        w.getWuid(wuid);
+        StringAttr wuid(w.queryWuid());
         bool pack = (stricmp(action, "pack")==0);
         bool pack = (stricmp(action, "pack")==0);
         QUERYINTERFACE(&w, IExtendedWUInterface)->packWorkUnit(pack);
         QUERYINTERFACE(&w, IExtendedWUInterface)->packWorkUnit(pack);
         if (pack)
         if (pack)
@@ -148,12 +138,8 @@ void testPagedWuList(IWorkUnitFactory *factory)
         Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsSorted(sortorder, NULL, NULL, page*10, 10, "nigel", &cachehint, NULL);
         Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsSorted(sortorder, NULL, NULL, page*10, 10, "nigel", &cachehint, NULL);
         ForEach(*it) {
         ForEach(*it) {
             n++;
             n++;
-            IConstWorkUnit& wu = it->query();
-            SCMStringBuffer wuid;
-            wu.getWuid(wuid);
-            SCMStringBuffer user;
-            wu.getUser(user);
-            printf("%d: %s, %s, %d\n",n,wuid.str(),user.str(),(int)wu.getState());
+            IConstWorkUnitInfo& wu = it->query();
+            printf("%d: %s, %s, %d\n", n, wu.queryWuid(), wu.queryUser(), (int)wu.getState());
         }
         }
     }
     }
 }
 }
@@ -212,12 +198,10 @@ int main(int argc, const char *argv[])
                     Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsByOwner(globals->queryProp("OWNER"));
                     Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsByOwner(globals->queryProp("OWNER"));
                     ForEach(*it)
                     ForEach(*it)
                     {
                     {
-                        IConstWorkUnit& w = it->query();
+                        IConstWorkUnitInfo& w = it->query();
                         if (!w.isProtected() || globals->getPropBool("protected", false))
                         if (!w.isProtected() || globals->getPropBool("protected", false))
                         {
                         {
-                            SCMStringBuffer wuidstr;
-                            w.getWuid(wuidstr);
-                            const char *wuid = wuidstr.str();
+                            const char *wuid = w.queryWuid();
                             unsigned year,month,day,hour,min,sec;
                             unsigned year,month,day,hour,min,sec;
                             if (sscanf(wuid, "W%4u%2u%2u-%2u%2u%2u", &year, &month, &day, &hour, &min, &sec)==6)
                             if (sscanf(wuid, "W%4u%2u%2u-%2u%2u%2u", &year, &month, &day, &hour, &min, &sec)==6)
                             {
                             {
@@ -229,9 +213,9 @@ int main(int argc, const char *argv[])
                                     printf("Aged workunit %s\n", wuid);
                                     printf("Aged workunit %s\n", wuid);
                                     if (globals->getPropInt("remove", 0))
                                     if (globals->getPropInt("remove", 0))
                                     {
                                     {
-                                        Owned<IWorkUnit> lw = &w.lock();
+                                        Owned<IWorkUnit> lw = factory->updateWorkUnit(wuid);
                                         lw->protect(false);
                                         lw->protect(false);
-                                        lw->setState(WUStateArchived);  // we are killing anyway so it's irrelevent, but this will allow us to be sure we can kill it...
+                                        lw->setState(WUStateArchived);  // we are killing anyway so it's irrelevant, but this will allow us to be sure we can kill it...
                                         lw.clear();
                                         lw.clear();
                                         killWuids.append(wuid);
                                         killWuids.append(wuid);
                                     }
                                     }
@@ -343,11 +327,11 @@ int main(int argc, const char *argv[])
         else 
         else 
         {
         {
             Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsByOwner(globals->queryProp("OWNER"));
             Owned<IConstWorkUnitIterator> it = factory->getWorkUnitsByOwner(globals->queryProp("OWNER"));
-            
             ForEach(*it)
             ForEach(*it)
             {
             {
-                IConstWorkUnit& w = it->query();
-                if (!dump(w, globals))
+                IConstWorkUnitInfo& wi = it->query();
+                Owned<IConstWorkUnit> w = factory->openWorkUnit(wi.queryWuid(), false);
+                if (!dump(*w, globals))
                     break;
                     break;
             }
             }
             
             

+ 2 - 4
esp/services/ecldirect/EclDirectService.cpp

@@ -196,9 +196,8 @@ bool CEclDirectEx::onRunEcl(IEspContext &context, IEspRunEclRequest & req, IEspR
         workunit->setSnapshot(snapshot);
         workunit->setSnapshot(snapshot);
 
 
     // Execute it
     // Execute it
-    SCMStringBuffer wuid;
+    StringAttr wuid(workunit->queryWuid());  // NB queryWuid() not valid after workunit,clear()
     
     
-    workunit->getWuid(wuid);
     workunit->setAction(WUActionRun);
     workunit->setAction(WUActionRun);
     workunit->setState(WUStateSubmitted);
     workunit->setState(WUStateSubmitted);
     workunit.clear();
     workunit.clear();
@@ -281,8 +280,7 @@ bool CEclDirectEx::onRunEclEx(IEspContext &context, IEspRunEclExRequest & req, I
         workunit->setResultLimit(req.getResultLimit());
         workunit->setResultLimit(req.getResultLimit());
 
 
     // Execute it
     // Execute it
-    SCMStringBuffer wuid;
-    workunit->getWuid(wuid);
+    StringAttr wuid(workunit->queryWuid());  // NB queryWuid() not valid after workunit,clear()
     workunit->setAction(WUActionRun);
     workunit->setAction(WUActionRun);
     workunit->setState(WUStateSubmitted);
     workunit->setState(WUStateSubmitted);
     workunit.clear();
     workunit.clear();

+ 5 - 11
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1522,7 +1522,7 @@ bool CWsDfuEx::checkFileContent(IEspContext &context, IUserDescriptor* udesc, co
 
 
     if (!cluster || !stricmp(cluster, ""))
     if (!cluster || !stricmp(cluster, ""))
     {
     {
-        char *eclCluster = NULL;
+        StringAttr eclCluster;
         const char* wuid = df->queryAttributes().queryProp("@workunit");
         const char* wuid = df->queryAttributes().queryProp("@workunit");
         if (wuid && *wuid)
         if (wuid && *wuid)
         {
         {
@@ -1533,10 +1533,7 @@ bool CWsDfuEx::checkFileContent(IEspContext &context, IUserDescriptor* udesc, co
                 {
                 {
                     IConstWorkUnit* wu = factory->openWorkUnit(wuid, false);
                     IConstWorkUnit* wu = factory->openWorkUnit(wuid, false);
                     if (wu)
                     if (wu)
-                    {   
-                        SCMStringBuffer cluster;
-                        eclCluster = (char *)wu->getClusterName(cluster).str();
-                    }
+                        eclCluster.set(wu->queryClusterName());
                 }
                 }
             }
             }
             catch(...)
             catch(...)
@@ -1545,7 +1542,7 @@ bool CWsDfuEx::checkFileContent(IEspContext &context, IUserDescriptor* udesc, co
             }
             }
         }
         }
 
 
-        if (!eclCluster || !stricmp(eclCluster, ""))
+        if (!eclCluster.length())
             return false;
             return false;
     }
     }
 
 
@@ -5401,10 +5398,7 @@ int CWsDfuEx::GetIndexData(IEspContext &context, bool bSchemaOnly, const char* i
         {
         {
             CWUWrapper wu(wuid, context);
             CWUWrapper wu(wuid, context);
             if (wu)
             if (wu)
-            {
-                SCMStringBuffer cluster0;
-                cluster.append(wu->getClusterName(cluster0).str());
-            }
+                cluster.append(wu->queryClusterName());
         }
         }
     }
     }
     catch (IException *e)
     catch (IException *e)
@@ -5428,7 +5422,7 @@ int CWsDfuEx::GetIndexData(IEspContext &context, bool bSchemaOnly, const char* i
         udesc->set(secUser->getName(), secUser->credentials().getPassword());
         udesc->set(secUser->getName(), secUser->credentials().getPassword());
     }
     }
 
 
-    if (cluster && *cluster)
+    if (cluster.length())
     {
     {
         web.setown(createViewFileWeb(*resultSetFactory, cluster, udesc.getLink()));
         web.setown(createViewFileWeb(*resultSetFactory, cluster, udesc.getLink()));
     }
     }

+ 2 - 3
esp/services/ws_ecl/ws_ecl_service.cpp

@@ -1751,8 +1751,7 @@ int CWsEclBinding::submitWsEclWorkunit(IEspContext & context, WsEclWuInfo &wsinf
     if (jobname && *jobname)
     if (jobname && *jobname)
         workunit->setJobName(jobname);
         workunit->setJobName(jobname);
 
 
-    SCMStringBuffer wuid;
-    workunit->getWuid(wuid);
+    StringAttr wuid(workunit->queryWuid());  // NB queryWuid() not valid after workunit,clear()
 
 
     SCMStringBuffer token;
     SCMStringBuffer token;
     createToken(wuid.str(), context.queryUserId(), context.queryPassword(), token);
     createToken(wuid.str(), context.queryUserId(), context.queryPassword(), token);
@@ -1776,7 +1775,7 @@ int CWsEclBinding::submitWsEclWorkunit(IEspContext & context, WsEclWuInfo &wsinf
 
 
     bool async = context.queryRequestParameters()->hasProp("_async");
     bool async = context.queryRequestParameters()->hasProp("_async");
 
 
-    //don't wait indefinately, in case submitted to an inactive queue wait max + 5 mins
+    //don't wait indefinitely, in case submitted to an inactive queue wait max + 5 mins
     if (!async && waitForWorkUnitToComplete(wuid.str(), wsecl->workunitTimeout))
     if (!async && waitForWorkUnitToComplete(wuid.str(), wsecl->workunitTimeout))
     {
     {
         Owned<IWuWebView> web = createWuWebView(wuid.str(), wsinfo.qsetname.get(), wsinfo.queryname.get(), getCFD(), true);
         Owned<IWuWebView> web = createWuWebView(wuid.str(), wsinfo.qsetname.get(), wsinfo.queryname.get(), getCFD(), true);

+ 8 - 10
esp/services/ws_smc/ws_smcService.cpp

@@ -181,10 +181,9 @@ struct CActiveWorkunitWrapper: public CActiveWorkunit
 
 
     void setActiveWorkunit(CWUWrapper& wu, const char* wuid, const char* location, unsigned index, double version, bool notCheckVersion)
     void setActiveWorkunit(CWUWrapper& wu, const char* wuid, const char* location, unsigned index, double version, bool notCheckVersion)
     {
     {
-        StringBuffer stateStr;
-        SCMStringBuffer state, stateEx, owner, jobname;
+        SCMStringBuffer stateEx;
         setWuid(wuid);
         setWuid(wuid);
-        wu->getStateDesc(state);
+        const char *state = wu->queryStateDesc();
         setStateID(wu->getState());
         setStateID(wu->getState());
         if (wu->getState() == WUStateBlocked)
         if (wu->getState() == WUStateBlocked)
         {
         {
@@ -192,12 +191,12 @@ struct CActiveWorkunitWrapper: public CActiveWorkunit
             if (notCheckVersion || (version > 1.00))
             if (notCheckVersion || (version > 1.00))
                 setExtra(stateEx.str());
                 setExtra(stateEx.str());
         }
         }
-        buildAndSetState(state.str(), stateEx.str(), location, index);
+        buildAndSetState(state, stateEx.str(), location, index);
         if ((notCheckVersion || (version > 1.09)) && (wu->getState() == WUStateFailed))
         if ((notCheckVersion || (version > 1.09)) && (wu->getState() == WUStateFailed))
             setWarning("The job will ultimately not complete. Please check ECLAgent.");
             setWarning("The job will ultimately not complete. Please check ECLAgent.");
 
 
-        setOwner(wu->getUser(owner).str());
-        setJobname(wu->getJobName(jobname).str());
+        setOwner(wu->queryUser());
+        setJobname(wu->queryJobName());
         setPriorityStr(wu->getPriority());
         setPriorityStr(wu->getPriority());
 
 
         if ((notCheckVersion || (version > 1.08)) && wu->isPausing())
         if ((notCheckVersion || (version > 1.08)) && wu->isPausing())
@@ -206,8 +205,7 @@ struct CActiveWorkunitWrapper: public CActiveWorkunit
         }
         }
         if (notCheckVersion || (version > 1.14))
         if (notCheckVersion || (version > 1.14))
         {
         {
-            SCMStringBuffer clusterName;
-            setClusterName(wu->getClusterName(clusterName).str());
+            setClusterName(wu->queryClusterName());
         }
         }
     }
     }
 
 
@@ -967,14 +965,14 @@ CWsSMCTargetCluster* CWsSMCEx::findTargetCluster(const char* clusterName, CIArra
 CWsSMCTargetCluster* CWsSMCEx::findWUClusterInfo(IEspContext& context, const char* wuid, bool isOnECLAgent, CIArrayOf<CWsSMCTargetCluster>& targetClusters,
 CWsSMCTargetCluster* CWsSMCEx::findWUClusterInfo(IEspContext& context, const char* wuid, bool isOnECLAgent, CIArrayOf<CWsSMCTargetCluster>& targetClusters,
     CIArrayOf<CWsSMCTargetCluster>& targetClusters1, CIArrayOf<CWsSMCTargetCluster>& targetClusters2)
     CIArrayOf<CWsSMCTargetCluster>& targetClusters1, CIArrayOf<CWsSMCTargetCluster>& targetClusters2)
 {
 {
-    SCMStringBuffer clusterName;
+    StringAttr clusterName;
     try
     try
     {
     {
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
         Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
         Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
         if (!cw)
         if (!cw)
             return NULL;
             return NULL;
-        cw->getClusterName(clusterName);
+        clusterName.set(cw->queryClusterName());
         if (!clusterName.length())
         if (!clusterName.length())
             return NULL;
             return NULL;
     }
     }

+ 29 - 48
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -41,10 +41,9 @@ SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, const char *owne
     return (isEmpty(owner) || (user && streq(user, owner))) ? accessOwn : accessOthers;
     return (isEmpty(owner) || (user && streq(user, owner))) ? accessOwn : accessOthers;
 }
 }
 
 
-SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, IConstWorkUnit& cw, SecAccessFlags accessOwn, SecAccessFlags accessOthers)
+SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, IConstWorkUnitInfo& cw, SecAccessFlags accessOwn, SecAccessFlags accessOthers)
 {
 {
-    SCMStringBuffer owner;
-    return chooseWuAccessFlagsByOwnership(user, cw.getUser(owner).str(), accessOwn, accessOthers);
+    return chooseWuAccessFlagsByOwnership(user, cw.queryUser(), accessOwn, accessOthers);
 }
 }
 
 
 const char *getWuAccessType(const char *owner, const char *user)
 const char *getWuAccessType(const char *owner, const char *user)
@@ -54,8 +53,7 @@ const char *getWuAccessType(const char *owner, const char *user)
 
 
 const char *getWuAccessType(IConstWorkUnit& cw, const char *user)
 const char *getWuAccessType(IConstWorkUnit& cw, const char *user)
 {
 {
-    SCMStringBuffer owner;
-    return getWuAccessType(cw.getUser(owner).str(), user);
+    return getWuAccessType(cw.queryUser(), user);
 }
 }
 
 
 void getUserWuAccessFlags(IEspContext& context, SecAccessFlags& accessOwn, SecAccessFlags& accessOthers, bool except)
 void getUserWuAccessFlags(IEspContext& context, SecAccessFlags& accessOwn, SecAccessFlags& accessOthers, bool except)
@@ -960,12 +958,13 @@ unsigned WsWuInfo::getLegacyTotalThorTime()
 
 
 void WsWuInfo::getCommon(IEspECLWorkunit &info, unsigned flags)
 void WsWuInfo::getCommon(IEspECLWorkunit &info, unsigned flags)
 {
 {
-    SCMStringBuffer s;
-    info.setWuid(cw->getWuid(s).str());
+    info.setWuid(cw->queryWuid());
     info.setProtected(cw->isProtected() ? 1 : 0);
     info.setProtected(cw->isProtected() ? 1 : 0);
-    info.setJobname(cw->getJobName(s).str());
-    info.setOwner(cw->getUser(s).str());
-    info.setCluster(cw->getClusterName(clusterName).str());
+    info.setJobname(cw->queryJobName());
+    info.setOwner(cw->queryUser());
+    clusterName.set(cw->queryClusterName());
+    info.setCluster(clusterName.str());
+    SCMStringBuffer s;
     info.setSnapshot(cw->getSnapshot(s).str());
     info.setSnapshot(cw->getSnapshot(s).str());
 
 
     if ((cw->getState() == WUStateScheduled) && cw->aborting())
     if ((cw->getState() == WUStateScheduled) && cw->aborting())
@@ -976,7 +975,7 @@ void WsWuInfo::getCommon(IEspECLWorkunit &info, unsigned flags)
     else
     else
     {
     {
         info.setStateID(cw->getState());
         info.setStateID(cw->getState());
-        info.setState(cw->getStateDesc(s).str());
+        info.setState(cw->queryStateDesc());
     }
     }
 
 
     if (cw->isPausing())
     if (cw->isPausing())
@@ -1062,16 +1061,14 @@ unsigned WsWuInfo::getWorkunitThorLogInfo(IArrayOf<IEspECLHelpFile>& helpers, IE
     IArrayOf<IConstThorLogInfo> thorLogList;
     IArrayOf<IConstThorLogInfo> thorLogList;
     if (cw->getWuidVersion() > 0)
     if (cw->getWuidVersion() > 0)
     {
     {
-        SCMStringBuffer clusterName;
-        cw->getClusterName(clusterName);
+        StringAttr clusterName(cw->queryClusterName());
         if (!clusterName.length()) //Cluster name may not be set yet
         if (!clusterName.length()) //Cluster name may not be set yet
             return countThorLog;
             return countThorLog;
 
 
         Owned<IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(clusterName.str());
         Owned<IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(clusterName.str());
         if (!clusterInfo)
         if (!clusterInfo)
         {
         {
-            SCMStringBuffer wuid;
-            WARNLOG("Cannot find TargetClusterInfo for workunit %s", cw->getWuid(wuid).str());
+            WARNLOG("Cannot find TargetClusterInfo for workunit %s", cw->queryWuid());
             return countThorLog;
             return countThorLog;
         }
         }
 
 
@@ -2206,27 +2203,25 @@ WsWuSearch::WsWuSearch(IEspContext& context,const char* owner,const char* state,
 
 
     ForEach(*it)
     ForEach(*it)
     {
     {
-        IConstWorkUnit &cw = it->query();
+        IConstWorkUnitInfo &cw = it->query();
         if (chooseWuAccessFlagsByOwnership(context.queryUserId(), cw, accessOwn, accessOthers) < SecAccess_Read)
         if (chooseWuAccessFlagsByOwnership(context.queryUserId(), cw, accessOwn, accessOthers) < SecAccess_Read)
             continue;
             continue;
 
 
-        SCMStringBuffer wuid;
-        cw.getWuid(wuid);
-        if (wuFrom.length() && strcmp(wuid.str(),wuFrom.str())<0)
+        const char *wuid = cw.queryWuid();
+        if (wuFrom.length() && strcmp(wuid,wuFrom.str())<0)
             continue;
             continue;
-        if (wuTo.length() && strcmp(wuid.str(),wuTo.str())>0)
+        if (wuTo.length() && strcmp(wuid, wuTo.str())>0)
             continue;
             continue;
 
 
         if (state && *state)
         if (state && *state)
         {
         {
-            SCMStringBuffer descr;
-            if(!strieq(cw.getStateDesc(descr).str(),state))
+            if(!strieq(cw.queryStateDesc(),state))
                 continue;
                 continue;
         }
         }
 
 
-        wuids.push_back(wuid.str());
+        wuids.push_back(wuid);
     }
     }
-    std::sort(wuids.begin(),wuids.end(),std::greater<std::string>());
+    std::sort(wuids.begin(), wuids.end(),std::greater<std::string>());
 }
 }
 
 
 StringBuffer& WsWuSearch::createWuidFromDate(const char* timestamp,StringBuffer& s)
 StringBuffer& WsWuSearch::createWuidFromDate(const char* timestamp,StringBuffer& s)
@@ -2757,10 +2752,10 @@ int WUSchedule::run()
                 {
                 {
                     try
                     try
                     {
                     {
-                        IConstWorkUnit & cw = itr->query();
+                        IConstWorkUnitInfo & cw = itr->query();
                         if (cw.aborting())
                         if (cw.aborting())
                         {
                         {
-                            WorkunitUpdate wu(&cw.lock());
+                            WorkunitUpdate wu(factory->updateWorkUnit(cw.queryWuid()));
                             wu->setState(WUStateAborted);
                             wu->setState(WUStateAborted);
                             continue;
                             continue;
                         }
                         }
@@ -2769,10 +2764,7 @@ int WUSchedule::run()
                         now.setNow();
                         now.setNow();
                         cw.getTimeScheduled(dt);
                         cw.getTimeScheduled(dt);
                         if (now.compare(dt)>=0)
                         if (now.compare(dt)>=0)
-                        {
-                            SCMStringBuffer wuid;
-                            runWorkUnit(cw.getWuid(wuid).str());
-                        }
+                            runWorkUnit(cw.queryWuid());
                     }
                     }
                     catch(IException *e)
                     catch(IException *e)
                     {
                     {
@@ -2813,9 +2805,8 @@ void WsWuHelpers::setXmlParameters(IWorkUnit *wu, const char *xml, bool setJobna
         return;
         return;
     if (setJobname)
     if (setJobname)
     {
     {
-        SCMStringBuffer name;
-        wu->getJobName(name);
-        if (!name.length())
+        const char *name = wu->queryJobName();
+        if (!name || !*name)
             wu->setJobName(root->queryName());
             wu->setJobName(root->queryName());
     }
     }
     wu->setXmlParams(LINK(root));
     wu->setXmlParams(LINK(root));
@@ -2867,14 +2858,10 @@ void WsWuHelpers::submitWsWorkunit(IEspContext& context, IConstWorkUnit* cw, con
         case WUStateCompiling:
         case WUStateCompiling:
         case WUStateAborting:
         case WUStateAborting:
         case WUStateBlocked:
         case WUStateBlocked:
-        {
-            SCMStringBuffer descr;
-            throw MakeStringException(ECLWATCH_CANNOT_SUBMIT_WORKUNIT, "Cannot submit the workunit. Workunit state is '%s'.", cw->getStateDesc(descr).str());
-        }
+            throw MakeStringException(ECLWATCH_CANNOT_SUBMIT_WORKUNIT, "Cannot submit the workunit. Workunit state is '%s'.", cw->queryStateDesc());
     }
     }
 
 
-    SCMStringBuffer wuid;
-    cw->getWuid(wuid);
+    StringAttr wuid(cw->queryWuid());
 
 
     WorkunitUpdate wu(&cw->lock());
     WorkunitUpdate wu(&cw->lock());
     if(!wu.get())
     if(!wu.get())
@@ -2964,23 +2951,18 @@ void WsWuHelpers::copyWsWorkunit(IEspContext &context, IWorkUnit &wu, const char
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IConstWorkUnit> src(factory->openWorkUnit(srcWuid, false));
     Owned<IConstWorkUnit> src(factory->openWorkUnit(srcWuid, false));
 
 
-    SCMStringBuffer wuid;
-    wu.getWuid(wuid);
-
     queryExtendedWU(&wu)->copyWorkUnit(src, false);
     queryExtendedWU(&wu)->copyWorkUnit(src, false);
 
 
     SCMStringBuffer token;
     SCMStringBuffer token;
-    wu.setSecurityToken(createToken(wuid.str(), context.queryUserId(), context.queryPassword(), token).str());
+    wu.setSecurityToken(createToken(wu.queryWuid(), context.queryUserId(), context.queryPassword(), token).str());
     wu.commit();
     wu.commit();
 }
 }
 
 
 void WsWuHelpers::runWsWorkunit(IEspContext &context, StringBuffer &wuid, const char *srcWuid, const char *cluster, const char *paramXml,
 void WsWuHelpers::runWsWorkunit(IEspContext &context, StringBuffer &wuid, const char *srcWuid, const char *cluster, const char *paramXml,
     IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
     IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
 {
 {
-    StringBufferAdaptor isvWuid(wuid);
-
     NewWsWorkunit wu(context);
     NewWsWorkunit wu(context);
-    wu->getWuid(isvWuid);
+    wuid.set(wu->queryWuid());
     copyWsWorkunit(context, *wu, srcWuid);
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
     wu.clear();
 
 
@@ -3040,10 +3022,9 @@ void WsWuHelpers::runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const c
 void WsWuHelpers::runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query, const char *cluster, const char *paramXml)
 void WsWuHelpers::runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query, const char *cluster, const char *paramXml)
 {
 {
     StringBuffer srcWuid;
     StringBuffer srcWuid;
-    StringBufferAdaptor isvWuid(wuid);
 
 
     NewWsWorkunit wu(context);
     NewWsWorkunit wu(context);
-    wu->getWuid(isvWuid);
+    wuid.set(wu->queryWuid());
     resolveQueryWuid(srcWuid, queryset, query, true, wu);
     resolveQueryWuid(srcWuid, queryset, query, true, wu);
     copyWsWorkunit(context, *wu, srcWuid);
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
     wu.clear();

+ 3 - 3
esp/services/ws_workunits/ws_workunitsHelpers.hpp

@@ -61,7 +61,7 @@ inline bool isEmpty(const char *val){return (!val || !*val);}
 const char *getWuAccessType(IConstWorkUnit& cw, const char *user);
 const char *getWuAccessType(IConstWorkUnit& cw, const char *user);
 
 
 SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, const char *owner, SecAccessFlags accessOwn, SecAccessFlags accessOthers);
 SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, const char *owner, SecAccessFlags accessOwn, SecAccessFlags accessOthers);
-SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, IConstWorkUnit& cw, SecAccessFlags accessOwn, SecAccessFlags accessOthers);
+SecAccessFlags chooseWuAccessFlagsByOwnership(const char *user, IConstWorkUnitInfo& cw, SecAccessFlags accessOwn, SecAccessFlags accessOthers);
 SecAccessFlags getWsWorkunitAccess(IEspContext& cxt, IConstWorkUnit& cw);
 SecAccessFlags getWsWorkunitAccess(IEspContext& cxt, IConstWorkUnit& cw);
 
 
 void getUserWuAccessFlags(IEspContext& context, SecAccessFlags& accessOwn, SecAccessFlags& accessOthers, bool except);
 void getUserWuAccessFlags(IEspContext& context, SecAccessFlags& accessOwn, SecAccessFlags& accessOthers, bool except);
@@ -132,7 +132,7 @@ public:
       context(ctx), cw(cw_)
       context(ctx), cw(cw_)
     {
     {
         version = context.getClientVersion();
         version = context.getClientVersion();
-        cw->getWuid(wuid);
+        wuid.set(cw->queryWuid());
     }
     }
 
 
     WsWuInfo(IEspContext &ctx, const char *wuid_) :
     WsWuInfo(IEspContext &ctx, const char *wuid_) :
@@ -203,7 +203,7 @@ public:
     Linked<IConstWorkUnit> cw;
     Linked<IConstWorkUnit> cw;
     double version;
     double version;
     SCMStringBuffer clusterName;
     SCMStringBuffer clusterName;
-    SCMStringBuffer wuid;
+    StringAttr wuid;
 };
 };
 
 
 void getSashaNode(SocketEndpoint &ep);
 void getSashaNode(SocketEndpoint &ep);

+ 7 - 7
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -446,12 +446,12 @@ bool CWsWorkunitsEx::onWUCopyLogicalFiles(IEspContext &context, IEspWUCopyLogica
 
 
     resp.setWuid(wuid.str());
     resp.setWuid(wuid.str());
 
 
-    SCMStringBuffer cluster;
+    StringAttr cluster;
     if (notEmpty(req.getCluster()))
     if (notEmpty(req.getCluster()))
         cluster.set(req.getCluster());
         cluster.set(req.getCluster());
     else
     else
-        cw->getClusterName(cluster);
-    if (!isValidCluster(req.getCluster()))
+        cluster.set(cw->queryClusterName());
+    if (!isValidCluster(cluster))
         throw MakeStringException(ECLWATCH_INVALID_CLUSTER_NAME, "Invalid cluster name: %s", cluster.str());
         throw MakeStringException(ECLWATCH_INVALID_CLUSTER_NAME, "Invalid cluster name: %s", cluster.str());
 
 
     Owned <IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(cluster.str());
     Owned <IConstWUClusterInfo> clusterInfo = getTargetClusterInfo(cluster.str());
@@ -747,19 +747,19 @@ bool CWsWorkunitsEx::onWUPublishWorkunit(IEspContext &context, IEspWUPublishWork
 
 
     resp.setWuid(wuid.str());
     resp.setWuid(wuid.str());
 
 
-    SCMStringBuffer queryName;
+    StringAttr queryName;
     if (notEmpty(req.getJobName()))
     if (notEmpty(req.getJobName()))
         queryName.set(req.getJobName());
         queryName.set(req.getJobName());
     else
     else
-        cw->getJobName(queryName).str();
+        queryName.set(cw->queryJobName());
     if (!queryName.length())
     if (!queryName.length())
         throw MakeStringException(ECLWATCH_MISSING_PARAMS, "Query/Job name not defined for publishing workunit %s", wuid.str());
         throw MakeStringException(ECLWATCH_MISSING_PARAMS, "Query/Job name not defined for publishing workunit %s", wuid.str());
 
 
-    SCMStringBuffer target;
+    StringAttr target;
     if (notEmpty(req.getCluster()))
     if (notEmpty(req.getCluster()))
         target.set(req.getCluster());
         target.set(req.getCluster());
     else
     else
-        cw->getClusterName(target);
+        target.set(cw->queryClusterName());
     if (!target.length())
     if (!target.length())
         throw MakeStringException(ECLWATCH_MISSING_PARAMS, "Cluster name not defined for publishing workunit %s", wuid.str());
         throw MakeStringException(ECLWATCH_MISSING_PARAMS, "Cluster name not defined for publishing workunit %s", wuid.str());
     if (!isValidCluster(target.str()))
     if (!isValidCluster(target.str()))

+ 28 - 43
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -56,9 +56,7 @@ class ExecuteExistingQueryInfo
 public:
 public:
     ExecuteExistingQueryInfo(IConstWorkUnit *cw)
     ExecuteExistingQueryInfo(IConstWorkUnit *cw)
     {
     {
-        SCMStringBuffer isv;
-        cw->getJobName(isv);
-        const char *name = isv.str();
+        const char *name = cw->queryJobName();
         const char *div = strchr(name, '.');
         const char *div = strchr(name, '.');
         if (div)
         if (div)
         {
         {
@@ -147,6 +145,7 @@ void setActionResult(const char* wuid, int action, const char* result, StringBuf
     default:
     default:
     {
     {
         strAction = "Unknown";
         strAction = "Unknown";
+        break;
     }
     }
     }
     }
 
 
@@ -518,9 +517,8 @@ bool CWsWorkunitsEx::onWUCreate(IEspContext &context, IEspWUCreateRequest &req,
             throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Permission denied.");
             throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Permission denied.");
 
 
         NewWsWorkunit wu(context);
         NewWsWorkunit wu(context);
-        SCMStringBuffer wuid;
-        resp.updateWorkunit().setWuid(wu->getWuid(wuid).str());
-        AuditSystemAccess(context.queryUserId(), true, "Updated %s", wuid.str());
+        resp.updateWorkunit().setWuid(wu->queryWuid());
+        AuditSystemAccess(context.queryUserId(), true, "Updated %s", wu->queryWuid());
     }
     }
     catch(IException* e)
     catch(IException* e)
     {
     {
@@ -699,9 +697,7 @@ bool CWsWorkunitsEx::onWUCreateAndUpdate(IEspContext &context, IEspWUUpdateReque
             throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Permission denied.");
             throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Permission denied.");
 
 
         NewWsWorkunit wu(context);
         NewWsWorkunit wu(context);
-        SCMStringBuffer wuid;
-        wu->getWuid(wuid);
-        req.setWuid(wuid.str());
+        req.setWuid(wu->queryWuid());
     }
     }
     catch(IException* e)
     catch(IException* e)
     {
     {
@@ -844,7 +840,7 @@ bool CWsWorkunitsEx::onWUResubmit(IEspContext &context, IEspWUResubmitRequest &r
     try
     try
     {
     {
         Owned<IMultiException> me = MakeMultiException();
         Owned<IMultiException> me = MakeMultiException();
-        SCMStringBuffer wuid;
+        StringAttr wuid;
         StringArray wuids;
         StringArray wuids;
 
 
         double version = context.getClientVersion();
         double version = context.getClientVersion();
@@ -865,7 +861,7 @@ bool CWsWorkunitsEx::onWUResubmit(IEspContext &context, IEspWUResubmitRequest &r
                 {
                 {
                     Owned<IConstWorkUnit> src(factory->openWorkUnit(wuid.str(), false));
                     Owned<IConstWorkUnit> src(factory->openWorkUnit(wuid.str(), false));
                     NewWsWorkunit wu(factory, context);
                     NewWsWorkunit wu(factory, context);
-                    wu->getWuid(wuid);
+                    wuid.set(wu->queryWuid());
                     queryExtendedWU(wu)->copyWorkUnit(src, false);
                     queryExtendedWU(wu)->copyWorkUnit(src, false);
 
 
                     SCMStringBuffer token;
                     SCMStringBuffer token;
@@ -878,7 +874,7 @@ bool CWsWorkunitsEx::onWUResubmit(IEspContext &context, IEspWUResubmitRequest &r
                 if(!cw)
                 if(!cw)
                     throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT,"Cannot open workunit %s.",wuid.str());
                     throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT,"Cannot open workunit %s.",wuid.str());
 
 
-                //Dont allow resubmit of someone else's workunit
+                //Don't allow resubmit of someone else's workunit
                 if (context.querySecManager())
                 if (context.querySecManager())
                 {
                 {
                     IUserDescriptor * owner = cw->queryUserDescriptor();
                     IUserDescriptor * owner = cw->queryUserDescriptor();
@@ -987,10 +983,7 @@ bool CWsWorkunitsEx::onWUSchedule(IEspContext &context, IEspWUScheduleRequest &r
             case WUStateRunning:
             case WUStateRunning:
             case WUStateAborting:
             case WUStateAborting:
             case WUStateBlocked:
             case WUStateBlocked:
-            {
-                SCMStringBuffer descr;
-                throw MakeStringException(ECLWATCH_CANNOT_SCHEDULE_WORKUNIT, "Cannot schedule the workunit. Workunit state is '%s'.", wu->getStateDesc(descr).str());
-            }
+                throw MakeStringException(ECLWATCH_CANNOT_SCHEDULE_WORKUNIT, "Cannot schedule the workunit. Workunit state is '%s'.", wu->queryStateDesc());
         }
         }
 
 
         wu->clearExceptions();
         wu->clearExceptions();
@@ -1125,8 +1118,7 @@ bool CWsWorkunitsEx::onWURun(IEspContext &context, IEspWURunRequest &req, IEspWU
         if (!cw)
         if (!cw)
             throw MakeStringException(ECLWATCH_CANNOT_UPDATE_WORKUNIT,"Cannot open workunit %s.", wuid.str());
             throw MakeStringException(ECLWATCH_CANNOT_UPDATE_WORKUNIT,"Cannot open workunit %s.", wuid.str());
 
 
-        SCMStringBuffer stateDesc;
-        resp.setState(cw->getStateDesc(stateDesc).str());
+        resp.setState(cw->queryStateDesc());
         resp.setWuid(wuid.str());
         resp.setWuid(wuid.str());
 
 
         switch (cw->getState())
         switch (cw->getState())
@@ -1229,8 +1221,7 @@ bool CWsWorkunitsEx::onWUSyntaxCheckECL(IEspContext &context, IEspWUSyntaxCheckR
 
 
         wu.setQueryText(req.getECL());
         wu.setQueryText(req.getECL());
 
 
-        SCMStringBuffer wuid;
-        wu->getWuid(wuid);
+        StringAttr wuid(wu->queryWuid());  // NB queryWuid() not valid after workunit,clear()
         wu->commit();
         wu->commit();
         wu.clear();
         wu.clear();
 
 
@@ -1280,9 +1271,7 @@ bool CWsWorkunitsEx::onWUCompileECL(IEspContext &context, IEspWUCompileECLReques
 
 
         wu.setQueryText(req.getECL());
         wu.setQueryText(req.getECL());
 
 
-        SCMStringBuffer wuid;
-        wu->getWuid(wuid);
-        wu.clear();
+        StringAttr wuid(wu->queryWuid());  // NB queryWuid() not valid after workunit,clear()        StringAttr wuid(wu->queryWuid());
 
 
         WsWuHelpers::submitWsWorkunit(context, wuid.str(), req.getCluster(), req.getSnapshot(), 0, true, false, false);
         WsWuHelpers::submitWsWorkunit(context, wuid.str(), req.getCluster(), req.getSnapshot(), 0, true, false, false);
         waitForWorkUnitToComplete(wuid.str(),req.getTimeToWait());
         waitForWorkUnitToComplete(wuid.str(),req.getTimeToWait());
@@ -1376,8 +1365,7 @@ bool CWsWorkunitsEx::onWUGetDependancyTrees(IEspContext& context, IEspWUGetDepen
             }
             }
         }
         }
 
 
-        SCMStringBuffer wuid;
-        wu->getWuid(wuid);
+        StringAttr wuid(wu->queryWuid());  // NB queryWuid() not valid after workunit,clear()
         wu->commit();
         wu->commit();
         wu.clear();
         wu.clear();
 
 
@@ -1867,7 +1855,7 @@ void doWUQueryWithSort(IEspContext &context, IEspWUQueryRequest & req, IEspWUQue
     unsigned actualCount = 0;
     unsigned actualCount = 0;
     ForEach(*it)
     ForEach(*it)
     {
     {
-        IConstWorkUnit& cw = it->query();
+        IConstWorkUnitInfo& cw = it->query();
         if (chooseWuAccessFlagsByOwnership(context.queryUserId(), cw, accessOwn, accessOthers) < SecAccess_Read)
         if (chooseWuAccessFlagsByOwnership(context.queryUserId(), cw, accessOwn, accessOthers) < SecAccess_Read)
         {
         {
             numWUs--;
             numWUs--;
@@ -1880,8 +1868,7 @@ void doWUQueryWithSort(IEspContext &context, IEspWUQueryRequest & req, IEspWUQue
             continue;
             continue;
         }
         }
 
 
-        SCMStringBuffer wuidStr;
-        const char* wuid = cw.getWuid(wuidStr).str();
+        const char* wuid = cw.queryWuid();
         if (!looksLikeAWuid(wuid))
         if (!looksLikeAWuid(wuid))
         {
         {
             numWUs--;
             numWUs--;
@@ -2374,8 +2361,7 @@ void getWsWuResult(IEspContext &context, const char* wuid, const char *name, con
     Owned<INewResultSet> rs;
     Owned<INewResultSet> rs;
     if (logicalName.length())
     if (logicalName.length())
     {
     {
-        SCMStringBuffer cluster;  //MORE is this wrong cluster?
-        rs.setown(resultSetFactory->createNewFileResultSet(logicalName.str(), cw->getClusterName(cluster).str()));
+        rs.setown(resultSetFactory->createNewFileResultSet(logicalName.str(), cw->queryClusterName())); //MORE is this wrong cluster?
     }
     }
     else
     else
         rs.setown(resultSetFactory->createNewResultSet(result, wuid));
         rs.setown(resultSetFactory->createNewResultSet(result, wuid));
@@ -2783,7 +2769,7 @@ void getWorkunitCluster(IEspContext &context, const char* wuid, SCMStringBuffer&
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
     Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
     if (cw)
     if (cw)
-        cw->getClusterName(cluster);
+        cluster.set(cw->queryClusterName());
     else if (checkArchiveWUs)
     else if (checkArchiveWUs)
     {
     {
         Owned<IPropertyTree> wuProps;// = getArchivedWorkUnitProperties(wuid);
         Owned<IPropertyTree> wuProps;// = getArchivedWorkUnitProperties(wuid);
@@ -2949,7 +2935,8 @@ void getScheduledWUs(IEspContext &context, const char *stateReq, const char *ser
                     {
                     {
                         bool match = false;
                         bool match = false;
                         unsigned stateID = WUStateUnknown;
                         unsigned stateID = WUStateUnknown;
-                        SCMStringBuffer jobName, owner, state;
+                        StringBuffer jobName, owner;
+                        SCMStringBuffer state;
                         try
                         try
                         {
                         {
                             Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid.str(), false);
                             Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid.str(), false);
@@ -2965,14 +2952,14 @@ void getScheduledWUs(IEspContext &context, const char *stateReq, const char *ser
                                 else
                                 else
                                 {
                                 {
                                     stateID = cw->getState();
                                     stateID = cw->getState();
-                                    cw->getStateDesc(state);
+                                    state.set(cw->queryStateDesc());
                                 }
                                 }
 
 
                                 if (!stateReq || !*stateReq || strieq(stateReq, state.str()))
                                 if (!stateReq || !*stateReq || strieq(stateReq, state.str()))
                                 {
                                 {
                                     match = true;
                                     match = true;
-                                    cw->getJobName(jobName);
-                                    cw->getUser(owner);
+                                    jobName.set(cw->queryJobName());
+                                    owner.set(cw->queryUser());
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -3680,8 +3667,7 @@ void deployEclOrArchive(IEspContext &context, IEspWUDeployWorkunitRequest & req,
 {
 {
     NewWsWorkunit wu(context);
     NewWsWorkunit wu(context);
 
 
-    SCMStringBuffer wuid;
-    wu->getWuid(wuid);
+    StringAttr wuid(wu->queryWuid());  // NB queryWuid() not valid after workunit,clear()
 
 
     wu->setAction(WUActionCompile);
     wu->setAction(WUActionCompile);
 
 
@@ -3811,8 +3797,7 @@ void deploySharedObject(IEspContext &context, StringBuffer &wuid, const char *fi
 
 
     NewWsWorkunit wu(context, wuid); //duplicate wuid made unique
     NewWsWorkunit wu(context, wuid); //duplicate wuid made unique
 
 
-    StringBufferAdaptor isvWuid(wuid);
-    wu->getWuid(isvWuid);
+    wuid.set(wu->queryWuid());
     wu->setClusterName(cluster);
     wu->setClusterName(cluster);
     wu->commit();
     wu->commit();
 
 
@@ -3969,12 +3954,11 @@ void CWsWorkunitsEx::addProcessLogfile(Owned<IConstWorkUnit>& cwu, WsWuInfo& win
 
 
 void CWsWorkunitsEx::createZAPWUInfoFile(IEspWUCreateZAPInfoRequest &req, Owned<IConstWorkUnit>& cwu, const char* pathNameStr)
 void CWsWorkunitsEx::createZAPWUInfoFile(IEspWUCreateZAPInfoRequest &req, Owned<IConstWorkUnit>& cwu, const char* pathNameStr)
 {
 {
-    SCMStringBuffer temp;
     StringBuffer sb;
     StringBuffer sb;
-    sb.append("Workunit:     ").append(cwu->getWuid(temp)).append("\r\n");
-    sb.append("User:         ").append(cwu->getUser(temp).str()).append("\r\n");
+    sb.append("Workunit:     ").append(cwu->queryWuid()).append("\r\n");
+    sb.append("User:         ").append(cwu->queryUser()).append("\r\n");
     sb.append("Build Version:").append(req.getBuildVersion()).append("\r\n");
     sb.append("Build Version:").append(req.getBuildVersion()).append("\r\n");
-    sb.append("Cluster:      ").append(cwu->getClusterName(temp).str()).append("\r\n");
+    sb.append("Cluster:      ").append(cwu->queryClusterName()).append("\r\n");
     if (req.getESPIPAddress())
     if (req.getESPIPAddress())
         sb.append("ESP:          ").append(req.getESPIPAddress()).append("\r\n");
         sb.append("ESP:          ").append(req.getESPIPAddress()).append("\r\n");
     if (req.getThorIPAddress())
     if (req.getThorIPAddress())
@@ -3984,6 +3968,7 @@ void CWsWorkunitsEx::createZAPWUInfoFile(IEspWUCreateZAPInfoRequest &req, Owned<
     StringBuffer info, warn, err, alert;
     StringBuffer info, warn, err, alert;
     ForEach(*exceptions)
     ForEach(*exceptions)
     {
     {
+        SCMStringBuffer temp;
         switch (exceptions->query().getSeverity())
         switch (exceptions->query().getSeverity())
         {
         {
         case ExceptionSeverityInformation:
         case ExceptionSeverityInformation:

+ 24 - 36
esp/smc/SMCLib/WUXMLInfo.cpp

@@ -82,22 +82,16 @@ bool CWUXMLInfo::buildXmlWuidInfo(IConstWorkUnit &wu, IEspECLWorkunit& wuStructu
 {
 {
     try
     try
     {
     {
-        SCMStringBuffer buf;
         wuStructure.setProtected((wu.isProtected() ? 1 : 0));
         wuStructure.setProtected((wu.isProtected() ? 1 : 0));
-        buf.clear();
-        wuStructure.setWuid(wu.getWuid(buf).str()); 
-        buf.clear();
-        wuStructure.setOwner(wu.getUser(buf).str());
-        buf.clear();
-        wuStructure.setJobname(wu.getJobName(buf).str());
-        buf.clear();
-        wuStructure.setCluster(wu.getClusterName(buf).str());
+        wuStructure.setWuid(wu.queryWuid());
+        wuStructure.setOwner(wu.queryUser());
+        wuStructure.setJobname(wu.queryJobName());
+        wuStructure.setCluster(wu.queryClusterName());
         wuStructure.setStateID(wu.getState());
         wuStructure.setStateID(wu.getState());
-        buf.clear();
-        wuStructure.setState(wu.getStateDesc(buf).str());
+        wuStructure.setState(wu.queryStateDesc());
         if (bDescription)
         if (bDescription)
         {
         {
-            buf.clear();
+            SCMStringBuffer buf;
             wuStructure.setDescription((wu.getDebugValue("description", buf)).str());
             wuStructure.setDescription((wu.getDebugValue("description", buf)).str());
         }
         }
     }
     }
@@ -139,39 +133,34 @@ bool CWUXMLInfo::buildXmlWuidInfo(const char* wuid, IEspECLWorkunit& wuStructure
 
 
 bool CWUXMLInfo::buildXmlWuidInfo(IConstWorkUnit &wu, StringBuffer& wuStructure,bool bDescription)
 bool CWUXMLInfo::buildXmlWuidInfo(IConstWorkUnit &wu, StringBuffer& wuStructure,bool bDescription)
 {
 {
-    try{
-      SCMStringBuffer buf;
+    try
+    {
 
 
         wuStructure.append("<Workunit>");
         wuStructure.append("<Workunit>");
         wuStructure.appendf("<Protected>%d</Protected>",(wu.isProtected() ? 1 : 0));
         wuStructure.appendf("<Protected>%d</Protected>",(wu.isProtected() ? 1 : 0));
-        wuStructure.appendf("<Wuid>%s</Wuid>",wu.getWuid(buf).str());
-      buf.clear();
-        wuStructure.appendf("<Owner>%s</Owner>",wu.getUser(buf).str());
-      buf.clear();
-        wuStructure.appendf("<Jobname>%s</Jobname>",wu.getJobName(buf).str());
-      buf.clear();
-        wuStructure.appendf("<Cluster>%s</Cluster>",wu.getClusterName(buf).str());
-      buf.clear();
-        wuStructure.appendf("<State>%s</State>",wu.getStateDesc(buf).str());
-      buf.clear();
+        wuStructure.appendf("<Wuid>%s</Wuid>",wu.queryWuid());
+        wuStructure.appendf("<Owner>%s</Owner>",wu.queryUser());
+        wuStructure.appendf("<Jobname>%s</Jobname>",wu.queryJobName());
+        wuStructure.appendf("<Cluster>%s</Cluster>",wu.queryClusterName());
+        wuStructure.appendf("<State>%s</State>",wu.queryStateDesc());
         if (bDescription)
         if (bDescription)
-      {
-            wuStructure.appendf("<Description>%s</Description>",
-            (wu.getDebugValue("description", buf)).str());
-         buf.clear();
-      }
+        {
+            SCMStringBuffer buf;
+            wuStructure.appendf("<Description>%s</Description>", (wu.getDebugValue("description", buf)).str());
+        }
         wuStructure.append("</Workunit>");
         wuStructure.append("</Workunit>");
     }
     }
-    catch(IException* e){   
-      StringBuffer msg;
-      e->errorMessage(msg);
+    catch(IException* e)
+    {
+        StringBuffer msg;
+        e->errorMessage(msg);
         WARNLOG("%s", msg.str());
         WARNLOG("%s", msg.str());
         e->Release();
         e->Release();
     }
     }
-    catch(...){
+    catch(...)
+    {
         WARNLOG("Unknown Exception caught within CWUXMLInfo::buildXmlWuidInfo");
         WARNLOG("Unknown Exception caught within CWUXMLInfo::buildXmlWuidInfo");
     }
     }
-
     return true;
     return true;
 }
 }
 
 
@@ -186,8 +175,7 @@ bool CWUXMLInfo::buildXmlGraphList(IConstWorkUnit &wu,IPropertyTree& XMLStructur
         {
         {
             IConstWUGraph &graph = graphs->query();
             IConstWUGraph &graph = graphs->query();
             IPropertyTree * p = resultTree->addPropTree("WUGraph", createPTree(ipt_caseInsensitive));
             IPropertyTree * p = resultTree->addPropTree("WUGraph", createPTree(ipt_caseInsensitive));
-            p->setProp("Wuid", wu.getWuid(buf).str());
-            buf.clear();
+            p->setProp("Wuid", wu.queryWuid());
             p->setProp("Name", graph.getName(buf).str());
             p->setProp("Name", graph.getName(buf).str());
             buf.clear();
             buf.clear();
             // MORE? (debugging)
             // MORE? (debugging)

+ 2 - 3
plugins/fileservices/fileservices.cpp

@@ -614,10 +614,9 @@ static void blockUntilComplete(const char * label, IClientFileSpray &server, ICo
 
 
 static void setServerAccess(CClientFileSpray &server, IConstWorkUnit * wu)
 static void setServerAccess(CClientFileSpray &server, IConstWorkUnit * wu)
 {
 {
-    StringBuffer user, password, wuid, token;
+    StringBuffer user, password, token;
     wu->getSecurityToken(StringBufferAdaptor(token));
     wu->getSecurityToken(StringBufferAdaptor(token));
-    wu->getWuid(StringBufferAdaptor(wuid));
-    extractToken(token.str(), wuid.str(), StringBufferAdaptor(user), StringBufferAdaptor(password));
+    extractToken(token.str(), wu->queryWuid(), StringBufferAdaptor(user), StringBufferAdaptor(password));
     server.setUsernameToken(user.str(), password.str(), "");
     server.setUsernameToken(user.str(), password.str(), "");
 }
 }
 
 

+ 9 - 23
roxie/ccd/ccdcontext.cpp

@@ -2031,13 +2031,10 @@ protected:
     void executeThorGraph(const char *graphName)
     void executeThorGraph(const char *graphName)
     {
     {
         assertex(workUnit);
         assertex(workUnit);
-        SCMStringBuffer wuid;
-        workUnit->getWuid(wuid);
+        StringAttr wuid(workUnit->queryWuid());
+        StringAttr owner(workUnit->queryUser());
+        StringAttr cluster(workUnit->queryClusterName());
 
 
-        SCMStringBuffer cluster;
-        SCMStringBuffer owner;
-        workUnit->getClusterName(cluster);
-        workUnit->getUser(owner);
         int priority = workUnit->getPriorityValue();
         int priority = workUnit->getPriorityValue();
         unsigned timelimit = workUnit->getDebugValueInt("thorConnectTimeout", defaultThorConnectTimeout);
         unsigned timelimit = workUnit->getDebugValueInt("thorConnectTimeout", defaultThorConnectTimeout);
         Owned<IConstWUClusterInfo> c = getTargetClusterInfo(cluster.str());
         Owned<IConstWUClusterInfo> c = getTargetClusterInfo(cluster.str());
@@ -2075,9 +2072,7 @@ protected:
                 CWorkunitResumeHandler(IConstWorkUnit &_wu) : wu(_wu)
                 CWorkunitResumeHandler(IConstWorkUnit &_wu) : wu(_wu)
                 {
                 {
                     xpath.append("/WorkUnits/");
                     xpath.append("/WorkUnits/");
-                    SCMStringBuffer istr;
-                    wu.getWuid(istr);
-                    wuid.set(istr.str());
+                    wuid.set(wu.queryWuid());
                     xpath.append(wuid.get()).append("/Action");
                     xpath.append(wuid.get()).append("/Action");
                     subId = 0;
                     subId = 0;
                 }
                 }
@@ -2103,9 +2098,7 @@ protected:
                         wu.forceReload();
                         wu.forceReload();
                         if (WUStatePaused != wu.getState() || wu.aborting())
                         if (WUStatePaused != wu.getState() || wu.aborting())
                         {
                         {
-                            SCMStringBuffer str;
-                            wu.getStateDesc(str);
-                            PROGLOG("Aborting pause job %s, state : %s", wuid.get(), str.str());
+                            PROGLOG("Aborting pause job %s, state : %s", wuid.get(), wu.queryStateDesc());
                             ret = false;
                             ret = false;
                             break;
                             break;
                         }
                         }
@@ -2600,8 +2593,7 @@ protected:
         {
         {
             bool breakAtStart = workUnit->getDebugValueBool("BreakAtStart", true);
             bool breakAtStart = workUnit->getDebugValueBool("BreakAtStart", true);
             wu->setState(WUStateDebugRunning);
             wu->setState(WUStateDebugRunning);
-            SCMStringBuffer wuid;
-            initDebugMode(breakAtStart, workUnit->getWuid(wuid).str());
+            initDebugMode(breakAtStart, workUnit->queryWuid());
         }
         }
         else
         else
             wu->setState(WUStateRunning);
             wu->setState(WUStateRunning);
@@ -3568,9 +3560,7 @@ public:
     {
     {
         if (workUnit)
         if (workUnit)
         {
         {
-            SCMStringBuffer out;
-            workUnit->getClusterName(out);
-            return out.s.detach();  // detach will return "" rather than NULL
+            return strdup(workUnit->queryClusterName());
         }
         }
         else
         else
         {
         {
@@ -3588,9 +3578,7 @@ public:
     {
     {
         if (workUnit)
         if (workUnit)
         {
         {
-            SCMStringBuffer jobName;
-            workUnit->getJobName(jobName);
-            return strdup(jobName.str());
+            return strdup(workUnit->queryJobName());
         }
         }
         return strdup(factory->queryQueryName());
         return strdup(factory->queryQueryName());
     }
     }
@@ -3603,9 +3591,7 @@ public:
     {
     {
         if (workUnit)
         if (workUnit)
         {
         {
-            SCMStringBuffer wuid;
-            workUnit->getWuid(wuid);
-            return strdup(wuid.str());
+            return strdup(workUnit->queryWuid());
         }
         }
         else
         else
         {
         {

+ 0 - 2
roxie/ccd/ccdlistener.cpp

@@ -1141,8 +1141,6 @@ public:
         daliHelper->noteWorkunitRunning(wuid.get(), true);
         daliHelper->noteWorkunitRunning(wuid.get(), true);
         if (!wu)
         if (!wu)
             throw MakeStringException(ROXIE_DALI_ERROR, "Failed to open workunit %s", wuid.get());
             throw MakeStringException(ROXIE_DALI_ERROR, "Failed to open workunit %s", wuid.get());
-        SCMStringBuffer target;
-        wu->getClusterName(target);
         Owned<StringContextLogger> logctx = new StringContextLogger(wuid.get());
         Owned<StringContextLogger> logctx = new StringContextLogger(wuid.get());
         Owned<IQueryFactory> queryFactory;
         Owned<IQueryFactory> queryFactory;
         try
         try

+ 4 - 8
roxie/ccd/ccdquery.cpp

@@ -125,12 +125,10 @@ public:
         q->getQueryDllName(dllName);
         q->getQueryDllName(dllName);
         if (dllName.length() == 0)
         if (dllName.length() == 0)
         {
         {
-            SCMStringBuffer wuid;
-            wu->getWuid(wuid);
             if (wu->getCodeVersion() == 0)
             if (wu->getCodeVersion() == 0)
-                throw makeStringExceptionV(ROXIE_MISSING_DLL, "Attempting to load workunit %s that hasn't been compiled", wuid.str());
+                throw makeStringExceptionV(ROXIE_MISSING_DLL, "Attempting to load workunit %s that hasn't been compiled", wu->queryWuid());
             else
             else
-                throw makeStringExceptionV(ROXIE_MISSING_DLL, "Attempting to load workunit %s with no associated dll", wuid.str());
+                throw makeStringExceptionV(ROXIE_MISSING_DLL, "Attempting to load workunit %s with no associated dll", wu->queryWuid());
         }
         }
         return getQueryDll(dllName.str(), false);
         return getQueryDll(dllName.str(), false);
     }
     }
@@ -1668,8 +1666,7 @@ extern IQueryFactory *createServerQueryFactoryFromWu(IConstWorkUnit *wu)
     Owned<const IQueryDll> dll = createWuQueryDll(wu);
     Owned<const IQueryDll> dll = createWuQueryDll(wu);
     if (!dll)
     if (!dll)
         return NULL;
         return NULL;
-    SCMStringBuffer wuid;
-    return createServerQueryFactory(wu->getWuid(wuid).str(), dll.getClear(), queryRootRoxiePackage(), NULL, true, false); // MORE - if use a constant for id might cache better?
+    return createServerQueryFactory(wu->queryWuid(), dll.getClear(), queryRootRoxiePackage(), NULL, true, false); // MORE - if use a constant for id might cache better?
 }
 }
 
 
 //==============================================================================================================================================
 //==============================================================================================================================================
@@ -1929,8 +1926,7 @@ extern IQueryFactory *createSlaveQueryFactoryFromWu(IConstWorkUnit *wu, unsigned
     Owned<const IQueryDll> dll = createWuQueryDll(wu);
     Owned<const IQueryDll> dll = createWuQueryDll(wu);
     if (!dll)
     if (!dll)
         return NULL;
         return NULL;
-    SCMStringBuffer wuid;
-    return createSlaveQueryFactory(wu->getWuid(wuid).str(), dll.getClear(), queryRootRoxiePackage(), channelNo, NULL, true, false);  // MORE - if use a constant for id might cache better?
+    return createSlaveQueryFactory(wu->queryWuid(), dll.getClear(), queryRootRoxiePackage(), channelNo, NULL, true, false);  // MORE - if use a constant for id might cache better?
 }
 }
 
 
 IRecordLayoutTranslator * createRecordLayoutTranslator(const char *logicalName, IDefRecordMeta const * diskMeta, IDefRecordMeta const * activityMeta)
 IRecordLayoutTranslator * createRecordLayoutTranslator(const char *logicalName, IDefRecordMeta const * diskMeta, IDefRecordMeta const * activityMeta)

+ 0 - 2
roxie/ccd/ccdqueue.cpp

@@ -1033,8 +1033,6 @@ public:
         {
         {
             Owned <IRoxieDaliHelper> daliHelper = connectToDali();
             Owned <IRoxieDaliHelper> daliHelper = connectToDali();
             Owned<IConstWorkUnit> wu = daliHelper->attachWorkunit(logctx.queryWuid(), NULL);
             Owned<IConstWorkUnit> wu = daliHelper->attachWorkunit(logctx.queryWuid(), NULL);
-            SCMStringBuffer target;
-            wu->getClusterName(target);
             queryFactory.setown(createSlaveQueryFactoryFromWu(wu, channel));
             queryFactory.setown(createSlaveQueryFactoryFromWu(wu, channel));
             if (queryFactory)
             if (queryFactory)
                 cacheOnDemandQuery(queryHash, channel, queryFactory);
                 cacheOnDemandQuery(queryHash, channel, queryFactory);

+ 6 - 10
roxie/ccd/ccdserver.cpp

@@ -11003,10 +11003,9 @@ public:
         IConstWorkUnit *workUnit = ctx->queryWorkUnit();
         IConstWorkUnit *workUnit = ctx->queryWorkUnit();
         if (workUnit)
         if (workUnit)
         {
         {
-            SCMStringBuffer owner, wuid, job;
-            fileProps.setProp("@owner", workUnit->getUser(owner).str());
-            fileProps.setProp("@workunit", workUnit->getWuid(wuid).str());
-            fileProps.setProp("@job", workUnit->getJobName(job).str());
+            fileProps.setProp("@owner", workUnit->queryUser());
+            fileProps.setProp("@workunit", workUnit->queryWuid());
+            fileProps.setProp("@job", workUnit->queryJobName());
         }
         }
         if (flags & TDWexpires)
         if (flags & TDWexpires)
             setExpiryTime(fileProps, helper.getExpiryDays());
             setExpiryTime(fileProps, helper.getExpiryDays());
@@ -11556,15 +11555,12 @@ public:
         properties.setProp("@kind", "key");
         properties.setProp("@kind", "key");
         properties.setPropInt64("@size", indexFileSize);
         properties.setPropInt64("@size", indexFileSize);
         properties.setPropInt64("@recordCount", reccount);
         properties.setPropInt64("@recordCount", reccount);
-        SCMStringBuffer info;
         WorkunitUpdate workUnit = ctx->updateWorkUnit();
         WorkunitUpdate workUnit = ctx->updateWorkUnit();
         if (workUnit)
         if (workUnit)
         {
         {
-            properties.setProp("@owner", workUnit->getUser(info).str());
-            info.clear();
-            properties.setProp("@workunit", workUnit->getWuid(info).str());
-            info.clear();
-            properties.setProp("@job", workUnit->getJobName(info).str());
+            properties.setProp("@owner", workUnit->queryUser());
+            properties.setProp("@workunit", workUnit->queryWuid());
+            properties.setProp("@job", workUnit->queryJobName());
         }
         }
         char const * rececl = helper.queryRecordECL();
         char const * rececl = helper.queryRecordECL();
         if(rececl && *rececl)
         if(rececl && *rececl)

+ 7 - 17
thorlcr/graph/thgraphmaster.cpp

@@ -800,10 +800,8 @@ class CThorCodeContextMaster : public CThorCodeContextBase
 
 
     virtual IWorkUnit *updateWorkUnit() const
     virtual IWorkUnit *updateWorkUnit() const
     {
     {
-        StringAttr wuid;
-        workunit->getWuid(StringAttrAdaptor(wuid));
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
         Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
-        return factory->updateWorkUnit(wuid);
+        return factory->updateWorkUnit(workunit->queryWuid());
     }
     }
     IWUResult *updateResult(const char *name, unsigned sequence)
     IWUResult *updateResult(const char *name, unsigned sequence)
     {
     {
@@ -1186,15 +1184,11 @@ public:
     }
     }
     virtual char *getJobName()
     virtual char *getJobName()
     {
     {
-        SCMStringBuffer out;
-        workunit->getJobName(out);
-        return out.s.detach();
+        return strdup(workunit->queryJobName());
     }
     }
     virtual char *getClusterName()
     virtual char *getClusterName()
     {
     {
-        SCMStringBuffer out;
-        workunit->getClusterName(out);
-        return out.s.detach();
+        return strdup(workunit->queryClusterName());
     }
     }
     virtual char *getGroupName()
     virtual char *getGroupName()
     {
     {
@@ -1241,13 +1235,11 @@ void loadPlugin(SafePluginMap *pluginMap, const char *_path, const char *name)
 CJobMaster::CJobMaster(IConstWorkUnit &_workunit, const char *graphName, const char *_querySo, bool _sendSo, const SocketEndpoint &_agentEp)
 CJobMaster::CJobMaster(IConstWorkUnit &_workunit, const char *graphName, const char *_querySo, bool _sendSo, const SocketEndpoint &_agentEp)
     : CJobBase(graphName), workunit(&_workunit), sendSo(_sendSo), agentEp(_agentEp)
     : CJobBase(graphName), workunit(&_workunit), sendSo(_sendSo), agentEp(_agentEp)
 {
 {
-    SCMStringBuffer _token, _wuid, _user, _scope;
-    workunit->getWuid(_wuid);
-    workunit->getUser(_user);
+    SCMStringBuffer _token, _scope;
     workunit->getScope(_scope);
     workunit->getScope(_scope);
     workunit->getSecurityToken(_token);
     workunit->getSecurityToken(_token);
-    wuid.append(_wuid.str());
-    user.append(_user.str());
+    wuid.set(workunit->queryWuid());
+    user.set(workunit->queryUser());
     token.append(_token.str());
     token.append(_token.str());
     scope.append(_scope.str());
     scope.append(_scope.str());
     globalMemorySize = globals->getPropInt("@masterMemorySize", globals->getPropInt("@globalMemorySize")); // in MB
     globalMemorySize = globals->getPropInt("@masterMemorySize", globals->getPropInt("@globalMemorySize")); // in MB
@@ -1611,9 +1603,7 @@ bool CJobMaster::go()
         CWorkunitPauseHandler(CJobMaster &_job, IConstWorkUnit &_wu) : job(_job), wu(_wu)
         CWorkunitPauseHandler(CJobMaster &_job, IConstWorkUnit &_wu) : job(_job), wu(_wu)
         {
         {
             StringBuffer xpath("/WorkUnits/");
             StringBuffer xpath("/WorkUnits/");
-            SCMStringBuffer istr;
-            wu.getWuid(istr);
-            xpath.append(istr.str()).append("/Action");
+            xpath.append(wu.queryWuid()).append("/Action");  // MORE - this should not be done here!
             subId = querySDS().subscribe(xpath.str(), *this, false, true);
             subId = querySDS().subscribe(xpath.str(), *this, false, true);
             subscribed = true;
             subscribed = true;
         }
         }

+ 1 - 3
thorlcr/master/thdemonserver.cpp

@@ -98,11 +98,9 @@ private:
         {
         {
             if (memcmp(graphname,"graph",5)==0)
             if (memcmp(graphname,"graph",5)==0)
                 graphname+=5;
                 graphname+=5;
-            SCMStringBuffer wuid;
-            wu->getWuid(wuid);
             LOG(daliAuditLogCat,",Timing,ThorGraph,%s,%s,%s,%u,1,%d,%s,%s,%s",
             LOG(daliAuditLogCat,",Timing,ThorGraph,%s,%s,%s,%u,1,%d,%s,%s,%s",
                 queryServerStatus().queryProperties()->queryProp("@thorname"),
                 queryServerStatus().queryProperties()->queryProp("@thorname"),
-                wuid.str(),
+                wu->queryWuid(),
                 graphname,
                 graphname,
                 (unsigned)graph.queryGraphId(),
                 (unsigned)graph.queryGraphId(),
                 duration,
                 duration,

+ 10 - 18
thorlcr/master/thgraphmanager.cpp

@@ -527,17 +527,13 @@ void CJobManager::run()
 bool CJobManager::doit(IConstWorkUnit *workunit, const char *graphName, const SocketEndpoint &agentep)
 bool CJobManager::doit(IConstWorkUnit *workunit, const char *graphName, const SocketEndpoint &agentep)
 {
 {
     StringBuffer s;
     StringBuffer s;
-    SCMStringBuffer _wuid;
-    workunit->getWuid(_wuid);
-    const char *wuid = _wuid.str();
-    LOG(MCdebugInfo, thorJob, "Processing wuid=%s, graph=%s from agent: %s", wuid, graphName, agentep.getUrlStr(s).str());
-
-    SCMStringBuffer user;
-    workunit->getUser(user);
+    StringAttr wuid(workunit->queryWuid());
+    StringAttr user(workunit->queryUser());
 
 
+    LOG(MCdebugInfo, thorJob, "Processing wuid=%s, graph=%s from agent: %s", wuid.str(), graphName, agentep.getUrlStr(s).str());
     LOG(daliAuditLogCat,",Progress,Thor,Start,%s,%s,%s,%s,%s,%s",
     LOG(daliAuditLogCat,",Progress,Thor,Start,%s,%s,%s,%s,%s,%s",
             queryServerStatus().queryProperties()->queryProp("@thorname"),
             queryServerStatus().queryProperties()->queryProp("@thorname"),
-            wuid,
+            wuid.str(),
             graphName,
             graphName,
             user.str(),
             user.str(),
             queryServerStatus().queryProperties()->queryProp("@nodeGroup"),
             queryServerStatus().queryProperties()->queryProp("@nodeGroup"),
@@ -551,7 +547,7 @@ bool CJobManager::doit(IConstWorkUnit *workunit, const char *graphName, const So
     catch (IException *_e) { e.setown(_e); }
     catch (IException *_e) { e.setown(_e); }
     LOG(daliAuditLogCat,",Progress,Thor,Stop,%s,%s,%s,%s,%s,%s",
     LOG(daliAuditLogCat,",Progress,Thor,Stop,%s,%s,%s,%s,%s,%s",
             queryServerStatus().queryProperties()->queryProp("@thorname"),
             queryServerStatus().queryProperties()->queryProp("@thorname"),
-            wuid,
+            wuid.str(),
             graphName,
             graphName,
             user.str(),
             user.str(),
             queryServerStatus().queryProperties()->queryProp("@nodeGroup"),
             queryServerStatus().queryProperties()->queryProp("@nodeGroup"),
@@ -591,9 +587,7 @@ void CJobManager::setWuid(const char *wuid, const char *cluster)
 
 
 void CJobManager::replyException(CJobMaster &job, IException *e)
 void CJobManager::replyException(CJobMaster &job, IException *e)
 {
 {
-    SCMStringBuffer wuid;
-    job.queryWorkUnit().getWuid(wuid);
-    reply(&job.queryWorkUnit(), wuid.str(), e, job.queryAgentEp(), false);
+    reply(&job.queryWorkUnit(), job.queryWorkUnit().queryWuid(), e, job.queryAgentEp(), false);
 }
 }
 
 
 void CJobManager::reply(IConstWorkUnit *workunit, const char *wuid, IException *e, const SocketEndpoint &agentep, bool allDone)
 void CJobManager::reply(IConstWorkUnit *workunit, const char *wuid, IException *e, const SocketEndpoint &agentep, bool allDone)
@@ -660,9 +654,8 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName,
         updateWorkUnitLog(*wu);
         updateWorkUnitLog(*wu);
     }
     }
     Owned<IException> exception;
     Owned<IException> exception;
-    SCMStringBuffer wuid;
     workunit.forceReload();
     workunit.forceReload();
-    workunit.getWuid(wuid);
+    StringAttr wuid(workunit.queryWuid());
     const char *totalTimeStr = "Total thor time";
     const char *totalTimeStr = "Total thor time";
     cycle_t startCycles = get_cycles_now();
     cycle_t startCycles = get_cycles_now();
     unsigned __int64 totalTimeNs = 0;
     unsigned __int64 totalTimeNs = 0;
@@ -705,8 +698,8 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName,
         sendSo = globals->getPropBool("Debug/@dllsToSlaves", true);
         sendSo = globals->getPropBool("Debug/@dllsToSlaves", true);
     }
     }
 
 
-    SCMStringBuffer user, eclstr;
-    workunit.getUser(user);
+    SCMStringBuffer eclstr;
+    StringAttr user(workunit.queryUser());
 
 
     PROGLOG("Started wuid=%s, user=%s, graph=%s\n", wuid.str(), user.str(), graphName);
     PROGLOG("Started wuid=%s, user=%s, graph=%s\n", wuid.str(), user.str(), graphName);
 
 
@@ -736,8 +729,7 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName,
             wu->setDebugValue("ThorVersion", version.str(), true);
             wu->setDebugValue("ThorVersion", version.str(), true);
         }
         }
 
 
-        SCMStringBuffer wuid, clusterName;
-        setWuid(workunit.getWuid(wuid).str(), workunit.getClusterName(clusterName).str());
+        setWuid(workunit.queryWuid(), workunit.queryClusterName());
 
 
         allDone = job->go();
         allDone = job->go();
 
 

+ 3 - 4
thorlcr/mfilemanager/thmfilemanager.cpp

@@ -331,10 +331,9 @@ public:
             }
             }
         }
         }
 
 
-        SCMStringBuffer wuidStr, jobStr, userStr;
-        job.queryWorkUnit().getWuid(wuidStr);
-        job.queryWorkUnit().getJobName(jobStr);
-        job.queryWorkUnit().getUser(userStr);
+        StringAttr wuidStr(job.queryWorkUnit().queryWuid());
+        StringAttr userStr(job.queryWorkUnit().queryUser());
+        StringAttr jobStr(job.queryWorkUnit().queryJobName());
         if (overwriteok && (!temporary || job.queryUseCheckpoints()))
         if (overwriteok && (!temporary || job.queryUseCheckpoints()))
         {
         {
             if (!temporary)
             if (!temporary)

+ 5 - 5
tools/swapnode/swapnodelib.cpp

@@ -74,14 +74,14 @@ bool WuResubmit(const char *wuid)
 {
 {
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
     Owned<IWorkUnit> wu = factory->updateWorkUnit(wuid);
     Owned<IWorkUnit> wu = factory->updateWorkUnit(wuid);
-    if (!wu) {
+    if (!wu)
+    {
         ERRLOG("WuResubmit(%s): could not find workunit",wuid);
         ERRLOG("WuResubmit(%s): could not find workunit",wuid);
         return false;
         return false;
     }
     }
-    if (wu->getState()!=WUStateFailed) {
-        SCMStringBuffer state;
-        wu->getStateDesc(state);
-        ERRLOG("WuResubmit(%s): could not resubmit as workunit state is '%s'",wuid,state.str());
+    if (wu->getState()!=WUStateFailed)
+    {
+        ERRLOG("WuResubmit(%s): could not resubmit as workunit state is '%s'", wuid, wu->queryStateDesc());
         return false;
         return false;
     }
     }
     SCMStringBuffer token;
     SCMStringBuffer token;