Browse Source

Merge pull request #4019 from richardkchapman/char-star-returns

HPCC-8556 Refactor const char * query functions from helpers

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>
Gavin Halliday 12 years ago
parent
commit
60c8d47634
67 changed files with 725 additions and 986 deletions
  1. 0 2
      common/commonext/commonext.cpp
  2. 18 19
      common/thorhelper/csvsplitter.cpp
  3. 1 5
      common/thorhelper/thorcommon.cpp
  4. 8 12
      common/thorhelper/thorcommon.hpp
  5. 11 7
      common/thorhelper/thorpipe.cpp
  6. 18 13
      common/thorhelper/thorsoapcall.cpp
  7. 2 62
      ecl/eclagent/eclagent.cpp
  8. 8 3
      ecl/eclagent/eclagent.ipp
  9. 3 4
      ecl/eclagent/eclgraph.cpp
  10. 4 2
      ecl/hqlcpp/hqlcatom.cpp
  11. 2 1
      ecl/hqlcpp/hqlcatom.hpp
  12. 12 12
      ecl/hqlcpp/hqlckey.cpp
  13. 12 13
      ecl/hqlcpp/hqlcpp.cpp
  14. 3 1
      ecl/hqlcpp/hqlcppsys.ecl
  15. 48 52
      ecl/hqlcpp/hqlhtcpp.cpp
  16. 4 4
      ecl/hqlcpp/hqlsource.cpp
  17. 69 97
      ecl/hthor/hthor.cpp
  18. 0 2
      ecl/hthor/hthor.hpp
  19. 0 36
      ecl/hthor/hthor.ipp
  20. 10 9
      ecl/hthor/hthorkey.cpp
  21. 21 10
      roxie/ccd/ccdactivities.cpp
  22. 10 29
      roxie/ccd/ccdcontext.cpp
  23. 0 3
      roxie/ccd/ccdquery.cpp
  24. 97 133
      roxie/ccd/ccdserver.cpp
  25. 0 1
      roxie/ccd/ccdserver.hpp
  26. 24 0
      roxie/roxiemem/roxiemem.cpp
  27. 26 0
      roxie/roxiemem/roxiemem.hpp
  28. 48 81
      rtl/include/eclhelper.hpp
  29. 33 104
      rtl/include/eclhelper_base.hpp
  30. 4 1
      thorlcr/activities/csvread/thcsvrslave.cpp
  31. 12 4
      thorlcr/activities/diskread/thdiskread.cpp
  32. 6 5
      thorlcr/activities/diskwrite/thdiskwrite.cpp
  33. 2 2
      thorlcr/activities/diskwrite/thdwslave.cpp
  34. 3 2
      thorlcr/activities/fetch/thfetch.cpp
  35. 1 1
      thorlcr/activities/fetch/thfetchslave.cpp
  36. 3 2
      thorlcr/activities/hashdistrib/thhashdistrib.cpp
  37. 2 1
      thorlcr/activities/hashdistrib/thhashdistribslave.cpp
  38. 8 4
      thorlcr/activities/indexread/thindexread.cpp
  39. 29 17
      thorlcr/activities/indexwrite/thindexwrite.cpp
  40. 11 4
      thorlcr/activities/indexwrite/thindexwriteslave.cpp
  41. 14 10
      thorlcr/activities/keydiff/thkeydiff.cpp
  42. 8 5
      thorlcr/activities/keydiff/thkeydiffslave.cpp
  43. 5 4
      thorlcr/activities/keyedjoin/thkeyedjoin.cpp
  44. 14 9
      thorlcr/activities/keypatch/thkeypatch.cpp
  45. 8 5
      thorlcr/activities/keypatch/thkeypatchslave.cpp
  46. 5 5
      thorlcr/activities/msort/thmsort.cpp
  47. 10 5
      thorlcr/activities/piperead/thprslave.cpp
  48. 4 1
      thorlcr/activities/pipewrite/thpwslave.cpp
  49. 8 6
      thorlcr/activities/spill/thspill.cpp
  50. 3 79
      thorlcr/activities/temptable/thtmptableslave.cpp
  51. 1 6
      thorlcr/activities/temptable/thtmptableslave.ipp
  52. 32 17
      thorlcr/activities/thdiskbase.cpp
  53. 1 0
      thorlcr/activities/thdiskbase.ipp
  54. 5 4
      thorlcr/activities/wuidread/thwuidread.cpp
  55. 2 1
      thorlcr/activities/xmlparse/thxmlparseslave.cpp
  56. 2 1
      thorlcr/activities/xmlread/thxmlreadslave.cpp
  57. 3 2
      thorlcr/activities/xmlwrite/thxmlwrite.cpp
  58. 5 4
      thorlcr/activities/xmlwrite/thxmlwriteslave.cpp
  59. 0 2
      thorlcr/graph/thgraph.cpp
  60. 2 3
      thorlcr/graph/thgraph.hpp
  61. 3 46
      thorlcr/graph/thgraphmaster.cpp
  62. 0 3
      thorlcr/graph/thgraphslave.cpp
  63. 4 3
      thorlcr/master/thactivitymaster.cpp
  64. 0 4
      thorlcr/slave/slave.cpp
  65. 10 0
      thorlcr/thorcodectx/thcodectx.cpp
  66. 2 0
      thorlcr/thorcodectx/thcodectx.hpp
  67. 1 1
      thorlcr/thorutil/thmem.hpp

+ 0 - 2
common/commonext/commonext.cpp

@@ -58,9 +58,7 @@ MODULE_INIT(INIT_PRIORITY_STANDARD)
     kindArray[TAKworkunitwrite] = "workunitwrite";
     kindArray[TAKfunnel] = "funnel";
     kindArray[TAKapply] = "apply";
-    kindArray[TAKtemptable] = "temptable";
     kindArray[TAKinlinetable] = "inlinetable";
-    kindArray[TAKtemprow] = "temprow";
     kindArray[TAKhashdistribute] = "hashdistribute";
     kindArray[TAKhashdedup] = "hashdedup";
     kindArray[TAKnormalize] = "normalize";

+ 18 - 19
common/thorhelper/csvsplitter.cpp

@@ -26,6 +26,8 @@
 
 #include "csvsplitter.hpp"
 #include "eclrtl.hpp"
+#include "roxiemem.hpp"
+using roxiemem::OwnedRoxieString;
 
 // If you have lines more than 2Mb in length it is more likely to be a bug - so require an explicit override
 #define DEFAULT_CSV_LINE_LENGTH 2048
@@ -103,7 +105,7 @@ void CSVSplitter::init(unsigned _maxColumns, ICsvParameters * csvInfo, const cha
     {
         for (idx=0;;idx++)
         {
-            const char * text = csvInfo->queryQuote(idx);
+            OwnedRoxieString text(csvInfo->getQuote(idx));
             if (!text)
                 break;
             addQuote(text);
@@ -116,7 +118,7 @@ void CSVSplitter::init(unsigned _maxColumns, ICsvParameters * csvInfo, const cha
     {
         for (idx=0;;idx++)
         {
-            const char * text = csvInfo->querySeparator(idx);
+            OwnedRoxieString text(csvInfo->getSeparator(idx));
             if (!text)
                 break;
             addSeparator(text);
@@ -129,27 +131,23 @@ void CSVSplitter::init(unsigned _maxColumns, ICsvParameters * csvInfo, const cha
     {
         for (idx=0;;idx++)
         {
-            const char * text = csvInfo->queryTerminator(idx);
+            OwnedRoxieString text(csvInfo->getTerminator(idx));
             if (!text)
                 break;
             addTerminator(text);
         }
     }
 
-    // Old workunits won't have queryEscape. MORE: deprecate on the next major version
-    if (flags & ICsvParameters::supportsEscape)
+    if (dfsEscapes && (flags & ICsvParameters::defaultEscape))
+        addActionList(matcher, dfsEscapes, ESCAPE);
+    else
     {
-        if (dfsEscapes && (flags & ICsvParameters::defaultEscape))
-            addActionList(matcher, dfsEscapes, ESCAPE);
-        else
+        for (idx=0;;idx++)
         {
-            for (idx=0;;idx++)
-            {
-                const char * text = csvInfo->queryEscape(idx);
-                if (!text)
-                    break;
-                addEscape(text);
-            }
+            OwnedRoxieString text(csvInfo->getEscape(idx));
+            if (!text)
+                break;
+            addEscape(text);
         }
     }
 
@@ -407,10 +405,11 @@ void CSVOutputStream::init(ICsvParameters * args, bool _oldOutputFormat)
 {
     if (args->queryEBCDIC())
         throw MakeStringException(99, "EBCDIC CSV output not yet implemented");
-    quote.set(args->queryQuote(0));
-    separator.set(args->querySeparator(0));
-    terminator.set(args->queryTerminator(0));
-    escape.set(args->queryEscape(0));
+    OwnedRoxieString rs;
+    quote.set(rs.setown(args->getQuote(0)));
+    separator.set(rs.setown(args->getSeparator(0)));
+    terminator.set(rs.setown(args->getTerminator(0)));
+    escape.set(rs.setown(args->getEscape(0)));
     oldOutputFormat = _oldOutputFormat||!quote.length();
 }
 

+ 1 - 5
common/thorhelper/thorcommon.cpp

@@ -637,12 +637,10 @@ extern const char * getActivityText(ThorActivityKind kind)
     case TAKselfjoin:               return "Self Join";
     case TAKkeyedjoin:              return "Keyed Join";
     case TAKgroup:                  return "Group";
-    case TAKworkunitwrite:              return "Output";
+    case TAKworkunitwrite:          return "Output";
     case TAKfunnel:                 return "Funnel";
     case TAKapply:                  return "Apply";
-    case TAKtemptable:              return "Inline Dataset";
     case TAKinlinetable:            return "Inline Dataset";
-    case TAKtemprow:                return "Inline Row";
     case TAKhashdistribute:         return "Hash Distribute";
     case TAKhashdedup:              return "Hash Dedup";
     case TAKnormalize:              return "Normalize";
@@ -797,9 +795,7 @@ extern bool isActivitySource(ThorActivityKind kind)
     switch (kind)
     {
     case TAKpiperead:
-    case TAKtemptable:
     case TAKinlinetable:
-    case TAKtemprow:
     case TAKworkunitread:
     case TAKnull:
     case TAKsideeffect:

+ 8 - 12
common/thorhelper/thorcommon.hpp

@@ -287,18 +287,6 @@ public:
     {
         ctx->executeGraph(graphName, realThor, parentExtractSize, parentExtract);
     }
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize)
-    {
-        return ctx->countDiskFile(lfn, recordSize);
-    }
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg)
-    {
-        return ctx->countIndex(activityId, arg);
-    }
-    virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg)
-    {
-        return ctx->countDiskFile(activityId, arg);
-    }
     virtual char * getExpandLogicalName(const char * logicalName)
     {
         return ctx->getExpandLogicalName(logicalName);
@@ -403,6 +391,14 @@ public:
     {
         return ctx->getRowAllocator(meta, activityId);
     }
+    virtual const char *cloneVString(const char *str) const
+    {
+        return ctx->cloneVString(str);
+    }
+    virtual const char *cloneVString(size32_t len, const char *str) const
+    {
+        return ctx->cloneVString(len, str);
+    }
     virtual void getResultRowset(size32_t & tcount, byte * * & tgt, const char * name, unsigned sequence, IEngineRowAllocator * _rowAllocator, bool isGrouped, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
     {
         ctx->getResultRowset(tcount, tgt, name, sequence, _rowAllocator, isGrouped, xmlTransformer, csvTransformer);

+ 11 - 7
common/thorhelper/thorpipe.cpp

@@ -23,6 +23,9 @@
 #include "csvsplitter.hpp"
 #include "rtlread_imp.hpp"
 #include "rtlds_imp.hpp"
+#include "roxiemem.hpp"
+
+using roxiemem::OwnedRoxieString;
 
 //=====================================================================================================
 
@@ -322,11 +325,12 @@ public:
         if (flags & TPFwritexmltopipe)
         {
             assertex(xmlWriterExtra);
-            const char * path = xmlWriterExtra->queryIteratorPath();
-            if (!path)
+            OwnedRoxieString xmlpath(xmlWriterExtra->getXmlIteratorPath());
+            if (!xmlpath)
                 rowTag.append("Row");
             else
             {
+                const char *path = xmlpath;
                 if (*path == '/') 
                     path++;
                 if (strchr(path, '/')) 
@@ -334,16 +338,16 @@ public:
                 rowTag.append(path);
             }
 
-            //queryHeader/footer can return a tag name, or NULL (indicates to use the default tag), or "" (do not use header/footer)
+            //getHeader/footer can return a tag name, or NULL (indicates to use the default tag), or "" (do not use header/footer)
             if (!(flags & TPFwritenoroot))
             {
-                const char * hdr = xmlWriterExtra->queryHeader();
+                OwnedRoxieString hdr(xmlWriterExtra->getHeader());
                 if (hdr == NULL)
                     header.append("<Dataset>\n");
                 else
                     header.append(hdr);
 
-                const char * ftr = xmlWriterExtra->queryFooter();
+                OwnedRoxieString ftr(xmlWriterExtra->getFooter());
                 if (ftr == NULL) 
                     footer.append("</Dataset>\n");
                 else
@@ -355,7 +359,7 @@ public:
             assertex(csvWriterExtra);
             ICsvParameters * csv = csvWriterExtra->queryCsvParameters(); 
             csvWriter.init(csv, false);
-            const char * hdr = csv->queryHeader();
+            OwnedRoxieString hdr(csv->getHeader());
             if (hdr) 
             {
                 csvWriter.beginLine();
@@ -363,7 +367,7 @@ public:
                 header.append(csvWriter.str());
             }
 
-            const char * ftr = csv->queryFooter();
+            OwnedRoxieString ftr(csv->getFooter());
             if (ftr) 
             {
                 csvWriter.beginLine();

+ 18 - 13
common/thorhelper/thorsoapcall.cpp

@@ -21,13 +21,14 @@
 
 #include "thorxmlread.hpp"
 #include "thorxmlwrite.hpp"
-
 #include "thorcommon.ipp"
 #include "thorsoapcall.hpp"
 
 #include "securesocket.hpp"
-
 #include "eclrtl.hpp"
+#include "roxiemem.hpp"
+
+using roxiemem::OwnedRoxieString;
 
 #ifndef _WIN32
 #include <stdexcept>
@@ -717,6 +718,7 @@ public:
         callHelper = rowProvider->queryCallHelper();  //MORE: This should not be done this way!! Should use extra as below.
         helperExtra = static_cast<IHThorSoapCallExtra*>(helper->selectInterface(TAIsoapcallextra_1));
         flags = helper->getFlags();
+        OwnedRoxieString s;
 
         authToken.append(_authToken);
 
@@ -746,20 +748,20 @@ public:
 
         if (wscType == STsoap)
         {
-            soapaction.set(helper->querySoapAction());
+            soapaction.set(s.setown(helper->getSoapAction()));
             if(soapaction.get() && !isValidHttpValue(soapaction.get()))
                 throw MakeStringException(-1, "SOAPAction value contained illegal characters: %s", soapaction.get());
 
-            httpHeaderName.set(helper->queryHttpHeaderName());
+            httpHeaderName.set(s.setown(helper->getHttpHeaderName()));
             if(httpHeaderName.get() && !isValidHttpValue(httpHeaderName.get()))
                 throw MakeStringException(-1, "HTTPHEADER name contained illegal characters: %s", httpHeaderName.get());
 
-            httpHeaderValue.set(helper->queryHttpHeaderValue());
+            httpHeaderValue.set(s.setown(helper->getHttpHeaderValue()));
             if(httpHeaderValue.get() && !isValidHttpValue(httpHeaderValue.get()))
                 throw MakeStringException(-1, "HTTPHEADER value contained illegal characters: %s", httpHeaderValue.get());
 
             StringAttr proxyAddress;
-            proxyAddress.set(helper->queryProxyAddress());
+            proxyAddress.set(s.setown(helper->getProxyAddress()));
             if (!proxyAddress.isEmpty())
             {
                 UrlListParser proxyUrlListParser(proxyAddress);
@@ -770,11 +772,11 @@ public:
             if ((flags & SOAPFliteral) && (flags & SOAPFencoding))
                 throw MakeStringException(0, "SOAPCALL 'LITERAL' and 'ENCODING' options are mutually exclusive");
 
-            header.set(helper->queryHeader());
-            footer.set(helper->queryFooter());
+            header.set(s.setown(helper->getHeader()));
+            footer.set(s.setown(helper->getFooter()));
             if(flags & SOAPFnamespace)
             {
-                char const * ns = helper->queryNamespaceName();
+                OwnedRoxieString ns = helper->getNamespaceName();
                 if(ns && *ns)
                     xmlnamespace.set(ns);
             }
@@ -789,13 +791,14 @@ public:
 
         if (callHelper)
         {
-            char const * ipath = callHelper->queryInputIteratorPath();
+            OwnedRoxieString iteratorPath(callHelper->getInputIteratorPath());
+            char const * ipath = iteratorPath;
             if(ipath && (*ipath == '/'))
                 ++ipath;
             inputpath.set(ipath);
         }
         
-        service.set(helper->queryService());
+        service.set(s.setown(helper->getService()));
         service.trim();
 
         if (wscType == SThttp)
@@ -803,7 +806,8 @@ public:
             service.toUpperCase();  //GET/PUT/POST
             if (strcmp(service.str(), "GET"))
                 throw MakeStringException(0, "HTTPCALL Only 'GET' service supported");
-            acceptType.set(helper->queryAcceptType());// text/html, text/xml, etc
+            OwnedRoxieString acceptTypeSupplied(helper->getAcceptType()); // text/html, text/xml, etc
+            acceptType.set(acceptTypeSupplied);
             acceptType.trim();
             acceptType.toLowerCase();
         }
@@ -817,7 +821,8 @@ public:
             rowTransformer = NULL;
         }
 
-        UrlListParser urlListParser(helper->queryHosts());
+        OwnedRoxieString hosts(helper->getHosts());
+        UrlListParser urlListParser(hosts);
         if ((numUrls = urlListParser.getUrls(urlArray)) > 0)
         {
             if (wscMode == SCrow)

+ 2 - 62
ecl/eclagent/eclagent.cpp

@@ -50,6 +50,8 @@
 #include "roxiehelper.hpp"
 #include "jlzw.hpp"
 
+using roxiemem::OwnedRoxieString;
+
 #include <new>
 
 #ifdef _USE_CPPUNIT
@@ -1454,27 +1456,6 @@ static unsigned __int64 getFileSize(IFile * file)
     return size;
 }
 
-
-__int64 EclAgent::countDiskFile(const char * name, unsigned recordSize)
-{
-    Owned<ILocalOrDistributedFile> ldFile = resolveLFN(name, "CountDisk");
-
-    offset_t size = 0;
-    Owned<IFileDescriptor> fdesc;
-    if (ldFile)
-    {
-        size = ldFile->getPartFileSize(0);
-        fdesc.setown(ldFile->getFileDescriptor());
-    }
-
-    if(fdesc->isGrouped()) recordSize++; //MORE: if codegen supplied group info, could x-check with dfs, like we do on disk read
-    if (size % recordSize)
-    {
-        failv(0, "Physical file %s has size %"I64F"d which is not a multiple of record size %d", ldFile->queryLogicalName(), size, recordSize);
-    }
-    return size / recordSize;
-}
-
 bool EclAgent::fileExists(const char *name)
 {
     unsigned __int64 size = 0;
@@ -1492,47 +1473,6 @@ void EclAgent::deleteFile(const char * logicalName)
     queryDistributedFileDirectory().removeEntry(logicalName, queryUserDescriptor());
 }
 
-__int64 EclAgent::countIndex(__int64 id, IHThorCountIndexArg & arg)
-{
-    throwUnexpected();
-}
-
-__int64 EclAgent::countDiskFile(__int64 id, IHThorCountFileArg & arg)
-{
-    Owned<IHThorCountFileArg> a = &arg;  // make sure it gets destroyed....
-
-    //MORE: This needs rewriting if it is to be called from a child query, but I expect the
-    //whole activity to be replaced with something else in that case.
-    try
-    {
-        arg.onCreate(queryCodeContext(), NULL, NULL);
-        arg.onStart(NULL, NULL);
-    }
-    catch(IException * e)
-    {
-        throw makeHThorException(TAKcountdisk, (unsigned)id, 0, e);
-    }
-
-    StringBuffer mangled;
-    mangleHelperFileName(mangled, arg.getFileName(), queryWuid(), arg.getFlags());
-    Owned<ILocalOrDistributedFile> ldFile = resolveLFN(mangled, "CountDisk", 0 != (arg.getFlags() & TDRoptional));
-    if (ldFile) 
-    {
-        IRecordSize * rs = arg.queryRecordSize();
-        assertex(rs->isFixedSize());
-        unsigned recordSize = rs->getFixedSize();
-        Owned<IFileDescriptor> fdesc = ldFile->getFileDescriptor();
-        if(fdesc->isGrouped()) recordSize++; //MORE: if codegen supplied group info, could x-check with dfs, like we do on disk read
-        offset_t size  = ldFile->getFileSize();
-        if (size % recordSize)
-        {
-            failv(0, "Physical file %s has size %"I64F"d which is not a multiple of record size %d", ldFile->queryLogicalName(), size, recordSize);
-        }
-        return size / recordSize;
-    }
-    return 0;
-}
-
 char * EclAgent::getExpandLogicalName(const char * logicalName)
 {
     StringBuffer lfn;

+ 8 - 3
ecl/eclagent/eclagent.ipp

@@ -493,8 +493,6 @@ public:
     virtual char *queryIndexMetaData(char const * lfn, char const * xpath);
     virtual void  abort();
 
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize);
-    virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg);
     virtual bool fileExists(const char * filename);
     virtual char * getExpandLogicalName(const char * logicalName);
     virtual void addWuException(const char * text, unsigned code, unsigned severity);
@@ -507,7 +505,6 @@ public:
     virtual void cachePersist(const char * name);
     virtual void decachePersist(const char * name);
     virtual void finishPersist();
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg);
     virtual void clearPersist(const char * logicalName);
     virtual void updatePersist(const char * logicalName, unsigned eclCRC, unsigned __int64 allCRC);
     virtual void checkPersistMatches(const char * logicalName, unsigned eclCRC);
@@ -612,6 +609,14 @@ public:
     {
         return allocatorMetaCache->ensure(meta, activityId);
     }
+    virtual const char *cloneVString(const char *str) const
+    {
+        return rowManager->cloneVString(str);
+    }
+    virtual const char *cloneVString(size32_t len, const char *str) const
+    {
+        return rowManager->cloneVString(len, str);
+    }
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);

+ 3 - 4
ecl/eclagent/eclgraph.cpp

@@ -38,6 +38,8 @@
 #include "commonext.hpp"
 #include "thorcommon.hpp"
 
+using roxiemem::OwnedRoxieString;
+
 //---------------------------------------------------------------------------
 
 static IHThorActivity * createActivity(IAgentContext & agent, unsigned activityId, unsigned subgraphId, unsigned graphId, ThorActivityKind kind, bool isLocal, bool isGrouped, IHThorArg & arg, IPropertyTree * node, EclGraphElement * graphElement)
@@ -104,9 +106,6 @@ static IHThorActivity * createActivity(IAgentContext & agent, unsigned activityI
         return createConcatActivity(agent, activityId, subgraphId, (IHThorFunnelArg &)arg, kind);
     case TAKapply:
         return createApplyActivity(agent, activityId, subgraphId, (IHThorApplyArg &)arg, kind);
-    case TAKtemptable:
-    case TAKtemprow:
-        return createTempTableActivity(agent, activityId, subgraphId, (IHThorTempTableArg &)arg, kind);
     case TAKinlinetable:
         return createInlineTableActivity(agent, activityId, subgraphId, (IHThorInlineTableArg &)arg, kind);
     case TAKnormalize:
@@ -358,7 +357,7 @@ bool EclGraphElement::alreadyUpToDate(IAgentContext & agent)
         throw makeWrappedException(e);
     }
 
-    StringAttr filename;
+    OwnedRoxieString filename;
     unsigned eclCRC;
     unsigned __int64 totalCRC;
     switch (kind)

+ 4 - 2
ecl/hqlcpp/hqlcatom.cpp

@@ -70,6 +70,8 @@ _ATOM clearAtom;
 _ATOM __clearHelperAtom;
 _ATOM clearPersistAtom;
 _ATOM clibExpIdAtom;
+_ATOM cloneVStringAtom;
+_ATOM cloneVStringXAtom;
 _ATOM codeGeneratorAtom;
 _ATOM codepage2UnicodeAtom;
 _ATOM codepage2UnicodeXAtom;
@@ -129,7 +131,6 @@ _ATOM containerAtom;
 _ATOM cosAtom;
 _ATOM coshAtom;
 _ATOM countProviderAtom;
-_ATOM countRoxieDiskFileAtom;
 _ATOM countRowsAtom;
 _ATOM countToSizeAtom;
 _ATOM crcDataAtom;
@@ -791,6 +792,8 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     MAKEATOM(__clearHelper);
     MAKEATOM(clearPersist);
     MAKEID(clibExp);
+    MAKEATOM(cloneVString);
+    MAKEATOM(cloneVStringX);
     MAKEATOM(codeGenerator);
     MAKEATOM(codepage2Unicode);
     MAKEATOM(codepage2UnicodeX);
@@ -850,7 +853,6 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     cosAtom = createAtom("_cos");
     coshAtom = createAtom("_cosh");
     MAKEATOM(countProvider);
-    MAKEATOM(countRoxieDiskFile);
     MAKEATOM(countRows);
     MAKEATOM(countToSize);
     MAKEATOM(crcData);

+ 2 - 1
ecl/hqlcpp/hqlcatom.hpp

@@ -70,6 +70,8 @@ extern _ATOM clearAtom;
 extern _ATOM __clearHelperAtom;
 extern _ATOM clearPersistAtom;
 extern _ATOM clibExpIdAtom;
+extern _ATOM cloneVStringAtom;
+extern _ATOM cloneVStringXAtom;
 extern _ATOM containerAtom;
 extern _ATOM codeGeneratorAtom;
 extern _ATOM codepage2UnicodeAtom;
@@ -129,7 +131,6 @@ extern _ATOM _conditionalRowMarker_Atom;
 extern _ATOM cosAtom;
 extern _ATOM coshAtom;
 extern _ATOM countProviderAtom;
-extern _ATOM countRoxieDiskFileAtom;
 extern _ATOM countRowsAtom;
 extern _ATOM countToSizeAtom;
 extern _ATOM crcDataAtom;

+ 12 - 12
ecl/hqlcpp/hqlckey.cpp

@@ -1573,16 +1573,16 @@ ABoundActivity * HqlCppTranslator::doBuildActivityKeyDiff(BuildCtx & ctx, IHqlEx
     if (flags.length())
         doBuildUnsignedFunction(instance->classctx, "getFlags", flags.str()+1);
 
-    //virtual const char * queryOriginalName() = 0;         // may be null
-    buildRefFilenameFunction(*instance, instance->startctx, "queryOriginalName", original);
+    //virtual const char * getOriginalName() = 0;         // may be null
+    buildRefFilenameFunction(*instance, instance->startctx, "getOriginalName", original);
     noteAllFieldsUsed(original);
 
-    //virtual const char * queryPatchName() = 0;
-    buildRefFilenameFunction(*instance, instance->startctx, "queryUpdatedName", updated);
+    //virtual const char * getUpdatedName() = 0;
+    buildRefFilenameFunction(*instance, instance->startctx, "getUpdatedName", updated);
     noteAllFieldsUsed(updated);
 
-    //virtual const char * queryOutputName() = 0;
-    buildFilenameFunction(*instance, instance->startctx, "queryOutputName", output, hasDynamicFilename(expr));
+    //virtual const char * getOutputName() = 0;
+    buildFilenameFunction(*instance, instance->startctx, "getOutputName", output, hasDynamicFilename(expr));
 
     //virtual int getSequence() = 0;
     doBuildSequenceFunc(instance->classctx, querySequence(expr), false);
@@ -1617,15 +1617,15 @@ ABoundActivity * HqlCppTranslator::doBuildActivityKeyPatch(BuildCtx & ctx, IHqlE
     if (flags.length())
         doBuildUnsignedFunction(instance->classctx, "getFlags", flags.str()+1);
 
-    //virtual const char * queryOriginalName() = 0;
-    buildRefFilenameFunction(*instance, instance->startctx, "queryOriginalName", original);
+    //virtual const char * getOriginalName() = 0;
+    buildRefFilenameFunction(*instance, instance->startctx, "getOriginalName", original);
     noteAllFieldsUsed(original);
 
-    //virtual const char * queryPatchName() = 0;
-    buildFilenameFunction(*instance, instance->startctx, "queryPatchName", patch, true);
+    //virtual const char * getPatchName() = 0;
+    buildFilenameFunction(*instance, instance->startctx, "getPatchName", patch, true);
 
-    //virtual const char * queryOutputName() = 0;
-    buildFilenameFunction(*instance, instance->startctx, "queryOutputName", output, hasDynamicFilename(expr));
+    //virtual const char * getOutputName() = 0;
+    buildFilenameFunction(*instance, instance->startctx, "getOutputName", output, hasDynamicFilename(expr));
 
     //virtual int getSequence() = 0;
     doBuildSequenceFunc(instance->classctx, querySequence(expr), false);

+ 12 - 13
ecl/hqlcpp/hqlcpp.cpp

@@ -3384,19 +3384,18 @@ void HqlCppTranslator::buildReturn(BuildCtx & ctx, IHqlExpression * expr, ITypeI
         {
             if (hasConstModifier(retType))
             {
-                BuildCtx * declareCtx = NULL;
-                if (getInvariantMemberContext(ctx, &declareCtx, NULL, false, false))
-                {
-                    CHqlBoundTarget tempTarget;
-                    createTempFor(*declareCtx, retType, tempTarget, typemod_member, FormatNatural);
-                    buildExprAssign(ctx, tempTarget, expr);
-                    OwnedHqlExpr result = getElementPointer(tempTarget.expr);
-                    ctx.addReturn(result);
-                    return;
-                }
-
-                //we are going to have a memory leak......
-                PrintLog("Runtime memory leak returning allocated string from constant function");
+                _ATOM funcAtom;
+                if (expr->queryType()->getTypeCode()==type_varstring)
+                    funcAtom = cloneVStringAtom;
+                else
+                    funcAtom = cloneVStringXAtom;
+                HqlExprArray args;
+                args.append(*LINK(expr));
+                OwnedHqlExpr call = bindFunctionCall(funcAtom, args);
+                CHqlBoundExpr ret;
+                buildExpr(ctx, call, ret);
+                ctx.addReturn(ret.expr);
+                return;
             }
 
             CHqlBoundTarget retVar;

+ 3 - 1
ecl/hqlcpp/hqlcppsys.ecl

@@ -655,12 +655,14 @@ const char * cppSystemText[]  = {
     "   _linkcounted_ dataset getResultRowset(const varstring stepname, unsigned4 sequence, boolean _allocator, boolean isGrouped, boolean xmltransformer, boolean csvtransformer) : ctxmethod,allocator(false),pure,entrypoint='getResultRowset';",
     "   linkcounted dictionary getResultDictionary(const varstring stepname, unsigned4 sequence, boolean xmltransformer, boolean csvtransformer, boolean hasher) : ctxmethod,pure,entrypoint='getResultDictionary';",
 
+    "   const varstring  cloneVString(const varstring str) : ctxmethod,pure,entrypoint='cloneVString';",
+    "   const varstring  cloneVStringX(const string str) : ctxmethod,pure,entrypoint='cloneVString';",
+
     //Don't make these pure because they may change over time.
     "   boolean isResult(const varstring stepname, unsigned4 sequence) : gctxmethod,entrypoint='isResult';",
     "   boolean fileExists(const varstring lfn) : gctxmethod,entrypoint='fileExists';",
     "   varstring getExpandLogicalName(const varstring lfn) : ctxmethod,entrypoint='getExpandLogicalName';",
     "   deleteFile(const varstring lfn) : gctxmethod,entrypoint='deleteFile';",
-    "   integer8 countRoxieDiskFile(unsigned4 id, boolean monitors) : ctxmethod,entrypoint='countDiskFile';",       // id is actually 8 bytes, for backward compatibility
 
     "   setResultInt(const varstring stepname, unsigned4 sequence, integer8 value) : ctxmethod,entrypoint='setResultInt';",
     "   setResultUInt(const varstring stepname, unsigned4 sequence, unsigned8 value) : ctxmethod,entrypoint='setResultUInt';",

+ 48 - 52
ecl/hqlcpp/hqlhtcpp.cpp

@@ -9300,12 +9300,12 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
         {
             if (header->queryType()->isInteger())
             {
-                classctx.addQuoted("virtual const char * queryHeader() { return NULL; }");
+                classctx.addQuoted("virtual const char * getHeader() { return NULL; }");
                 doBuildUnsignedFunction(classctx, "queryHeaderLen", header);
             }
             else
             {
-                doBuildVarStringFunction(classctx, "queryHeader", header);
+                doBuildVarStringFunction(classctx, "getHeader", header);
                 classctx.addQuoted("virtual unsigned queryHeaderLen() { return 1; }");
             }
         }
@@ -9320,7 +9320,7 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
                 expandDefaultString(names, terminator, "\n");
             }
             OwnedHqlExpr namesExpr = createConstant(names.str());
-            doBuildVarStringFunction(classctx, "queryHeader", namesExpr);
+            doBuildVarStringFunction(classctx, "getHeader", namesExpr);
             classctx.addQuoted("virtual unsigned queryHeaderLen() { return 1; }");
         }
 
@@ -9332,7 +9332,7 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
         else
         {
             if (queryRealChild(headerAttr, 1))
-                doBuildVarStringFunction(classctx, "queryFooter", headerAttr->queryChild(1));
+                doBuildVarStringFunction(classctx, "getFooter", headerAttr->queryChild(1));
             if (headerAttr->hasProperty(singleAtom))
                 singleHeader = true;
             else
@@ -9341,22 +9341,19 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
     }
     else
     {
-        classctx.addQuoted("virtual const char * queryHeader() { return NULL; }");
+        classctx.addQuoted("virtual const char * getHeader() { return NULL; }");
         classctx.addQuoted("virtual unsigned queryHeaderLen() { return 0; }");
     }
 
 
     doBuildSizetFunction(classctx, "queryMaxSize", getCsvMaxLength(csvAttr));
 
-    buildCsvListFunc(classctx, "queryQuote", queryProperty(quoteAtom, attrs), isReading ? "'" : NULL);
-    buildCsvListFunc(classctx, "querySeparator", separator, ",");
-    buildCsvListFunc(classctx, "queryTerminator", terminator, isReading ? "\r\n|\n" : "\n");
-    buildCsvListFunc(classctx, "queryEscape", escape, NULL);
+    buildCsvListFunc(classctx, "getQuote", queryProperty(quoteAtom, attrs), isReading ? "'" : NULL);
+    buildCsvListFunc(classctx, "getSeparator", separator, ",");
+    buildCsvListFunc(classctx, "getTerminator", terminator, isReading ? "\r\n|\n" : "\n");
+    buildCsvListFunc(classctx, "getEscape", escape, NULL);
 
     StringBuffer flags;
-    // Backward compatible option hasEscape should be deprecated in next major version
-    flags.append("|supportsEscape");
-    // Proper flags
     if (!queryProperty(quoteAtom, attrs))       flags.append("|defaultQuote");
     if (!queryProperty(separatorAtom, attrs))   flags.append("|defaultSeparate");
     if (!queryProperty(terminatorAtom, attrs))  flags.append("|defaultTerminate");
@@ -9566,7 +9563,7 @@ void HqlCppTranslator::buildClusterHelper(BuildCtx & ctx, IHqlExpression * expr)
         return;
 
     BuildCtx funcctx(ctx);
-    funcctx.addQuotedCompound("virtual const char * queryCluster(unsigned idx)");
+    funcctx.addQuotedCompound("virtual const char * getCluster(unsigned idx)");
 
     BuildCtx switchctx(funcctx);
     OwnedHqlExpr var = createVariable("idx", LINK(unsignedType));
@@ -10086,12 +10083,12 @@ void HqlCppTranslator::buildXmlWriteMembers(ActivityInstance * instance, IHqlExp
 
     IHqlExpression * rowAttr = xmlAttr->queryProperty(rowAtom);
     if (rowAttr)
-        doBuildVarStringFunction(instance->startctx, "queryIteratorPath", rowAttr->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getXmlIteratorPath", rowAttr->queryChild(0));
     IHqlExpression * headerAttr = xmlAttr->queryProperty(headingAtom);
     if (headerAttr)
     {
-        doBuildVarStringFunction(instance->startctx, "queryHeader", headerAttr->queryChild(0));
-        doBuildVarStringFunction(instance->startctx, "queryFooter", headerAttr->queryChild(1));
+        doBuildVarStringFunction(instance->startctx, "getHeader", headerAttr->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getFooter", headerAttr->queryChild(1));
     }
     StringBuffer xmlFlags;
     if (xmlAttr->hasProperty(trimAtom))
@@ -10218,7 +10215,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
             if (expr->hasProperty(repeatAtom))
             {
                 //virtual const char * getPipeProgram() { return "grep"; }
-                instance->startctx.addQuoted("virtual char * getPipeProgram() { return NULL; }");
+                instance->startctx.addQuoted("virtual const char * getPipeProgram() { return NULL; }");
 
                 BuildCtx pipeCtx(instance->startctx);
                 pipeCtx.addQuotedCompound("virtual char * getNameFromRow(const void * _self)");
@@ -10230,7 +10227,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
             {
                 //virtual const char * getPipeProgram() { return "grep"; }
                 BuildCtx pipeCtx(instance->startctx);
-                pipeCtx.addQuotedCompound("virtual char * getPipeProgram()");
+                pipeCtx.addQuotedCompound("virtual const char * getPipeProgram()");
                 buildReturn(pipeCtx, pipe, unknownVarStringType);
             }
 
@@ -11046,7 +11043,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPipeThrough(BuildCtx & ctx, IH
 
     if (expr->hasProperty(repeatAtom))
     {
-        //virtual char * getPipeProgram() { return "grep"; }
+        //virtual const char * getPipeProgram() { return "grep"; }
         instance->startctx.addQuoted("virtual char * getPipeProgram() { return NULL; }");
 
         BuildCtx pipeCtx(instance->startctx);
@@ -11057,9 +11054,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPipeThrough(BuildCtx & ctx, IH
     }
     else
     {
-        //virtual char * getPipeProgram() { return "grep"; }
+        //virtual const char * getPipeProgram() { return "grep"; }
         BuildCtx pipeCtx(instance->startctx);
-        pipeCtx.addQuotedCompound("virtual char * getPipeProgram()");
+        pipeCtx.addQuotedCompound("virtual const char * getPipeProgram()");
         buildReturn(pipeCtx, pipe, unknownVarStringType);
     }
 
@@ -11095,7 +11092,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPipeThrough(BuildCtx & ctx, IH
     else if (xmlFromPipe)
     {
         doBuildXmlReadMember(*instance, expr, "queryXmlTransformer", usesContents);
-        doBuildVarStringFunction(instance->classctx, "queryXmlIteratorPath", queryPropertyChild(xmlFromPipe, rowAtom, 0));
+        doBuildVarStringFunction(instance->classctx, "getXmlIteratorPath", queryPropertyChild(xmlFromPipe, rowAtom, 0));
     }
 
     StringBuffer flags;
@@ -16012,7 +16009,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
         flags.append("|TAFconstant");
 
     if (method)
-        doBuildVarStringFunction(instance->startctx, "queryAlgorithm", method);
+        doBuildVarStringFunction(instance->startctx, "getAlgorithm", method);
 
     if (!streq(flags.str(), "|TAFconstant"))
         instance->classctx.addQuotedF("virtual unsigned getAlgorithmFlags() { return %s; }", flags.str()+1);
@@ -16085,7 +16082,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityWorkunitRead(BuildCtx & ctx, I
         }
 
         if (wuid)
-            doBuildVarStringFunction(instance->classctx, "queryWUID", wuid->queryChild(0));
+            doBuildVarStringFunction(instance->classctx, "getWUID", wuid->queryChild(0));
 
         bool usesContents = false;
         if (isStored || (targetRoxie() && (sequenceValue >= 0)))
@@ -16152,7 +16149,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityXmlParse(BuildCtx & ctx, IHqlE
     //MORE: What encoding is the search text in???
 
     doBuildParseSearchText(instance->startctx, dataset, expr->queryChild(1), type_utf8, unknownStringType);
-    doBuildVarStringFunction(instance->classctx, "queryIteratorPath", xmlAttr ? queryRealChild(xmlAttr, 0) : NULL);
+    doBuildVarStringFunction(instance->classctx, "getXmlIteratorPath", xmlAttr ? queryRealChild(xmlAttr, 0) : NULL);
 
     BuildCtx funcctx(instance->startctx);
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IColumnProvider * parsed)");
@@ -16532,7 +16529,6 @@ ABoundActivity * HqlCppTranslator::doBuildActivityCountTransform(BuildCtx & ctx,
     IHqlExpression * transform = queryNewColumnProvider(expr);
     IHqlExpression * counter = queryPropertyChild(expr, _countProject_Atom, 0);
 
-    // Overriding IHThorTempTableArg
     Owned<ActivityInstance> instance = new ActivityInstance(*this, ctx, TAKinlinetable, expr, "InlineTable");
     buildActivityFramework(instance);
     buildInstancePrefix(instance);
@@ -16661,11 +16657,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySOAP(BuildCtx & ctx, IHqlExpre
     validateExprScope(instance->startctx, dataset, hosts, opText, "host url");
     validateExprScope(instance->startctx, dataset, service, opText, "service");
 
-    //virtual const char * queryHosts() = 0;
-    doBuildVarStringFunction(instance->startctx, "queryHosts", hosts);
+    //virtual const char * getHosts() = 0;
+    doBuildVarStringFunction(instance->startctx, "getHosts", hosts);
 
-    //virtual const char * queryService() = 0;
-    doBuildVarStringFunction(instance->startctx, "queryService", service);
+    //virtual const char * getService() = 0;
+    doBuildVarStringFunction(instance->startctx, "getService", service);
 
     //virtual void toXML(const byte * self, StringBuffer & out) = 0;
     buildSOAPtoXml(instance->startctx, dataset, expr->queryChild(firstArg+3), selSeq);
@@ -16675,30 +16671,30 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySOAP(BuildCtx & ctx, IHqlExpre
     if (separator)
         doBuildVarStringFunction(instance->startctx, "queryOutputIteratorPath", separator->queryChild(0));
 
-    //virtual const char * queryHeader()
-    //virtual const char * queryFooter()
+    //virtual const char * getHeader()
+    //virtual const char * getFooter()
     IHqlExpression * header = expr->queryProperty(headingAtom);
     if (header)
     {
-        doBuildVarStringFunction(instance->startctx, "queryHeader", header->queryChild(0));
-        doBuildVarStringFunction(instance->startctx, "queryFooter", header->queryChild(1));
+        doBuildVarStringFunction(instance->startctx, "getHeader", header->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getFooter", header->queryChild(1));
     }
 
     IHqlExpression * action = expr->queryProperty(soapActionAtom);
     if (action)
-        doBuildVarStringFunction(instance->startctx, "querySoapAction", action->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getSoapAction", action->queryChild(0));
 
     IHqlExpression * httpHeader = expr->queryProperty(httpHeaderAtom);
     if (httpHeader)
     {
-        doBuildVarStringFunction(instance->startctx, "queryHttpHeaderName", httpHeader->queryChild(0));
-        doBuildVarStringFunction(instance->startctx, "queryHttpHeaderValue", httpHeader->queryChild(1));
+        doBuildVarStringFunction(instance->startctx, "getHttpHeaderName", httpHeader->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getHttpHeaderValue", httpHeader->queryChild(1));
     }
 
     IHqlExpression * proxyAddress = expr->queryProperty(proxyAddressAtom);
     if (proxyAddress)
     {
-        doBuildVarStringFunction(instance->startctx, "queryProxyAddress", proxyAddress->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getProxyAddress", proxyAddress->queryChild(0));
     }
 
     IHqlExpression * namespaceAttr = expr->queryProperty(namespaceAtom);
@@ -16766,9 +16762,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySOAP(BuildCtx & ctx, IHqlExpre
 
     if (namespaceAttr)
     {
-        doBuildVarStringFunction(instance->startctx, "queryNamespaceName", namespaceAttr->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getNamespaceName", namespaceAttr->queryChild(0));
         if (namespaceAttr->queryChild(1))
-            doBuildVarStringFunction(instance->startctx, "queryNamespaceVar", namespaceAttr->queryChild(1));
+            doBuildVarStringFunction(instance->startctx, "getNamespaceVar", namespaceAttr->queryChild(1));
     }
 
     if (logText)
@@ -16791,10 +16787,10 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySOAP(BuildCtx & ctx, IHqlExpre
         if (usesContents)
             throwError(HQLERR_ContentsInSoapCall);
 
-        //virtual const char * queryInputIteratorPath()
+        //virtual const char * getInputIteratorPath()
         IHqlExpression * xpath = expr->queryProperty(xpathAtom);
         if (xpath)
-            doBuildVarStringFunction(instance->classctx, "queryInputIteratorPath", xpath->queryChild(0));
+            doBuildVarStringFunction(instance->classctx, "getInputIteratorPath", xpath->queryChild(0));
 
         IHqlExpression * onFail = expr->queryProperty(onFailAtom);
         if (onFail)
@@ -16840,14 +16836,14 @@ ABoundActivity * HqlCppTranslator::doBuildActivityHTTP(BuildCtx & ctx, IHqlExpre
 
     buildInstancePrefix(instance);
 
-    //virtual const char * queryHosts() = 0;
-    doBuildVarStringFunction(instance->startctx, "queryHosts", expr->queryChild(firstArg));
+    //virtual const char * getHosts() = 0;
+    doBuildVarStringFunction(instance->startctx, "getHosts", expr->queryChild(firstArg));
 
-    //virtual const char * queryService() = 0;
-    doBuildVarStringFunction(instance->startctx, "queryService", expr->queryChild(firstArg+1));
+    //virtual const char * getService() = 0;
+    doBuildVarStringFunction(instance->startctx, "getService", expr->queryChild(firstArg+1));
 
-    //virtual const char * queryAcceptType() = 0;
-    doBuildVarStringFunction(instance->startctx, "queryAcceptType", expr->queryChild(firstArg+2));
+    //virtual const char * getAcceptType() = 0;
+    doBuildVarStringFunction(instance->startctx, "getAcceptType", expr->queryChild(firstArg+2));
 
     //virtual void toXML(const byte * self, StringBuffer & out) = 0;
     buildHTTPtoXml(instance->startctx);
@@ -16917,9 +16913,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivityHTTP(BuildCtx & ctx, IHqlExpre
 
     if (namespaceAttr)
     {
-        doBuildVarStringFunction(instance->startctx, "queryNamespaceName", namespaceAttr->queryChild(0));
+        doBuildVarStringFunction(instance->startctx, "getNamespaceName", namespaceAttr->queryChild(0));
         if (namespaceAttr->queryChild(1))
-            doBuildVarStringFunction(instance->startctx, "queryNamespaceVar", namespaceAttr->queryChild(1));
+            doBuildVarStringFunction(instance->startctx, "getNamespaceVar", namespaceAttr->queryChild(1));
     }
 
     if (logText)
@@ -16937,10 +16933,10 @@ ABoundActivity * HqlCppTranslator::doBuildActivityHTTP(BuildCtx & ctx, IHqlExpre
         if (usesContents)
             throwError(HQLERR_ContentsInSoapCall);
 
-        //virtual const char * queryInputIteratorPath()
+        //virtual const char * getInputIteratorPath()
         IHqlExpression * xpath = expr->queryProperty(xpathAtom);
         if (xpath)
-            doBuildVarStringFunction(instance->classctx, "queryInputIteratorPath", xpath->queryChild(0));
+            doBuildVarStringFunction(instance->classctx, "getInputIteratorPath", xpath->queryChild(0));
 
         IHqlExpression * onFail = expr->queryProperty(onFailAtom);
         if (onFail)

+ 4 - 4
ecl/hqlcpp/hqlsource.cpp

@@ -2776,7 +2776,7 @@ void DiskReadBuilder::buildMembers(IHqlExpression * expr)
         else if (xmlFromPipe)
         {
             translator.doBuildXmlReadMember(*instance, expr, "queryXmlTransformer", usesContents);
-            translator.doBuildVarStringFunction(instance->classctx, "queryXmlIteratorPath", queryPropertyChild(xmlFromPipe, rowAtom, 0));
+            translator.doBuildVarStringFunction(instance->classctx, "getXmlIteratorPath", queryPropertyChild(xmlFromPipe, rowAtom, 0));
         }
         
         StringBuffer flags;
@@ -6984,7 +6984,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityXmlRead(BuildCtx & ctx, IHqlEx
     bool usesContents = false;
     doBuildXmlReadMember(*instance, tableExpr, "queryTransformer", usesContents);
 
-    doBuildVarStringFunction(instance->classctx, "queryIteratorPath", queryRealChild(mode, 0));
+    doBuildVarStringFunction(instance->classctx, "getXmlIteratorPath", queryRealChild(mode, 0));
 
     buildMetaMember(instance->classctx, tableExpr, false, "queryDiskRecordSize");  // A lie, but I don't care....
 
@@ -7106,8 +7106,8 @@ void FetchBuilder::buildMembers(IHqlExpression * expr)
     case no_xml:
         {
             //MORE: MaxLength?
-            // virtual const char * queryIteratorPath()
-            translator.doBuildVarStringFunction(instance->classctx, "queryIteratorPath", queryRealChild(tableExpr->queryChild(2), 0));
+            // virtual const char * getXmlIteratorPath()
+            translator.doBuildVarStringFunction(instance->classctx, "getXmlIteratorPath", queryRealChild(tableExpr->queryChild(2), 0));
             break;
         }
     default:

+ 69 - 97
ecl/hthor/hthor.cpp

@@ -56,6 +56,7 @@ static unsigned const hthorPipeWaitTimeout = 100; //100ms - fairly arbitrary cho
 
 using roxiemem::IRowManager;
 using roxiemem::OwnedRoxieRow;
+using roxiemem::OwnedRoxieString;
 using roxiemem::OwnedConstRoxieRow;
 
 IRowManager * theRowManager;
@@ -308,7 +309,7 @@ ClusterWriteHandler *createClusterWriteHandler(IAgentContext &agent, IHThorIndex
     unsigned clusterIdx = 0;
     while(true)
     {
-        char const * cluster = iwHelper ? iwHelper->queryCluster(clusterIdx++) : dwHelper->queryCluster(clusterIdx++);
+        OwnedRoxieString cluster(iwHelper ? iwHelper->getCluster(clusterIdx++) : dwHelper->getCluster(clusterIdx++));
         if(!cluster)
             break;
         if(!clusterHandler)
@@ -399,7 +400,8 @@ void CHThorDiskWriteActivity::done()
 
 void CHThorDiskWriteActivity::resolve()
 {
-    mangleHelperFileName(mangledHelperFileName, helper.getFileName(), agent.queryWuid(), helper.getFlags());
+    OwnedRoxieString rawname = helper.getFileName();
+    mangleHelperFileName(mangledHelperFileName, rawname, agent.queryWuid(), helper.getFlags());
     assertex(mangledHelperFileName.str());
     if((helper.getFlags() & (TDXtemporary | TDXjobtemp)) == 0)
     {
@@ -805,7 +807,7 @@ CHThorCsvWriteActivity::CHThorCsvWriteActivity(IAgentContext &_agent, unsigned _
 
 void CHThorCsvWriteActivity::execute()
 {
-    const char * header = helper.queryCsvParameters()->queryHeader();
+    OwnedRoxieString header(helper.queryCsvParameters()->getHeader());
     if (header) {
         csvOutput.beginLine();
         csvOutput.writeHeaderLn(strlen(header), header);
@@ -838,7 +840,7 @@ void CHThorCsvWriteActivity::execute()
         numRecords++;
     }
 
-    const char * footer = helper.queryCsvParameters()->queryFooter();
+    OwnedRoxieString footer(helper.queryCsvParameters()->getFooter());
     if (footer) {
         csvOutput.beginLine();
         csvOutput.writeHeaderLn(strlen(footer), footer);
@@ -850,9 +852,10 @@ void CHThorCsvWriteActivity::setFormat(IFileDescriptor * desc)
 {
     // MORE - should call parent's setFormat too?
     ICsvParameters * csvInfo = helper.queryCsvParameters();
+    OwnedRoxieString rs(csvInfo->getSeparator(0));
     StringBuffer separator;
-    const char *s = csvInfo->querySeparator(0);
-    while (*s)
+    const char *s = rs;
+    while (s && *s)
     {
         if (',' == *s)
             separator.append("\\,");
@@ -861,9 +864,9 @@ void CHThorCsvWriteActivity::setFormat(IFileDescriptor * desc)
         ++s;
     }
     desc->queryProperties().setProp("@csvSeparate", separator.str());
-    desc->queryProperties().setProp("@csvQuote", csvInfo->queryQuote(0));
-    desc->queryProperties().setProp("@csvTerminate", csvInfo->queryTerminator(0));
-    desc->queryProperties().setProp("@csvEscape", csvInfo->queryEscape(0));
+    desc->queryProperties().setProp("@csvQuote", rs.setown(csvInfo->getQuote(0)));
+    desc->queryProperties().setProp("@csvTerminate", rs.setown(csvInfo->getTerminator(0)));
+    desc->queryProperties().setProp("@csvEscape", rs.setown(csvInfo->getEscape(0)));
     desc->queryProperties().setProp("@format","utf8n");
 }
 
@@ -871,11 +874,12 @@ void CHThorCsvWriteActivity::setFormat(IFileDescriptor * desc)
 
 CHThorXmlWriteActivity::CHThorXmlWriteActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorXmlWriteArg &_arg, ThorActivityKind _kind) : CHThorDiskWriteActivity(_agent, _activityId, _subgraphId, _arg, _kind), helper(_arg)
 {
-    const char * path = helper.queryIteratorPath();
-    if (!path)
+    OwnedRoxieString xmlpath(helper.getXmlIteratorPath());
+    if (!xmlpath)
         rowTag.append("Row");
     else
     {
+        const char *path = xmlpath;
         if (*path == '/') path++;
         if (strchr(path, '/')) UNIMPLEMENTED;               // more what do we do with /mydata/row
         rowTag.append(path);
@@ -886,7 +890,8 @@ void CHThorXmlWriteActivity::execute()
 {
     // Loop thru the results
     numRecords = 0;
-    const char * header = helper.queryHeader();
+    OwnedRoxieString suppliedHeader(helper.getHeader());
+    const char *header = suppliedHeader;
     if (!header) header = "<Dataset>\n";
     diskout->write(strlen(header), header);
 
@@ -915,7 +920,8 @@ void CHThorXmlWriteActivity::execute()
         diskout->write(xmlOutput.length(), xmlOutput.str());
         numRecords++;
     }
-    const char * footer = helper.queryFooter();
+    OwnedRoxieString suppliedFooter(helper.getFooter());
+    const char *footer = suppliedFooter;
     if (!footer) footer = "</Dataset>\n";
     diskout->write(strlen(footer), footer);
 }
@@ -956,7 +962,8 @@ CHThorIndexWriteActivity::CHThorIndexWriteActivity(IAgentContext &_agent, unsign
 {
     incomplete = false;
     StringBuffer lfn;
-    expandLogicalFilename(lfn, helper.getFileName(), agent.queryWorkUnit(), agent.queryResolveFilesLocally());
+    OwnedRoxieString fname(helper.getFileName());
+    expandLogicalFilename(lfn, fname, agent.queryWorkUnit(), agent.queryResolveFilesLocally());
     if (!agent.queryResolveFilesLocally())
     {
         Owned<IDistributedFile> f = queryDistributedFileDirectory().lookup(lfn, agent.queryCodeContext()->queryUserDescriptor(), true);
@@ -1002,9 +1009,10 @@ void CHThorIndexWriteActivity::execute()
     // Loop thru the results
     unsigned __int64 reccount = 0;
     unsigned __int64 fileSize = 0;
-    if (helper.getDatasetName())
+    OwnedRoxieString dsName(helper.getDatasetName());
+    if (dsName.get())
     {
-        Owned<ILocalOrDistributedFile> ldFile = agent.resolveLFN(helper.getDatasetName(),"IndexWrite::execute",false,false,true);
+        Owned<ILocalOrDistributedFile> ldFile = agent.resolveLFN(dsName,"IndexWrite::execute",false,false,true);
         if (ldFile )
         {
             IDistributedFile * dFile = ldFile->queryDistributedFile();
@@ -1074,7 +1082,8 @@ void CHThorIndexWriteActivity::execute()
             if(sizeLimit && (out->tell() > sizeLimit))
             {
                 StringBuffer msg;
-                msg.append("Exceeded disk write size limit of ").append(sizeLimit).append(" while writing index ").append(helper.getFileName());
+                OwnedRoxieString fname(helper.getFileName());
+                msg.append("Exceeded disk write size limit of ").append(sizeLimit).append(" while writing index ").append(fname);
                 throw MakeStringException(0, "%s", msg.str());
             }
             reccount++;
@@ -1179,7 +1188,8 @@ void CHThorIndexWriteActivity::execute()
     if (!agent.queryResolveFilesLocally())
     {
         dfile.setown(queryDistributedFileDirectory().createNew(desc));
-        expandLogicalFilename(lfn, helper.getFileName(), agent.queryWorkUnit(), agent.queryResolveFilesLocally());
+        OwnedRoxieString fname(helper.getFileName());
+        expandLogicalFilename(lfn, fname, agent.queryWorkUnit(), agent.queryResolveFilesLocally());
         dfile->attach(lfn.str(),agent.queryCodeContext()->queryUserDescriptor());
         agent.logFileAccess(dfile, "HThor", "CREATED");
     }
@@ -1217,9 +1227,15 @@ void CHThorIndexWriteActivity::buildUserMetadata(Owned<IPropertyTree> & metadata
         StringBuffer name(nameLen, nameBuff);
         StringBuffer value(valueLen, valueBuff);
         if(*nameBuff == '_' && strcmp(name, "_nodeSize") != 0)
-            throw MakeStringException(0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), helper.getFileName());
+        {
+            OwnedRoxieString fname(helper.getFileName());
+            throw MakeStringException(0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), fname.get());
+        }
         if(!validateXMLTag(name.str()))
-            throw MakeStringException(0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), helper.getFileName());
+        {
+            OwnedRoxieString fname(helper.getFileName());
+            throw MakeStringException(0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), fname.get());
+        }
         if(!metadata) metadata.setown(createPTree("metadata"));
         metadata->setProp(name.str(), value.str());
     }
@@ -1263,8 +1279,10 @@ public:
         groupSignalled = true; // i.e. don't start with a NULL row
         CHThorSimpleActivityBase::ready();
         rowDeserializer.setown(rowAllocator->createDiskDeserializer(agent.queryCodeContext()));
-        readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), helper.queryXmlIteratorPath(), helper.getPipeFlags()));
-        openPipe(helper.getPipeProgram());
+        OwnedRoxieString xmlIteratorPath(helper.getXmlIteratorPath());
+        readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), xmlIteratorPath, helper.getPipeFlags()));
+        OwnedRoxieString pipeProgram(helper.getPipeProgram());
+        openPipe(pipeProgram);
     }
 
     virtual void done()
@@ -1445,9 +1463,15 @@ public:
         writeTransformer->ready();
 
         if (!readTransformer)
-            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), helper.queryXmlIteratorPath(), helper.getPipeFlags()));
+        {
+            OwnedRoxieString xmlIterator(helper.getXmlIteratorPath());
+            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), xmlIterator, helper.getPipeFlags()));
+        }
         if(!recreate)
-            openPipe(helper.getPipeProgram());
+        {
+            OwnedRoxieString pipeProgram(helper.getPipeProgram());
+            openPipe(pipeProgram);
+        }
         puller.start();
     }
 
@@ -1620,7 +1644,10 @@ public:
         inputExhausted = false;
         writeTransformer->ready();
         if(!recreate)
-            openPipe(helper.getPipeProgram());
+        {
+            OwnedRoxieString pipeProgram(helper.getPipeProgram());
+            openPipe(pipeProgram);
+        }
     }
 
     virtual void execute()
@@ -3671,7 +3698,7 @@ void CHThorGroupSortActivity::createSorter()
     }
     unsigned flags = algo->getAlgorithmFlags();
     sorterIsConst = ((flags & TAFconstant) != 0);
-    char const * algoname = algo->queryAlgorithm();
+    OwnedRoxieString algoname(algo->getAlgorithm());
     if(!algoname)
     {
         if((flags & TAFunstable) != 0)
@@ -3695,7 +3722,7 @@ void CHThorGroupSortActivity::createSorter()
     else
     {
         StringBuffer sb;
-        sb.appendf("Ignoring unsupported sort order algorithm '%s', using default", algoname);
+        sb.appendf("Ignoring unsupported sort order algorithm '%s', using default", algoname.get());
         agent.addWuException(sb.str(),0,ExceptionSeverityWarning,"hthor");
         if((flags & TAFunstable) != 0)
             sorter.setown(new CQuickSorter(helper.queryCompare(), queryRowManager(), InitialSortElements, CommitStep));
@@ -5939,30 +5966,6 @@ void CHThorDictionaryWorkUnitWriteActivity::execute()
 
 //=====================================================================================================
 
-CHThorCountActivity::CHThorCountActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorCountArg &_arg, ThorActivityKind _kind)
- : CHThorActivityBase(_agent, _activityId, _subgraphId, _arg, _kind), helper(_arg)
-{
-}
-
-__int64 CHThorCountActivity::getCount()
-{
-    __int64 count = 0;
-    loop
-    {
-        OwnedConstHThorRow nextrec(input->nextInGroup());
-        if (!nextrec)
-        {
-            nextrec.setown(input->nextInGroup());
-            if (!nextrec)
-                break;
-        }
-        count++;
-    }
-    return count;
-}
-
-//=====================================================================================================
-
 
 CHThorRemoteResultActivity::CHThorRemoteResultActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorRemoteResultArg &_arg, ThorActivityKind _kind)
  : CHThorActivityBase(_agent, _activityId, _subgraphId, _arg, _kind), helper(_arg)
@@ -5988,42 +5991,6 @@ void CHThorRemoteResultActivity::execute()
 
 //=====================================================================================================
 
-/*
- * Deprecated in 3.8, this class is being kept for backward compatibility,
- * since now the code generator is using InlineTables (below) for all
- * temporary tables and rows.
- */
-CHThorTempTableActivity::CHThorTempTableActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorTempTableArg &_arg, ThorActivityKind _kind) :
-                 CHThorSimpleActivityBase(_agent, _activityId, _subgraphId, _arg, _kind), helper(_arg)
-{
-}
-
-void CHThorTempTableActivity::ready()
-{
-    CHThorSimpleActivityBase::ready();
-    curRow = 0;
-    numRows = helper.numRows();
-}
-
-
-const void *CHThorTempTableActivity::nextInGroup()
-{
-    // Filtering empty rows, returns the next valid row
-    while (curRow < numRows)
-    {
-        RtlDynamicRowBuilder rowBuilder(rowAllocator);
-        size32_t size = helper.getRow(rowBuilder, curRow++);
-        if (size)
-        {
-            processed++;
-            return rowBuilder.finalizeRowClear(size);
-        }
-    }
-    return NULL;
-}
-
-//=====================================================================================================
-
 CHThorInlineTableActivity::CHThorInlineTableActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorInlineTableArg &_arg, ThorActivityKind _kind) :
                  CHThorSimpleActivityBase(_agent, _activityId, _subgraphId, _arg, _kind), helper(_arg)
 {
@@ -6635,11 +6602,11 @@ void CHThorWorkunitReadActivity::ready()
     grouped = outputMeta.isGrouped();
     unsigned lenData;
     void * tempData;
-    const char * wuid = helper.queryWUID();
+    OwnedRoxieString fromWuid(helper.getWUID());
     ICsvToRowTransformer * csvTransformer = helper.queryCsvTransformer();
     IXmlToRowTransformer * xmlTransformer = helper.queryXmlTransformer();
-    if (wuid)
-        agent.queryCodeContext()->getExternalResultRaw(lenData, tempData, wuid, helper.queryName(), helper.querySequence(), xmlTransformer, csvTransformer);
+    if (fromWuid)
+        agent.queryCodeContext()->getExternalResultRaw(lenData, tempData, fromWuid, helper.queryName(), helper.querySequence(), xmlTransformer, csvTransformer);
     else
         agent.queryCodeContext()->getResultRaw(lenData, tempData, helper.queryName(), helper.querySequence(), xmlTransformer, csvTransformer);
     resultBuffer.setBuffer(lenData, tempData, true);
@@ -6649,7 +6616,8 @@ void CHThorWorkunitReadActivity::ready()
 void CHThorWorkunitReadActivity::checkForDiskRead()
 {
     StringBuffer diskFilename;
-    if(agent.getWorkunitResultFilename(diskFilename, helper.queryWUID(), helper.queryName(), helper.querySequence()))
+    OwnedRoxieString fromWuid(helper.getWUID());
+    if (agent.getWorkunitResultFilename(diskFilename, fromWuid, helper.queryName(), helper.querySequence()))
     {
         diskreadHelper.setown(createWorkUnitReadArg(diskFilename.str(), &helper));
         try
@@ -7051,7 +7019,8 @@ const void * CHThorXmlParseActivity::nextInGroup()
         }
         size32_t srchLen;
         helper.getSearchText(srchLen, srchStr, in);
-        xmlParser.setown(createXMLParse(srchStr, srchLen, helper.queryIteratorPath(), *this, xr_noRoot, helper.requiresContents()));
+        OwnedRoxieString xmlIteratorPath(helper.getXmlIteratorPath());
+        xmlParser.setown(createXMLParse(srchStr, srchLen, xmlIteratorPath, *this, xr_noRoot, helper.requiresContents()));
     }
 }
 
@@ -7722,7 +7691,8 @@ void CHThorDiskReadBaseActivity::done()
 
 void CHThorDiskReadBaseActivity::resolve()
 {
-    mangleHelperFileName(mangledHelperFileName, helper.getFileName(), agent.queryWuid(), helper.getFlags());
+    OwnedRoxieString fileName(helper.getFileName());
+    mangleHelperFileName(mangledHelperFileName, fileName, agent.queryWuid(), helper.getFlags());
     if (helper.getFlags() & (TDXtemporary | TDXjobtemp))
     {
         StringBuffer mangledFilename;
@@ -8677,7 +8647,10 @@ const void *CHThorCsvReadActivity::nextInGroup()
                 if (thisLineLength < rowSize || avail < rowSize)
                     break;
                 if (rowSize == maxRowSize)
-                    throw MakeStringException(99, "File %s contained a line of length greater than %d bytes.", helper.getFileName(), rowSize);
+                {
+                    OwnedRoxieString fileName(helper.getFileName());
+                    throw MakeStringException(99, "File %s contained a line of length greater than %d bytes.", fileName.get(), rowSize);
+                }
                 if (rowSize >= maxRowSize/2)
                     rowSize = maxRowSize;
                 else
@@ -8856,7 +8829,8 @@ bool CHThorXmlReadActivity::openNext()
         else
             inputfileiostream.setown(createIOStream(inputfileio));
 
-        xmlParser.setown(createXMLParse(*inputfileiostream, helper.queryIteratorPath(), *this, (0 != (TDRxmlnoroot & helper.getFlags()))?xr_noRoot:xr_none, (helper.getFlags() & TDRusexmlcontents) != 0));
+        OwnedRoxieString xmlIterator(helper.getXmlIteratorPath());
+        xmlParser.setown(createXMLParse(*inputfileiostream, xmlIterator, *this, (0 != (TDRxmlnoroot & helper.getFlags()))?xr_noRoot:xr_none, (helper.getFlags() & TDRusexmlcontents) != 0));
         return true;
     }
     return false;
@@ -9860,8 +9834,6 @@ MAKEFACTORY(AllJoin);
 MAKEFACTORY(WorkUnitWrite);
 MAKEFACTORY(DictionaryWorkUnitWrite);
 MAKEFACTORY(FirstN);
-MAKEFACTORY(Count);
-MAKEFACTORY(TempTable);
 MAKEFACTORY(InlineTable);
 MAKEFACTORY_ARG(Concat, Funnel);
 MAKEFACTORY(Apply);

+ 0 - 2
ecl/hthor/hthor.hpp

@@ -106,8 +106,6 @@ extern HTHOR_API IHThorActivity *createAllJoinActivity(IAgentContext &, unsigned
 extern HTHOR_API IHThorActivity *createWorkUnitWriteActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorWorkUnitWriteArg &arg, ThorActivityKind kind);
 extern HTHOR_API IHThorActivity *createDictionaryWorkUnitWriteActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorDictionaryWorkUnitWriteArg &arg, ThorActivityKind kind);
 extern HTHOR_API IHThorActivity *createFirstNActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorFirstNArg &arg, ThorActivityKind kind);
-extern HTHOR_API IHThorActivity *createCountActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorCountArg &arg, ThorActivityKind kind);
-extern HTHOR_API IHThorActivity *createTempTableActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorTempTableArg &arg, ThorActivityKind kind);
 extern HTHOR_API IHThorActivity *createInlineTableActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorInlineTableArg &arg, ThorActivityKind kind);
 extern HTHOR_API IHThorActivity *createConcatActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorFunnelArg &arg, ThorActivityKind kind);
 extern HTHOR_API IHThorActivity *createApplyActivity(IAgentContext &, unsigned _activityId, unsigned _subgraphId, IHThorApplyArg &arg, ThorActivityKind kind);

+ 0 - 36
ecl/hthor/hthor.ipp

@@ -1480,18 +1480,6 @@ public:
     virtual bool needsAllocator() const { return true; }
 };
 
-class CHThorCountActivity : public CHThorActivityBase
-{
-    IHThorCountArg &helper;
-
-public:
-    IMPLEMENT_SINKACTIVITY;
-
-    CHThorCountActivity (IAgentContext &agent, unsigned _activityId, unsigned _subgraphId, IHThorCountArg &_arg, ThorActivityKind _kind);
-    virtual __int64 getCount();
-};
-
-
 class CHThorRemoteResultActivity : public CHThorActivityBase
 {
     IHThorRemoteResultArg &helper;
@@ -1538,30 +1526,6 @@ public:
     virtual void execute();
 };
 
-class CHThorTempTableActivity : public CHThorSimpleActivityBase
-{
-    IHThorTempTableArg &helper;
-    unsigned curRow;
-    unsigned numRows;
-
-public:
-    CHThorTempTableActivity(IAgentContext &agent, unsigned _activityId, unsigned _subgraphId, IHThorTempTableArg &_arg, ThorActivityKind _kind);
-
-    virtual void ready();
-    virtual bool needsAllocator() const { return true; }    
-
-    //interface IHThorInput
-    virtual const void *nextInGroup();
-};
-
-/*
- * This class differ from TempTable (above) by having 64-bit number of rows
- * and, in Thor, it's able to run distributed in the cluster. We, therefore,
- * need to keep consistency and implement it here, too.
- *
- * Some optimisations [ex. NORMALIZE(ds) -> DATASET(COUNT)] will make use of
- * this class, so you can't use TempTables.
- */
 class CHThorInlineTableActivity : public CHThorSimpleActivityBase
 {
     IHThorInlineTableArg &helper;

+ 10 - 9
ecl/hthor/hthorkey.cpp

@@ -33,6 +33,7 @@
 using roxiemem::IRowManager;
 using roxiemem::OwnedRoxieRow;
 using roxiemem::OwnedConstRoxieRow;
+using roxiemem::OwnedRoxieString;
 
 static IKeyIndex *openKeyFile(IDistributedFilePart & keyFile)
 {
@@ -1067,7 +1068,7 @@ IInputSteppingMeta * CHThorIndexReadActivity::querySteppingMeta()
 extern HTHOR_API IHThorActivity *createIndexReadActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorIndexReadArg &arg, ThorActivityKind _kind)
 {
     // A logical filename for the key should refer to a single physical file - either the TLK or a monolithic key
-    const char *lfn = arg.getFileName();
+    OwnedRoxieString lfn(arg.getFileName());
     Owned<ILocalOrDistributedFile> ldFile = _agent.resolveLFN(lfn, "IndexRead", 0 != (arg.getFlags() & TIRoptional));
     Linked<IDistributedFile> dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
     if (!dFile)
@@ -1245,7 +1246,7 @@ const void * CHThorIndexNormalizeActivity::createNextRow()
 extern HTHOR_API IHThorActivity *createIndexNormalizeActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorIndexNormalizeArg &arg, ThorActivityKind _kind)
 {
     // A logical filename for the key should refer to a single physical file - either the TLK or a monolithic key
-    const char *lfn = arg.getFileName();
+    OwnedRoxieString lfn(arg.getFileName());
     Owned<ILocalOrDistributedFile> ldFile = _agent.resolveLFN(lfn, "IndexNormalize", 0 != (arg.getFlags() & TIRoptional),true,true);
     Linked<IDistributedFile> dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
     if (!dFile)
@@ -1363,7 +1364,7 @@ const void *CHThorIndexAggregateActivity::nextInGroup()
 extern HTHOR_API IHThorActivity *createIndexAggregateActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorIndexAggregateArg &arg, ThorActivityKind _kind)
 {
     // A logical filename for the key should refer to a single physical file - either the TLK or a monolithic key
-    const char *lfn = arg.getFileName();
+    OwnedRoxieString lfn(arg.getFileName());
     Owned<ILocalOrDistributedFile> ldFile = _agent.resolveLFN(lfn, "IndexAggregate", 0 != (arg.getFlags() & TIRoptional));
     Linked<IDistributedFile> dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
     if (!dFile)
@@ -1467,7 +1468,7 @@ const void *CHThorIndexCountActivity::nextInGroup()
 extern HTHOR_API IHThorActivity *createIndexCountActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorIndexCountArg &arg, ThorActivityKind _kind)
 {
     // A logical filename for the key should refer to a single physical file - either the TLK or a monolithic key
-    const char *lfn = arg.getFileName();
+    OwnedRoxieString lfn(arg.getFileName());
     Owned<ILocalOrDistributedFile> ldFile = _agent.resolveLFN(lfn, "IndexCount", 0 != (arg.getFlags() & TIRoptional));
     Linked<IDistributedFile> dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
     if (!dFile)
@@ -1577,7 +1578,7 @@ const void *CHThorIndexGroupAggregateActivity::nextInGroup()
 extern HTHOR_API IHThorActivity *createIndexGroupAggregateActivity(IAgentContext &_agent, unsigned _activityId, unsigned _subgraphId, IHThorIndexGroupAggregateArg &arg, ThorActivityKind _kind)
 {
     // A logical filename for the key should refer to a single physical file - either the TLK or a monolithic key
-    const char *lfn = arg.getFileName();
+    OwnedRoxieString lfn(arg.getFileName());
     Owned<ILocalOrDistributedFile> ldFile = _agent.resolveLFN(lfn, "IndexGroupAggregate", 0 != (arg.getFlags() & TIRoptional));
     Linked<IDistributedFile> dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
     if (!dFile)
@@ -2188,8 +2189,8 @@ public:
 
     virtual void start()
     {
-        const char *lfn = fetch.getFileName();
-        if (lfn)
+        OwnedRoxieString lfn(fetch.getFileName());
+        if (lfn.get())
         {
             Owned <ILocalOrDistributedFile> ldFile = agent.resolveLFN(lfn, "Fetch", 0 != (fetch.getFetchFlags() & FFdatafileoptional));
             IDistributedFile * dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
@@ -2448,7 +2449,7 @@ public:
         //reads a record based on the csv information
         ICsvParameters * csvInfo = _arg.queryCsvParameters();
 
-        char const * lfn = fetch.getFileName();
+        OwnedRoxieString lfn(fetch.getFileName());
         Owned<ILocalOrDistributedFile> ldFile = agent.resolveLFN(lfn, "CsvFetch", 0 != (_arg.getFetchFlags() & FFdatafileoptional));
         IDistributedFile * dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
         const char * quotes = NULL;
@@ -3880,7 +3881,7 @@ public:
 
     virtual void start()
     {
-        const char *lfn = helper.getIndexFileName();
+        OwnedRoxieString lfn(helper.getIndexFileName());
         ldFile.setown(agent.resolveLFN(lfn, "KeyedJoin", 0 != (helper.getJoinFlags() & JFindexoptional)));
         dFile = ldFile ? ldFile->queryDistributedFile() : NULL;
         if (dFile)

+ 21 - 10
roxie/ccd/ccdactivities.cpp

@@ -46,6 +46,7 @@ size32_t diskReadBufferSize = 0x10000;
 
 using roxiemem::OwnedRoxieRow;
 using roxiemem::OwnedConstRoxieRow;
+using roxiemem::OwnedRoxieString;
 using roxiemem::IRowManager;
 
 #define maxContinuationSize 48000 // note - must fit in the 2-byte length field... but also needs to be possible to send back from Roxie server->slave in one packet
@@ -358,7 +359,8 @@ protected:
             CDateTime cacheDate(serializedCreate);
             unsigned checksum;
             serializedCreate.read(checksum);
-            varFileInfo.setown(querySlaveDynamicFileCache()->lookupDynamicFile(logctx, queryDynamicFileName(), cacheDate, checksum, &packet->queryHeader(), isOpt, true));
+            OwnedRoxieString fname(queryDynamicFileName());
+            varFileInfo.setown(querySlaveDynamicFileCache()->lookupDynamicFile(logctx, fname, cacheDate, checksum, &packet->queryHeader(), isOpt, true));
             setVariableFileInfo();
         }
     }
@@ -548,9 +550,6 @@ public:
     virtual void executeGraph(const char * graphName, bool realThor, size32_t parentExtractSize, const void * parentExtract) { throwUnexpected(); }
     virtual unsigned __int64 getDatasetHash(const char * name, unsigned __int64 hash)   { throwUnexpected(); return 0; }
 
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize) { throwUnexpected(); }
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg) { throwUnexpected(); }
-    virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg) { throwUnexpected(); }      // only used for roxie...
     virtual char * getExpandLogicalName(const char * logicalName) { throwUnexpected(); }
     virtual void addWuException(const char * text, unsigned code, unsigned severity) { throwUnexpected(); }
     virtual void addWuAssertFailure(unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, bool isAbort) { throwUnexpected(); }
@@ -591,6 +590,14 @@ public:
     {
         return queryContext->queryCodeContext()->getRowAllocator(meta, activityId); 
     }
+    virtual const char *cloneVString(const char *str) const
+    {
+        return queryContext->queryCodeContext()->cloneVString(str);
+    }
+    virtual const char *cloneVString(size32_t len, const char *str) const
+    {
+        return queryContext->queryCodeContext()->cloneVString(len, str);
+    }
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);
@@ -972,7 +979,7 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (helper->getFlags() & TDRoptional) != 0;
-            const char *fileName = helper->getFileName();
+            OwnedRoxieString fileName(helper->getFileName());
             datafile.setown(_queryFactory.queryPackage().lookupFileName(fileName, isOpt, true, _queryFactory.queryWorkUnit()));
             if (datafile)
             {
@@ -1611,7 +1618,8 @@ public:
         unsigned totalSizeSent = 0;
 #endif
         Linked<IXmlToRowTransformer> rowTransformer = helper->queryTransformer();
-        Owned<IXMLParse> xmlParser = createXMLParse(*reader->querySimpleStream(), helper->queryIteratorPath(), *this, (0 != (TDRxmlnoroot & helper->getFlags()))?xr_noRoot:xr_none, (helper->getFlags() & TDRusexmlcontents) != 0);
+        OwnedRoxieString xmlIterator(helper->getXmlIteratorPath());
+        Owned<IXMLParse> xmlParser = createXMLParse(*reader->querySimpleStream(), xmlIterator, *this, (0 != (TDRxmlnoroot & helper->getFlags()))?xr_noRoot:xr_none, (helper->getFlags() & TDRusexmlcontents) != 0);
         while (!aborted)
         {
             //call to next() will callback on the IXmlSelect interface
@@ -3066,7 +3074,8 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (helper->getFlags() & TIRoptional) != 0;
-            datafile.setown(queryFactory.queryPackage().lookupFileName(helper->getFileName(), isOpt, true, queryFactory.queryWorkUnit()));
+            OwnedRoxieString indexName(helper->getFileName());
+            datafile.setown(queryFactory.queryPackage().lookupFileName(indexName, isOpt, true, queryFactory.queryWorkUnit()));
             if (datafile)
                 keyArray.setown(datafile->getKeyArray(activityMeta, layoutTranslators, isOpt, queryFactory.queryChannel(), queryFactory.getEnableFieldTranslation()));
         }
@@ -4262,7 +4271,8 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (fetchContext->getFetchFlags() & FFdatafileoptional) != 0;
-            datafile.setown(_queryFactory.queryPackage().lookupFileName(fetchContext->getFileName(), isOpt, true, _queryFactory.queryWorkUnit()));
+            OwnedRoxieString fname(fetchContext->getFileName());
+            datafile.setown(_queryFactory.queryPackage().lookupFileName(fname, isOpt, true, _queryFactory.queryWorkUnit()));
             if (datafile)
                 fileArray.setown(datafile->getIFileIOArray(isOpt, queryFactory.queryChannel()));
         }
@@ -4610,7 +4620,8 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (helper->getJoinFlags() & JFindexoptional) != 0;
-            datafile.setown(_queryFactory.queryPackage().lookupFileName(helper->getIndexFileName(), isOpt, true, _queryFactory.queryWorkUnit()));
+            OwnedRoxieString indexFileName(helper->getIndexFileName());
+            datafile.setown(_queryFactory.queryPackage().lookupFileName(indexFileName, isOpt, true, _queryFactory.queryWorkUnit()));
             if (datafile)
                 keyArray.setown(datafile->getKeyArray(activityMeta, layoutTranslators, isOpt, queryFactory.queryChannel(), queryFactory.getEnableFieldTranslation()));
         }
@@ -4955,7 +4966,7 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (helper->getFetchFlags() & FFdatafileoptional) != 0;
-            const char *fileName = helper->getFileName();
+            OwnedRoxieString fileName(helper->getFileName());
             datafile.setown(_queryFactory.queryPackage().lookupFileName(fileName, isOpt, true, _queryFactory.queryWorkUnit()));
             if (datafile)
                 fileArray.setown(datafile->getIFileIOArray(isOpt, queryFactory.queryChannel()));

+ 10 - 29
roxie/ccd/ccdcontext.cpp

@@ -1093,28 +1093,6 @@ public:
         totSlavesReplyLen += len;
     }
 
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg)
-    {
-        throwUnexpected();
-    }
-
-    virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg)
-    {
-        Owned<IHThorCountFileArg> a = &arg;  // to make sure it gets released when I am done....
-        Owned<IRoxieServerActivityFactory> f = factory->getRoxieServerActivityFactory((unsigned) activityId);
-        if (f)
-        {
-            Owned<IRoxieServerActivity> fa = f->createFunction(*a.getClear(), NULL);
-            fa->onCreate(this, NULL);
-            fa->start(0, NULL, false);
-            __int64 ret = fa->evaluate();
-            fa->stop(false);
-            fa->reset();
-            return ret;
-        }
-        throwUnexpected();
-    }
-
     virtual const char *loadResource(unsigned id)
     {
         ILoadedDllEntry *dll = factory->queryDll();
@@ -1206,7 +1184,6 @@ public:
     virtual char *getWuid() { throwUnexpected(); }
     virtual void getExternalResultRaw(unsigned & tlen, void * & tgt, const char * wuid, const char * stepname, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer) { throwUnexpected(); }
 
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize) { throwUnexpected(); }
     virtual char * getExpandLogicalName(const char * logicalName) { throwUnexpected(); }
     virtual void addWuException(const char * text, unsigned code, unsigned severity) { throwUnexpected(); }
     virtual void addWuAssertFailure(unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, bool isAbort) { throwUnexpected(); }
@@ -1234,6 +1211,16 @@ public:
         return allocatorMetaCache->ensure(meta, activityId);
     }
 
+    virtual const char *cloneVString(const char *str) const
+    {
+        return rowManager->cloneVString(str);
+    }
+
+    virtual const char *cloneVString(size32_t len, const char *str) const
+    {
+        return rowManager->cloneVString(len, str);
+    }
+
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);
@@ -1670,8 +1657,6 @@ protected:
         }
         throw MakeStringException(ROXIE_DATA_ERROR, "Failed to retrieve data value %s", stepname);
     }
-
-
 };
 
 IRoxieSlaveContext *createSlaveContext(const IQueryFactory *_factory, const SlaveContextLogger &_logctx, unsigned _timeLimit, memsize_t _memoryLimit, IRoxieQueryPacket *packet)
@@ -2883,10 +2868,6 @@ public:
     virtual void checkPersistMatches(const char * logicalName, unsigned eclCRC) { throwUnexpected(); }
     virtual void setWorkflowCondition(bool value) { if(workflow) workflow->setCondition(value); }
     virtual void returnPersistVersion(const char * logicalName, unsigned eclCRC, unsigned __int64 allCRC, bool isFile) { throwUnexpected(); }
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize)
-    {
-        throwUnexpected();
-    }
     virtual void fail(int code, const char *text)
     {
         addWuException(text, code, 2);

+ 0 - 3
roxie/ccd/ccdquery.cpp

@@ -528,9 +528,6 @@ protected:
             return createRoxieServerSplitActivityFactory(id, subgraphId, *this, helperFactory, kind);
         case TAKstreamediterator:
             return createRoxieServerStreamedIteratorActivityFactory(id, subgraphId, *this, helperFactory, kind);
-        case TAKtemptable:
-        case TAKtemprow:
-            return createRoxieServerTempTableActivityFactory(id, subgraphId, *this, helperFactory, kind);
         case TAKinlinetable:
             return createRoxieServerInlineTableActivityFactory(id, subgraphId, *this, helperFactory, kind);
         case TAKthroughaggregate:

+ 97 - 133
roxie/ccd/ccdserver.cpp

@@ -88,6 +88,7 @@ namespace ccdserver_hqlhelper
 #endif
 
 using roxiemem::OwnedRoxieRow;
+using roxiemem::OwnedRoxieString;
 using roxiemem::OwnedConstRoxieRow;
 using roxiemem::IRowManager;
 
@@ -5225,82 +5226,6 @@ IRoxieServerActivityFactory *createRoxieServerDatasetResultActivityFactory(unsig
 
 //=================================================================================
 
-/*
- * Deprecated in 3.8, this class is being kept for backward compatibility,
- * since now the code generator is using InlineTables (below) for all
- * temporary tables and rows.
- */
-class CRoxieServerTempTableActivity : public CRoxieServerActivity
-{
-    IHThorTempTableArg &helper;
-    unsigned curRow;
-    unsigned numRows;
-
-public:
-    CRoxieServerTempTableActivity(const IRoxieServerActivityFactory *_factory, IProbeManager *_probeManager)
-        : CRoxieServerActivity(_factory, _probeManager), helper((IHThorTempTableArg &) basehelper)
-    {
-        curRow = 0;
-    }
-
-    virtual void start(unsigned parentExtractSize, const byte *parentExtract, bool paused)
-    {
-        curRow = 0;
-        CRoxieServerActivity::start(parentExtractSize, parentExtract, paused);
-        numRows = helper.numRows();
-    }
-
-    virtual bool needsAllocator() const { return true; }
-    virtual const void *nextInGroup()
-    {
-        ActivityTimer t(totalCycles, timeActivities, ctx->queryDebugContext());
-        // Filtering empty rows, returns the next valid row
-        while (curRow < numRows)
-        {
-            RtlDynamicRowBuilder rowBuilder(rowAllocator);
-            unsigned outSize = helper.getRow(rowBuilder, curRow++);
-            if (outSize)
-            {
-                processed++;
-                return rowBuilder.finalizeRowClear(outSize);
-            }
-        }
-        return NULL;
-    }
-
-    virtual void setInput(unsigned idx, IRoxieInput *_in)
-    {
-        throw MakeStringException(ROXIE_SET_INPUT, "Internal error: setInput() called for source activity");
-    }
-
-};
-
-class CRoxieServerTempTableActivityFactory : public CRoxieServerActivityFactory
-{
-
-public:
-    CRoxieServerTempTableActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind)
-        : CRoxieServerActivityFactory(_id, _subgraphId, _queryFactory, _helperFactory, _kind)
-    {
-    }
-
-    virtual IRoxieServerActivity *createActivity(IProbeManager *_probeManager) const
-    {
-        return new CRoxieServerTempTableActivity(this, _probeManager);
-    }
-    virtual void setInput(unsigned idx, unsigned source, unsigned sourceidx)
-    {
-        throw MakeStringException(ROXIE_SET_INPUT, "Internal error: setInput() should not be called for TempTable activity");
-    }
-};
-
-IRoxieServerActivityFactory *createRoxieServerTempTableActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind)
-{
-    return new CRoxieServerTempTableActivityFactory(_id, _subgraphId, _queryFactory, _helperFactory, _kind);
-}
-
-//=================================================================================
-
 class CRoxieServerInlineTableActivity : public CRoxieServerActivity
 {
     IHThorInlineTableArg &helper;
@@ -5395,7 +5320,8 @@ public:
     {
         CRoxieServerActivity::start(parentExtractSize, parentExtract, paused);
         IXmlToRowTransformer * xmlTransformer = helper.queryXmlTransformer();
-        if (helper.queryWUID())
+        OwnedRoxieString fromWuid(helper.getWUID());
+        if (fromWuid)
             UNIMPLEMENTED;
         wuReader.setown(ctx->getWorkunitRowReader(helper.queryName(), helper.querySequence(), xmlTransformer, rowAllocator, meta.isGrouped()));
         // MORE _ should that be in onCreate?
@@ -7948,13 +7874,13 @@ public:
             {
                 sorter.clear();
                 IHThorAlgorithm *sortMethod = static_cast<IHThorAlgorithm *>(helper.selectInterface(TAIalgorithm_1));
-                const char *useAlgorithm = sortMethod->queryAlgorithm();
+                OwnedRoxieString useAlgorithm(sortMethod->getAlgorithm());
                 if (useAlgorithm)
                 {
                     if (stricmp(useAlgorithm, "quicksort")==0)
                     {
                         if (sortFlags & TAFstable)
-                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm);
+                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm.get());
                         sorter.setown(new CQuickSortAlgorithm(compare));
                     }
                     else if (stricmp(useAlgorithm, "heapsort")==0)
@@ -7963,7 +7889,7 @@ public:
                         sorter.setown(new CInsertionSortAlgorithm(compare, &ctx->queryRowManager(), activityId));
                     else
                     {
-                        WARNLOG(ROXIE_UNKNOWN_ALGORITHM, "Ignoring unsupported sort order algorithm '%s', using default", useAlgorithm);
+                        WARNLOG(ROXIE_UNKNOWN_ALGORITHM, "Ignoring unsupported sort order algorithm '%s', using default", useAlgorithm.get());
                         if (sortFlags & TAFunstable)
                             sorter.setown(new CQuickSortAlgorithm(compare));
                         else
@@ -8010,19 +7936,19 @@ public:
                 sortAlgorithm = unknownSort;
             else
             {
-                const char *useAlgorithm = sortMethod->queryAlgorithm();
+                OwnedRoxieString useAlgorithm(sortMethod->getAlgorithm());
                 if (useAlgorithm)
                 {
                     if (stricmp(useAlgorithm, "quicksort")==0)
                     {
                         if (sortFlags & TAFstable)
-                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm);
+                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm.get());
                         sortAlgorithm = quickSort;
                     }
                     else if (stricmp(useAlgorithm, "spillingquicksort")==0)
                     {
                         if (sortFlags & TAFstable)
-                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm);
+                            throw MakeStringException(ROXIE_UNKNOWN_ALGORITHM, "Invalid stable sort algorithm %s requested", useAlgorithm.get());
                         sortAlgorithm = spillingQuickSort;
                     }
                     else if (stricmp(useAlgorithm, "heapsort")==0)
@@ -8031,7 +7957,7 @@ public:
                         sortAlgorithm = insertionSort;
                     else
                     {
-                        WARNLOG(ROXIE_UNKNOWN_ALGORITHM, "Ignoring unsupported sort order algorithm '%s', using default", useAlgorithm);
+                        WARNLOG(ROXIE_UNKNOWN_ALGORITHM, "Ignoring unsupported sort order algorithm '%s', using default", useAlgorithm.get());
                         if (sortFlags & TAFunstable)
                             sortAlgorithm = quickSort;
                         else
@@ -8722,8 +8648,12 @@ public:
         groupSignalled = true; // i.e. don't start with a NULL row
         CRoxieServerActivity::start(parentExtractSize, parentExtract, paused);
         if (!readTransformer)
-            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), helper.queryXmlIteratorPath(), helper.getPipeFlags()));
-        openPipe(helper.getPipeProgram());
+        {
+            OwnedRoxieString xmlIteratorPath(helper.getXmlIteratorPath());
+            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), xmlIteratorPath, helper.getPipeFlags()));
+        }
+        OwnedRoxieString pipeProgram(helper.getPipeProgram());
+        openPipe(pipeProgram);
     }
 
     virtual void stop(bool aborting)
@@ -8840,9 +8770,15 @@ public:
         writeTransformer->ready();
         CRoxieServerActivity::start(parentExtractSize, parentExtract, paused);
         if (!readTransformer)
-            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), helper.queryXmlIteratorPath(), helper.getPipeFlags()));
+        {
+            OwnedRoxieString xmlIterator(helper.getXmlIteratorPath());
+            readTransformer.setown(createReadRowStream(rowAllocator, rowDeserializer, helper.queryXmlTransformer(), helper.queryCsvTransformer(), xmlIterator, helper.getPipeFlags()));
+        }
         if(!recreate)
-            openPipe(helper.getPipeProgram());
+        {
+            OwnedRoxieString pipeProgram(helper.getPipeProgram());
+            openPipe(pipeProgram);
+        }
         puller.start(parentExtractSize, parentExtract, paused, 0, false, ctx);  // Pipe does not support preload presently - locks up
     }
 
@@ -9027,7 +8963,10 @@ public:
         writeTransformer->ready();
         CRoxieServerActivity::start(parentExtractSize, parentExtract, paused);
         if(!recreate)
-            openPipe(helper.getPipeProgram());
+        {
+            OwnedRoxieString pipeProgram(helper.getPipeProgram());
+            openPipe(pipeProgram);
+        }
     }
 
     virtual void stop(bool aborting)
@@ -10658,14 +10597,14 @@ protected:
 
     void resolve()
     {
-        const char * rawLogicalName = helper.getFileName();
+        OwnedRoxieString rawLogicalName = helper.getFileName();
         assertex(rawLogicalName);
         assertex((helper.getFlags() & TDXtemporary) == 0);
         StringArray clusters;
         unsigned clusterIdx = 0;
         while(true)
         {
-            char const * cluster = helper.queryCluster(clusterIdx);
+            OwnedRoxieString cluster(helper.getCluster(clusterIdx));
             if(!cluster)
                 break;
             clusters.append(cluster);
@@ -10674,7 +10613,7 @@ protected:
         if (clusters.length())
         {
             if (extend)
-                throw MakeStringException(0, "Cannot combine EXTEND and CLUSTER flags on disk write of file %s", rawLogicalName);
+                throw MakeStringException(0, "Cannot combine EXTEND and CLUSTER flags on disk write of file %s", rawLogicalName.get());
         }
         else
         {
@@ -10880,7 +10819,7 @@ public:
 
     virtual void onExecute() 
     {
-        const char * header = csvHelper.queryCsvParameters()->queryHeader();
+        OwnedRoxieString header(csvHelper.queryCsvParameters()->getHeader());
         if (header) 
         {
             csvOutput.beginLine();
@@ -10903,7 +10842,7 @@ public:
             diskout->write(csvOutput.length(), csvOutput.str());
             ReleaseRoxieRow(nextrec);
         }
-        const char * footer = csvHelper.queryCsvParameters()->queryFooter();
+        OwnedRoxieString footer(csvHelper.queryCsvParameters()->getFooter());
         if (footer) 
         {
             csvOutput.beginLine();
@@ -10920,8 +10859,9 @@ public:
 
         ICsvParameters *csvParameters = csvHelper.queryCsvParameters();
         StringBuffer separator;
-        const char *s = csvParameters->querySeparator(0);
-        while (*s)
+        OwnedRoxieString rs(csvParameters->getSeparator(0));
+        const char *s = rs;
+        while (s &&  *s)
         {
             if (',' == *s)
                 separator.append("\\,");
@@ -10930,9 +10870,9 @@ public:
             ++s;
         }
         props.setProp("@csvSeparate", separator.str());
-        props.setProp("@csvQuote", csvParameters->queryQuote(0));
-        props.setProp("@csvTerminate", csvParameters->queryTerminator(0));
-        props.setProp("@csvEscape", csvParameters->queryEscape(0));
+        props.setProp("@csvQuote", rs.setown(csvParameters->getQuote(0)));
+        props.setProp("@csvTerminate", rs.setown(csvParameters->getTerminator(0)));
+        props.setProp("@csvEscape", rs.setown(csvParameters->getEscape(0)));
     }
 
     virtual bool isOutputTransformed() const { return true; }
@@ -10953,11 +10893,12 @@ public:
     virtual void start(unsigned parentExtractSize, const byte *parentExtract, bool paused)
     {
         CRoxieServerDiskWriteActivity::start(parentExtractSize, parentExtract, paused);
-        const char * path = xmlHelper.queryIteratorPath();
-        if (!path)
+        OwnedRoxieString xmlpath(xmlHelper.getXmlIteratorPath());
+        if (!xmlpath)
             rowTag.set("Row");
         else
         {
+            const char *path = xmlpath;
             if (*path == '/') path++;
             if (strchr(path, '/')) UNIMPLEMENTED;               // more what do we do with /mydata/row
             rowTag.set(path);
@@ -10966,7 +10907,8 @@ public:
 
     virtual void onExecute() 
     {
-        const char * header = xmlHelper.queryHeader();
+        OwnedRoxieString suppliedHeader(xmlHelper.getHeader());
+        const char *header = suppliedHeader;
         if (!header) header = "<Dataset>\n";
         diskout->write(strlen(header), header);
         CommonXmlWriter xmlOutput(xmlHelper.getXmlFlags());
@@ -10985,7 +10927,8 @@ public:
             xmlOutput.outputEndNested(rowTag);
             diskout->write(xmlOutput.length(), xmlOutput.str());
         }
-        const char * footer = xmlHelper.queryFooter();
+        OwnedRoxieString suppliedFooter(xmlHelper.getFooter());
+        const char * footer = suppliedFooter;
         if (!footer) footer = "</Dataset>\n";
         diskout->write(strlen(footer), footer);
     }
@@ -11092,7 +11035,7 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity,
         unsigned clusterIdx = 0;
         while(true)
         {
-            char const * cluster = helper.queryCluster(clusterIdx);
+            OwnedRoxieString cluster(helper.getCluster(clusterIdx));
             if(!cluster)
                 break;
             clusters.append(cluster);
@@ -11103,7 +11046,8 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity,
             clusters.append(roxieName.str());
         else
             clusters.append(".");
-        writer.setown(ctx->createLFN(helper.getFileName(), overwrite, false, clusters)); // MORE - if there's a workunit, use if for scope.
+        OwnedRoxieString fname(helper.getFileName());
+        writer.setown(ctx->createLFN(fname, overwrite, false, clusters)); // MORE - if there's a workunit, use if for scope.
         filename.set(writer->queryFile()->queryFilename());
         if (writer->queryFile()->exists())
         {
@@ -11129,9 +11073,15 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity,
             StringBuffer name(nameLen, nameBuff);
             StringBuffer value(valueLen, valueBuff);
             if(*nameBuff == '_' && strcmp(name, "_nodeSize") != 0)
-                throw MakeStringException(0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), helper.getFileName());
+            {
+                OwnedRoxieString fname(helper.getFileName());
+                throw MakeStringException(0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), fname.get());
+            }
             if(!validateXMLTag(name.str()))
-                throw MakeStringException(0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), helper.getFileName());
+            {
+                OwnedRoxieString fname(helper.getFileName());
+                throw MakeStringException(0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), fname.get());
+            }
             if(!metadata)
                 metadata.setown(createPTree("metadata"));
             metadata->setProp(name.str(), value.str());
@@ -11188,9 +11138,10 @@ public:
 
         unsigned __int64 fileSize = 0;
         fileCrc = -1;
-        if (helper.getDatasetName())
+        OwnedRoxieString dsName(helper.getFileName());
+        if (dsName.get())
         {
-            Owned<const IResolvedFile> dsFileInfo = resolveLFN(helper.getFileName(), false);
+            Owned<const IResolvedFile> dsFileInfo = resolveLFN(dsName, false);
             if (dsFileInfo)
             {
                 fileSize = dsFileInfo->getFileSize();
@@ -19592,7 +19543,8 @@ public:
             }
             size32_t srchLen;
             helper.getSearchText(srchLen, srchStr, in);
-            xmlParser.setown(createXMLParse(srchStr, srchLen, helper.queryIteratorPath(), *this));
+            OwnedRoxieString xmlIteratorPath(helper.getXmlIteratorPath());
+            xmlParser.setown(createXMLParse(srchStr, srchLen, xmlIteratorPath, *this));
         }   
     }
 
@@ -19705,7 +19657,8 @@ public:
         {
             if (variableFileName)
             {
-                varFileInfo.setown(resolveLFN(helper.getFileName(), isOpt));
+                OwnedRoxieString fileName(helper.getFileName());
+                varFileInfo.setown(resolveLFN(fileName, isOpt));
                 Owned<IFilePartMap> map = varFileInfo->getFileMap();
                 if (map)
                     numParts = map->getNumParts();
@@ -20035,7 +19988,8 @@ public:
         {
             rowTransformer.set(readHelper->queryTransformer());
             assertex(reader != NULL);
-            xmlParser.setown(createXMLParse(*reader->querySimpleStream(), readHelper->queryIteratorPath(), *this, (0 != (TDRxmlnoroot & readHelper->getFlags()))?xr_noRoot:xr_none, (readHelper->getFlags() & TDRusexmlcontents) != 0));
+            OwnedRoxieString xmlIterator(readHelper->getXmlIteratorPath());
+            xmlParser.setown(createXMLParse(*reader->querySimpleStream(), xmlIterator, *this, (0 != (TDRxmlnoroot & readHelper->getFlags()))?xr_noRoot:xr_none, (readHelper->getFlags() & TDRusexmlcontents) != 0));
         }
     }
 
@@ -20699,7 +20653,7 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (helper->getFlags() & TDRoptional) != 0;
-            const char *fileName = helper->getFileName();
+            OwnedRoxieString fileName(helper->getFileName());
             datafile.setown(_queryFactory.queryPackage().lookupFileName(fileName, isOpt, true, _queryFactory.queryWorkUnit()));
             if (datafile)
                 map.setown(datafile->getFileMap());
@@ -20795,7 +20749,8 @@ protected:
 
     void setVariableFileInfo()
     {
-        varFileInfo.setown(resolveLFN(indexHelper.getFileName(), isOpt));
+        OwnedRoxieString indexName(indexHelper.getFileName());
+        varFileInfo.setown(resolveLFN(indexName, isOpt));
         translators.setown(new TranslatorArray) ;
         keySet.setown(varFileInfo->getKeyArray(factory->queryActivityMeta(), translators, isOpt, isLocal ? factory->queryQueryFactory().queryChannel() : 0, factory->queryQueryFactory().getEnableFieldTranslation()));
         variableInfoPending = false;
@@ -21422,7 +21377,8 @@ class CRoxieServerSimpleIndexReadActivity : public CRoxieServerActivity, impleme
 
     void setVariableFileInfo()
     {
-        varFileInfo.setown(resolveLFN(indexHelper.getFileName(), isOpt));
+        OwnedRoxieString indexName(indexHelper.getFileName());
+        varFileInfo.setown(resolveLFN(indexName, isOpt));
         translators.setown(new TranslatorArray) ;
         keySet.setown(varFileInfo->getKeyArray(factory->queryActivityMeta(), translators, isOpt, isLocal ? factory->queryQueryFactory().queryChannel() : 0, factory->queryQueryFactory().getEnableFieldTranslation()));
         initKeySet();
@@ -21800,7 +21756,8 @@ public:
         if (!variableFileName)
         {
             bool isOpt = (flags & TIRoptional) != 0;
-            indexfile.setown(queryFactory.queryPackage().lookupFileName(indexHelper->getFileName(), isOpt, true, queryFactory.queryWorkUnit()));
+            OwnedRoxieString indexName(indexHelper->getFileName());
+            indexfile.setown(queryFactory.queryPackage().lookupFileName(indexName, isOpt, true, queryFactory.queryWorkUnit()));
             if (indexfile)
                 keySet.setown(indexfile->getKeyArray(activityMeta, translatorArray, isOpt, isLocal ? queryFactory.queryChannel() : 0, enableFieldTranslation));
         }
@@ -22682,7 +22639,8 @@ public:
         bool isOpt = (helper.getFlags() & TDRoptional) != 0;
         unsigned recsize = helper.queryRecordSize()->getFixedSize();
         assertex(recsize);
-        Owned<const IResolvedFile> varFileInfo = resolveLFN(helper.getFileName(), isOpt);
+        OwnedRoxieString fname(helper.getFileName());
+        Owned<const IResolvedFile> varFileInfo = resolveLFN(fname, isOpt);
         return varFileInfo->getFileSize() / recsize; 
     }
 
@@ -22715,12 +22673,12 @@ public:
         {
             unsigned recsize = helper->queryRecordSize()->getFixedSize();
             assertex(recsize);
-            const char *fileName = helper->getFileName();
+            OwnedRoxieString fileName(helper->getFileName());
             bool isOpt = (helper->getFlags() & TDRoptional) != 0;
             datafile.setown(queryFactory.queryPackage().lookupFileName(fileName, isOpt, true, queryFactory.queryWorkUnit()));
             offset_t filesize = datafile ? datafile->getFileSize() : 0;
             if (filesize % recsize != 0)
-                throw MakeStringException(ROXIE_MISMATCH, "Record size mismatch for file %s - %"I64F"d is not a multiple of fixed record size %d", fileName, filesize, recsize);
+                throw MakeStringException(ROXIE_MISMATCH, "Record size mismatch for file %s - %"I64F"d is not a multiple of fixed record size %d", fileName.get(), filesize, recsize);
             answer = filesize / recsize; 
         }
         else
@@ -22812,7 +22770,8 @@ public:
         remote.setLimits(helper.getRowLimit(), (unsigned __int64) -1, I64C(0x7FFFFFFFFFFFFFFF));
         if (variableFileName)
         {
-            varFileInfo.setown(resolveLFN(fetchContext->getFileName(), isOpt));
+            OwnedRoxieString fname(fetchContext->getFileName());
+            varFileInfo.setown(resolveLFN(fname, isOpt));
             map.setown(varFileInfo->getFileMap());
         }
         puller.start(parentExtractSize, parentExtract, paused, ctx->fetchPreload(), false, ctx);
@@ -22931,7 +22890,8 @@ public:
         variableFileName = (fetchContext->getFetchFlags() & (FFvarfilename|FFdynamicfilename)) != 0;
         if (!variableFileName)
         {
-            datafile.setown(_queryFactory.queryPackage().lookupFileName(fetchContext->getFileName(),
+            OwnedRoxieString fname(fetchContext->getFileName());
+            datafile.setown(_queryFactory.queryPackage().lookupFileName(fname,
                                                                         (fetchContext->getFetchFlags() & FFdatafileoptional) != 0,
                                                                         true,
                                                                         _queryFactory.queryWorkUnit()));
@@ -23493,7 +23453,8 @@ public:
         }
         else if (variableIndexFileName)
         {
-            varFileInfo.setown(resolveLFN(helper.getIndexFileName(), false));
+            OwnedRoxieString indexFileName(helper.getIndexFileName());
+            varFileInfo.setown(resolveLFN(indexFileName, false));
             translators.setown(new TranslatorArray);
             keySet.setown(varFileInfo->getKeyArray(factory->queryActivityMeta(), translators, false, isLocal ? factory->queryQueryFactory().queryChannel() : 0, factory->queryQueryFactory().getEnableFieldTranslation())); // MORE - isLocal?
         }
@@ -24148,7 +24109,8 @@ public:
         CRoxieServerKeyedJoinBase::start(parentExtractSize, parentExtract, paused);
         if (variableFetchFileName)
         {
-            varFetchFileInfo.setown(resolveLFN(helper.getFileName(), false));
+            OwnedRoxieString fname(helper.getFileName());
+            varFetchFileInfo.setown(resolveLFN(fname, false));
             map.setown(varFetchFileInfo->getFileMap());
         }
         puller.start(parentExtractSize, parentExtract, paused, ctx->keyedJoinPreload(), false, ctx);
@@ -24281,7 +24243,8 @@ public:
         }
         else if (variableIndexFileName)
         {
-            varFileInfo.setown(resolveLFN(helper.getIndexFileName(), false));
+            OwnedRoxieString indexFileName(helper.getIndexFileName());
+            varFileInfo.setown(resolveLFN(indexFileName, false));
             translators.setown(new TranslatorArray);
             keySet.setown(varFileInfo->getKeyArray(factory->queryActivityMeta(), translators, false, isLocal ? factory->queryQueryFactory().queryChannel() : 0, factory->queryQueryFactory().getEnableFieldTranslation())); 
         }
@@ -24502,7 +24465,8 @@ public:
         if (!variableIndexFileName)
         {
             bool isOpt = (joinFlags & JFindexoptional) != 0;
-            indexfile.setown(queryFactory.queryPackage().lookupFileName(helper->getIndexFileName(), isOpt, true, queryFactory.queryWorkUnit()));
+            OwnedRoxieString indexFileName(helper->getIndexFileName());
+            indexfile.setown(queryFactory.queryPackage().lookupFileName(indexFileName, isOpt, true, queryFactory.queryWorkUnit()));
             if (indexfile)
                 keySet.setown(indexfile->getKeyArray(activityMeta, translatorArray, isOpt, isLocal ? queryFactory.queryChannel() : 0, enableFieldTranslation));
         }
@@ -25854,7 +25818,7 @@ public:
         return &testMeta; 
     }
     virtual unsigned getAlgorithmFlags() { return TAFunstable; }
-    virtual const char * queryAlgorithm() { return sortAlgorithm; }
+    virtual const char * getAlgorithm() { return sortAlgorithm; }
 };
 extern "C" IHThorArg * sortActivityTestFactory() { return new SortActivityTest; }
 
@@ -25908,12 +25872,12 @@ struct PrefetchProjectActivityTest : public ccdserver_hqlhelper::CThorPrefetchPr
 };
 extern "C" IHThorArg * prefetchProjectActivityTestFactory() { return new PrefetchProjectActivityTest; }
 
-struct TempTableActivityTest : public ccdserver_hqlhelper::CThorTempTableArg {
-    virtual IOutputMetaData * queryOutputMeta() 
+struct InlineTableActivityTest : public ccdserver_hqlhelper::CThorInlineTableArg {
+    virtual IOutputMetaData * queryOutputMeta()
     {
-        return &testMeta; 
+        return &testMeta;
     }
-    virtual size32_t getRow(ARowBuilder & _self, unsigned row) {
+    virtual size32_t getRow(ARowBuilder & _self, __uint64 row) {
         unsigned char * self = (unsigned char *) _self.getSelf();
         switch (row) {
             case 0: {
@@ -25923,11 +25887,11 @@ struct TempTableActivityTest : public ccdserver_hqlhelper::CThorTempTableArg {
         }
         return 0;
     }
-    virtual unsigned numRows() {
+    virtual __uint64 numRows() {
         return 1;
     }
 };
-extern "C" IHThorArg * tempTableActivityTestFactory() { return new TempTableActivityTest; }
+extern "C" IHThorArg * inlineTableActivityTestFactory() { return new InlineTableActivityTest; }
 
 struct SelectNActivityTest : public ccdserver_hqlhelper::CThorSelectNArg {
     virtual IOutputMetaData * queryOutputMeta() 
@@ -26271,7 +26235,7 @@ protected:
         init();
         Owned <IRoxieServerActivityFactory> factory = createRoxieServerPrefetchProjectActivityFactory(1, 1, *queryFactory, prefetchProjectActivityTestFactory, TAKprefetchproject);
         Owned<ActivityArray> childGraph = new ActivityArray(false, false, false, false);
-        IRoxieServerActivityFactory *ttf = createRoxieServerTempTableActivityFactory(2, 1, *queryFactory, tempTableActivityTestFactory, TAKtemptable);
+        IRoxieServerActivityFactory *ttf = createRoxieServerInlineTableActivityFactory(2, 1, *queryFactory, inlineTableActivityTestFactory, TAKinlinetable);
         IRoxieServerActivityFactory *snf = createRoxieServerSelectNActivityFactory(3, 1, *queryFactory, selectNActivityTestFactory, TAKselectn);
         IRoxieServerActivityFactory *lrf = createRoxieServerLocalResultWriteActivityFactory(4, 1, *queryFactory, localResultActivityTestFactory, TAKlocalresultwrite, 0, 8, true);
         childGraph->append(*ttf);

+ 0 - 1
roxie/ccd/ccdserver.hpp

@@ -324,7 +324,6 @@ extern IRoxieServerActivityFactory *createRoxieServerNewChildAggregateActivityFa
 extern IRoxieServerActivityFactory *createRoxieServerNewChildGroupAggregateActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind);
 extern IRoxieServerActivityFactory *createRoxieServerNewChildThroughNormalizeActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind);
 extern IRoxieServerActivityFactory *createRoxieServerDatasetResultActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind, bool _isRoot);
-extern IRoxieServerActivityFactory *createRoxieServerTempTableActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind);
 extern IRoxieServerActivityFactory *createRoxieServerInlineTableActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind);
 extern IRoxieServerActivityFactory *createRoxieServerWorkUnitReadActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind);
 extern IRoxieServerActivityFactory *createRoxieServerLocalResultReadActivityFactory(unsigned _id, unsigned _subgraphId, IQueryFactory &_queryFactory, HelperFactory *_helperFactory, ThorActivityKind _kind, unsigned graphId);

+ 24 - 0
roxie/roxiemem/roxiemem.cpp

@@ -2370,6 +2370,30 @@ public:
         return normalHeap.doAllocate(activityId);
     }
 
+    virtual const char *cloneVString(size32_t len, const char *str)
+    {
+        if (str)
+        {
+            char *ret = (char *) allocate(len+1, 0);
+            memcpy(ret, str, len);
+            ret[len] = 0;
+            return (const char *) ret;
+        }
+        else
+        {
+            assertex(len==0);
+            return NULL;
+        }
+    }
+
+    virtual const char *cloneVString(const char *str)
+    {
+        if (str)
+            return cloneVString(strlen(str), str);
+        else
+            return NULL;
+    }
+
     virtual void setMemoryLimit(memsize_t bytes, memsize_t spillSize)
     {
         memsize_t systemMemoryLimit = getTotalMemoryLimit();

+ 26 - 0
roxie/roxiemem/roxiemem.hpp

@@ -333,6 +333,30 @@ private:
     void * ptr;
 };
 
+class OwnedRoxieString
+{
+public:
+    inline OwnedRoxieString()                               { ptr = NULL; }
+    inline OwnedRoxieString(const char * _ptr)             { ptr = _ptr; }
+    inline OwnedRoxieString(const OwnedRoxieString & other) { ptr = other.getLink(); }
+
+    inline ~OwnedRoxieString() { ReleaseRoxieRow(ptr); }
+
+    inline operator const char *() const { return ptr; }
+    inline const char * get() const { return ptr; }
+    inline const char * getLink() const { LinkRoxieRow(ptr); return ptr; }
+    inline const char * set(const char * _ptr) { const char * temp = ptr; if (_ptr) LinkRoxieRow(_ptr); ptr = _ptr; ReleaseRoxieRow(temp); return ptr; }
+    inline const char * setown(const char * _ptr) { const char * temp = ptr; ptr = _ptr; ReleaseRoxieRow(temp); return ptr; }
+
+private:
+    /* Disable use of some constructs that often cause memory leaks by creating private members */
+    void operator = (const void * _ptr)              {  }
+    void operator = (const OwnedRoxieString & other) { }
+    void setown(const OwnedRoxieString &other) {  }
+
+private:
+    const char * ptr;
+};
 
 interface IFixedRowHeap : extends IInterface
 {
@@ -378,6 +402,8 @@ interface IRowResizeCallback
 interface IRowManager : extends IInterface
 {
     virtual void *allocate(memsize_t size, unsigned activityId) = 0;
+    virtual const char *cloneVString(const char *str) = 0;
+    virtual const char *cloneVString(size32_t len, const char *str) = 0;
     virtual void resizeRow(void * original, memsize_t copysize, memsize_t newsize, unsigned activityId, IRowResizeCallback & callback) = 0;
     virtual void resizeRow(memsize_t & capacity, void * & original, memsize_t copysize, memsize_t newsize, unsigned activityId) = 0;
     virtual void *finalizeRow(void *final, memsize_t originalSize, memsize_t finalSize, unsigned activityId) = 0;

+ 48 - 81
rtl/include/eclhelper.hpp

@@ -21,6 +21,15 @@
 /*
 This file contains interface definitions for the meta-information, dataset processing an activities.
 It should only contain pure interface definitions or inline functions.
+
+A note on naming conventions:
+  getXXX implies that the returned value should be released by the caller
+  queryXXX implies that it should not
+
+Methods named getXXX returning const char * from generated code will return a value that MAY need releasing (via roxiemem)
+or that may be constants. Callers should always call roxiemem::ReleaseRoxieRow on the returned value - this will do nothing
+if the supplied pointer was not from the roxiemem heap. Usually an OwnedRoxieString is the easiest way to achieve this.
+
 */
 
 #include "jscm.hpp"
@@ -453,7 +462,6 @@ protected:
 
 interface IXmlToRowTransformer;
 interface ICsvToRowTransformer;
-interface IHThorCountIndexArg;
 interface IHThorCountFileArg;
 interface IThorDiskCallback;
 interface IThorIndexCallback;
@@ -557,10 +565,6 @@ interface ICodeContext : public IResourceContext
 
     // File resolution etc
 
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize) = 0;
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg) = 0;
-    virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg) = 0;        // only used for roxie...
-
     virtual char * getExpandLogicalName(const char * logicalName) = 0;
     virtual unsigned __int64 getFileOffset(const char *logicalPart) = 0;
     virtual char *getFilePart(const char *logicalPart, bool create=false) = 0; // caller frees return string.
@@ -583,6 +587,8 @@ interface ICodeContext : public IResourceContext
     // Memory management
 
     virtual IEngineRowAllocator * getRowAllocator(IOutputMetaData * meta, unsigned activityId) const = 0;
+    virtual const char * cloneVString(const char *str) const = 0;
+    virtual const char * cloneVString(size32_t len, const char *str) const = 0;
 
     // Called from generated code for FROMXML/TOXML
 
@@ -697,7 +703,6 @@ enum ThorActivityKind
     TAKworkunitwrite,
     TAKfunnel,
     TAKapply,
-    TAKtemptable,
     TAKhashdistribute,
     TAKhashdedup,
     TAKnormalize,
@@ -825,7 +830,6 @@ enum ThorActivityKind
     TAKlinkedrawiterator,
     TAKnormalizelinkedchild,
     TAKfilterproject,
-    TAKtemprow,
     TAKdiskexists,              // non-grouped count of dataset (not child), (may filter input)
     TAKindexexists,
     TAKchildexists,
@@ -860,7 +864,6 @@ enum ActivityInterfaceEnum
     TAIarg,
     TAIpipereadarg_1,
     TAIindexwritearg_1,
-    TAIcountarg_1,
     TAIfirstnarg_1,
     TAIchoosesetsarg_1,
     TAIchoosesetsexarg_1,
@@ -891,7 +894,6 @@ enum ActivityInterfaceEnum
     TAIthroughaggregateextra_1,
     TAIdistributionarg_1,
     TAIhashaggregateextra_1,
-    TAItemptablearg_1,
     TAIsamplearg_1,
     TAIentharg_1,
     TAIfunnelarg_1,
@@ -906,7 +908,6 @@ enum ActivityInterfaceEnum
     TAIalljoinarg_1,
     TAIhashjoinextra_1,
     TAIkeyeddistributearg_1,
-    TAIcountindexarg_1,
     TAIcountfilearg_1,
     TAIbinfetchextra_1,
     TAIworkunitwritearg_1,
@@ -1137,17 +1138,13 @@ struct IHThorIndexWriteArg : public IHThorArg
     virtual unsigned getExpiryDays() = 0;
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC) = 0;
     virtual unsigned getFormatCrc() = 0;
-    virtual const char * queryCluster(unsigned idx) = 0;        // result only valid until next call.
+    virtual const char * getCluster(unsigned idx) = 0;
     virtual bool getIndexLayout(size32_t & _retLen, void * & _retData) = 0;
     virtual bool getIndexMeta(size32_t & lenName, char * & name, size32_t & lenValue, char * & value, unsigned idx) = 0;
     virtual unsigned getWidth() = 0;                // only guaranteed present if TIWhaswidth defined
     virtual ICompare * queryCompare() = 0;          // only guaranteed present if TIWhaswidth defined
 };
 
-struct IHThorCountArg : public IHThorArg
-{
-};
-
 struct IHThorFirstNArg : public IHThorArg
 {
     virtual __int64 getLimit() = 0;
@@ -1182,7 +1179,7 @@ struct IHThorDiskWriteArg : public IHThorArg
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC) = 0;
     virtual void getEncryptKey(size32_t & keyLen, void * & key) = 0;
     virtual unsigned getFormatCrc() = 0;
-    virtual const char * queryCluster(unsigned idx) = 0;        // result only valid until next call.
+    virtual const char * getCluster(unsigned idx) = 0;
 };
 
 struct IHThorFilterArg : public IHThorArg
@@ -1439,20 +1436,6 @@ struct IHThorHashAggregateArg : public IHThorAggregateArg, public IHThorHashAggr
     COMMON_NEWTHOR_FUNCTIONS
 };
 
-/*
- * This class has been deprecated in 3.8 in favour of IHThorInlineTableArg.
- * CThorTempRowArg also now derives from IHThorInlineTableArg.
- *
- * As of 3.8, only old code will implement this interface.
- */
-struct IHThorTempTableArg : public IHThorArg
-{
-    virtual size32_t getRow(ARowBuilder & rowBuilder, unsigned row) = 0;
-    virtual unsigned numRows() = 0;
-    virtual bool isConstant()                           { return true; }    // deprecated in favour of getFlags
-    virtual size32_t getRowSingle(ARowBuilder & rowBuilder) = 0;            // deprecated, TempRow derives from InlineTable
-};
-
 struct IHThorInlineTableArg : public IHThorArg
 {
     virtual size32_t getRow(ARowBuilder & rowBuilder, __uint64 row) = 0;
@@ -1531,7 +1514,7 @@ struct IHThorSortArg : public IHThorArg
 struct IHThorAlgorithm : public IInterface
 {
     virtual unsigned getAlgorithmFlags() = 0;
-    virtual const char * queryAlgorithm() = 0;
+    virtual const char * getAlgorithm() = 0;
 };
 
 typedef IHThorSortArg IHThorSortedArg;
@@ -1757,18 +1740,6 @@ struct IHThorKeyedDistributeArg : public IHThorArg
 };
 
 
-struct IHThorCountIndexArg : public IHThorArg
-{
-    // Inside the indexRead remote activity:
-    virtual const char * getIndexFileName() = 0;
-    virtual IOutputMetaData * queryIndexRecordSize() = 0; //Excluding fpos and sequence
-    virtual void createSegmentMonitors(IIndexReadContext *ctx) = 0;
-    virtual bool hasPostFilter() { return false; };
-    virtual size32_t isValid(const void * src, unsigned __int64 _fpos, IBlobProvider * blobs) { return true; }
-    virtual void extractLookupFields() {}
-    virtual bool canMatchAny()                              { return true; }
-};
-
 struct IHThorCountFileArg : public IHThorArg
 {
     virtual const char * getFileName() = 0;
@@ -1883,9 +1854,9 @@ enum
 struct IHThorKeyDiffArg : public IHThorArg
 {
     virtual unsigned getFlags() = 0;
-    virtual const char * queryOriginalName() = 0;
-    virtual const char * queryUpdatedName() = 0;
-    virtual const char * queryOutputName() = 0;
+    virtual const char * getOriginalName() = 0;
+    virtual const char * getUpdatedName() = 0;
+    virtual const char * getOutputName() = 0;
     virtual int getSequence() = 0;
     virtual unsigned getExpiryDays() = 0;
 };
@@ -1893,9 +1864,9 @@ struct IHThorKeyDiffArg : public IHThorArg
 struct IHThorKeyPatchArg : public IHThorArg
 {
     virtual unsigned getFlags() = 0;
-    virtual const char * queryOriginalName() = 0;           // may be null
-    virtual const char * queryPatchName() = 0;
-    virtual const char * queryOutputName() = 0;
+    virtual const char * getOriginalName() = 0;           // may be null
+    virtual const char * getPatchName() = 0;
+    virtual const char * getOutputName() = 0;
     virtual int getSequence() = 0;
     virtual unsigned getExpiryDays() = 0;
 };
@@ -1909,7 +1880,7 @@ struct IHThorWorkunitReadArg : public IHThorArg
 {
     virtual const char * queryName() = 0;
     virtual int querySequence() = 0;
-    virtual const char * queryWUID() = 0;
+    virtual const char * getWUID() = 0;
     virtual ICsvToRowTransformer * queryCsvTransformer() = 0;
     virtual IXmlToRowTransformer * queryXmlTransformer() = 0;
 };
@@ -1950,18 +1921,17 @@ struct ICsvParameters
         preserveWhitespace =  0x0020,
         manyHeaderFooter =    0x0040,
         defaultEscape =       0x0080,
-        supportsEscape =      0x0100, // MORE: deprecate on next major version
     }; // flags values
     virtual unsigned     getFlags() = 0;
     virtual bool         queryEBCDIC() = 0;
-    virtual const char * queryHeader()              { return NULL; }
+    virtual const char * getHeader()              { return NULL; }
     virtual unsigned     queryHeaderLen() = 0;
     virtual size32_t     queryMaxSize() = 0;
-    virtual const char * queryQuote(unsigned idx) = 0;
-    virtual const char * querySeparator(unsigned idx) = 0;
-    virtual const char * queryTerminator(unsigned idx) = 0;
-    virtual const char * queryEscape(unsigned idx) = 0;
-    virtual const char * queryFooter()              { return NULL; }
+    virtual const char * getQuote(unsigned idx) = 0;
+    virtual const char * getSeparator(unsigned idx) = 0;
+    virtual const char * getTerminator(unsigned idx) = 0;
+    virtual const char * getEscape(unsigned idx) = 0;
+    virtual const char * getFooter()              { return NULL; }
 };
 
 struct ITypedOutputStream
@@ -2005,7 +1975,7 @@ struct IHThorCsvFetchArg : public IHThorFetchBaseArg, public IHThorFetchContext,
 struct IHThorXmlParseArg : public IHThorArg
 {
     virtual size32_t transform(ARowBuilder & rowBuilder, const void * left, IColumnProvider * parsed) = 0;
-    virtual const char * queryIteratorPath() = 0;
+    virtual const char * getXmlIteratorPath() = 0;
     virtual void getSearchText(size32_t & retLen, char * & retText, const void * _self) = 0;
     virtual bool searchTextNeedsFree() = 0;
     virtual bool requiresContents() { return false; }
@@ -2014,7 +1984,6 @@ struct IHThorXmlParseArg : public IHThorArg
 struct IHThorXmlFetchExtra : public IInterface
 {
     virtual size32_t transform(ARowBuilder & rowBuilder, IColumnProvider * rowLeft, const void * right, unsigned __int64 _fpos) = 0;
-    virtual const char * queryIteratorPath() = 0;               // required so that xpaths to extract data are correct
     virtual bool requiresContents() { return false; }
 };
 
@@ -2027,9 +1996,9 @@ struct IHThorXmlFetchArg : public IHThorFetchBaseArg, public IHThorFetchContext,
 struct IHThorXmlWriteExtra : public IInterface
 {
     virtual void toXML(const byte * self, IXmlWriter & out) = 0;
-    virtual const char * queryIteratorPath()           { return NULL; }             // supplies the prefix and suffix for a row
-    virtual const char * queryHeader()                 { return NULL; }
-    virtual const char * queryFooter()                 { return NULL; }
+    virtual const char * getXmlIteratorPath()         { return NULL; }             // supplies the prefix and suffix for a row
+    virtual const char * getHeader()                   { return NULL; }
+    virtual const char * getFooter()                   { return NULL; }
     virtual unsigned getXmlFlags()                     { return 0; }
 };
 
@@ -2064,12 +2033,12 @@ struct IHThorPipeReadArg : public IHThorArg
     virtual unsigned getPipeFlags() = 0;
     virtual ICsvToRowTransformer * queryCsvTransformer() = 0;
     virtual IXmlToRowTransformer * queryXmlTransformer() = 0;
-    virtual const char * queryXmlIteratorPath() = 0;
+    virtual const char * getXmlIteratorPath() = 0;
 };
 
 struct IHThorPipeWriteArg : public IHThorArg
 {
-    virtual char * getPipeProgram() = 0;
+    virtual const char * getPipeProgram() = 0;
     virtual int getSequence() = 0;
     virtual IOutputMetaData * queryDiskRecordSize() = 0;
     virtual char * getNameFromRow(const void * _self)       { return NULL; }
@@ -2081,7 +2050,7 @@ struct IHThorPipeWriteArg : public IHThorArg
 
 struct IHThorPipeThroughArg : public IHThorArg
 {
-    virtual char * getPipeProgram() = 0;
+    virtual const char * getPipeProgram() = 0;
     virtual char * getNameFromRow(const void * _self)       { return NULL; }
     virtual bool recreateEachRow()                          { return false; }
     virtual unsigned getPipeFlags() = 0;
@@ -2089,7 +2058,7 @@ struct IHThorPipeThroughArg : public IHThorArg
     virtual IHThorXmlWriteExtra * queryXmlOutput() = 0;
     virtual ICsvToRowTransformer * queryCsvTransformer() = 0;
     virtual IXmlToRowTransformer * queryXmlTransformer() = 0;
-    virtual const char * queryXmlIteratorPath() = 0;
+    virtual const char * getXmlIteratorPath() = 0;
 };
 
 
@@ -2111,28 +2080,26 @@ enum
 
 struct IHThorWebServiceCallActionArg : public IHThorArg
 {
-    virtual const char * queryHosts() = 0;
-    virtual const char * queryService() = 0;
+    virtual const char * getHosts() = 0;
+    virtual const char * getService() = 0;
 
 //writing to the soap service.
     virtual void toXML(const byte * self, IXmlWriter & out) = 0;
-    virtual const char * queryHeader()                  { return NULL; }
-    virtual const char * queryFooter()                  { return NULL; }
+    virtual const char * getHeader()                  { return NULL; }
+    virtual const char * getFooter()                  { return NULL; }
     virtual unsigned getFlags() = 0;
     virtual unsigned numParallelThreads()               { return 0; }
     virtual unsigned numRecordsPerBatch()               { return 0; }
-    virtual const char * queryUserName()                { return NULL; }
-    virtual const char * queryPassword()                { return NULL; }
     virtual int numRetries()                             { return -1; }
     virtual double getTimeout()                         { return (double)-1.0; }
     virtual double getTimeLimit()                       { return (double)0.0; }
-    virtual const char * querySoapAction()              { return NULL; }
-    virtual const char * queryNamespaceName()           { return NULL; }
-    virtual const char * queryNamespaceVar()            { return NULL; }
-    virtual const char * queryHttpHeaderName()          { return NULL; }
-    virtual const char * queryHttpHeaderValue()         { return NULL; }
-    virtual const char * queryProxyAddress()            { return NULL; }
-    virtual const char * queryAcceptType()              { return NULL; }
+    virtual const char * getSoapAction()              { return NULL; }
+    virtual const char * getNamespaceName()           { return NULL; }
+    virtual const char * getNamespaceVar()            { return NULL; }
+    virtual const char * getHttpHeaderName()          { return NULL; }
+    virtual const char * getHttpHeaderValue()         { return NULL; }
+    virtual const char * getProxyAddress()            { return NULL; }
+    virtual const char * getAcceptType()              { return NULL; }
 };
 typedef IHThorWebServiceCallActionArg IHThorSoapActionArg ;
 typedef IHThorWebServiceCallActionArg IHThorHttpActionArg ;
@@ -2141,7 +2108,7 @@ typedef IHThorWebServiceCallActionArg IHThorHttpActionArg ;
 struct IHThorWebServiceCallExtra : public IInterface
 {
     virtual IXmlToRowTransformer * queryInputTransformer() = 0;
-    virtual const char * queryInputIteratorPath()       { return NULL; }
+    virtual const char * getInputIteratorPath()       { return NULL; }
     virtual size32_t onFailTransform(ARowBuilder & rowBuilder, const void * left, IException * e) { return 0; }
     virtual void getLogText(size32_t & lenText, char * & text, const void * left) = 0;  // iff SOAPFlogusermsg set
 };
@@ -2456,7 +2423,7 @@ struct IHThorCsvReadArg: public IHThorDiskReadBaseArg
 struct IHThorXmlReadArg: public IHThorDiskReadBaseArg
 {
     virtual IXmlToRowTransformer * queryTransformer() = 0;
-    virtual const char * queryIteratorPath() = 0;
+    virtual const char * getXmlIteratorPath() = 0;
     virtual unsigned __int64 getChooseNLimit() = 0;
     virtual unsigned __int64 getRowLimit() = 0;
     virtual void onLimitExceeded() = 0;

+ 33 - 104
rtl/include/eclhelper_base.hpp

@@ -345,34 +345,13 @@ public:
     virtual unsigned getExpiryDays()                        { return 0; }
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC)  { }
     virtual unsigned getFormatCrc() = 0;
-    virtual const char * queryCluster(unsigned idx) { return NULL; }
+    virtual const char * getCluster(unsigned idx) { return NULL; }
     virtual bool getIndexLayout(size32_t & _retLen, void * & _retData) { return false; }
     virtual bool getIndexMeta(size32_t & lenName, char * & name, size32_t & lenValue, char * & value, unsigned idx) { return false; }
     virtual unsigned getWidth() { return 0; }
     virtual ICompare * queryCompare() { return NULL; }
 };
 
-//I don't think this is ever used....
-class CThorCountArg : public CThorArg, implements IHThorCountArg
-{
-    virtual void Link() const { RtlCInterface::Link(); }
-    virtual bool Release() const { return RtlCInterface::Release(); }
-    virtual IOutputMetaData * queryOutputMeta() { return NULL; }
-    virtual void onCreate(ICodeContext * _ctx, IHThorArg *, MemoryBuffer * in) { ctx = _ctx; }
-
-
-    virtual IInterface * selectInterface(ActivityInterfaceEnum which)                       
-    { 
-        switch (which)
-        {
-        case TAIarg:
-        case TAIcountarg_1:
-            return static_cast<IHThorCountArg *>(this);
-        }
-        return NULL;
-    }
-};
-
 class CThorFirstNArg : public CThorArg, implements IHThorFirstNArg
 {
     virtual void Link() const { RtlCInterface::Link(); }
@@ -454,7 +433,7 @@ class CThorDiskWriteArg : public CThorArg, implements IHThorDiskWriteArg
     virtual unsigned getExpiryDays()                        { return 0; }
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC)  { }
     virtual void getEncryptKey(size32_t & keyLen, void * & key) { keyLen = 0; key = 0; }
-    virtual const char * queryCluster(unsigned idx)         { return NULL; }
+    virtual const char * getCluster(unsigned idx)         { return NULL; }
 };
 
 class CThorPipeReadArg : public CThorArg, implements IHThorPipeReadArg
@@ -480,7 +459,7 @@ public:
     virtual unsigned getPipeFlags()                         { return 0; }
     virtual ICsvToRowTransformer * queryCsvTransformer()    { return NULL; }
     virtual IXmlToRowTransformer * queryXmlTransformer()    { return NULL; }
-    virtual const char * queryXmlIteratorPath()             { return NULL; }
+    virtual const char * getXmlIteratorPath()             { return NULL; }
 };
 
 class CThorPipeWriteArg : public CThorArg, implements IHThorPipeWriteArg
@@ -534,7 +513,7 @@ public:
     virtual IHThorXmlWriteExtra * queryXmlOutput()          { return NULL; }
     virtual ICsvToRowTransformer * queryCsvTransformer()    { return NULL; }
     virtual IXmlToRowTransformer * queryXmlTransformer()    { return NULL; }
-    virtual const char * queryXmlIteratorPath()             { return NULL; }
+    virtual const char * getXmlIteratorPath()             { return NULL; }
 };
 
 
@@ -1017,7 +996,7 @@ class CThorSpillArg : public CThorArg, implements IHThorSpillArg
     virtual unsigned getExpiryDays()                        { return 0; }
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC)  { }
     virtual void getEncryptKey(size32_t & keyLen, void * & key) { keyLen = 0; key = 0; }
-    virtual const char * queryCluster(unsigned idx)         { return NULL; }
+    virtual const char * getCluster(unsigned idx)         { return NULL; }
 };
 
 
@@ -1324,29 +1303,6 @@ class CThorHashAggregateArg : public CThorArg, implements IHThorHashAggregateArg
     virtual size32_t mergeAggregate(ARowBuilder & rowBuilder, const void * src) { rtlFailUnexpected(); return 0; }
 };
 
-class CThorTempTableArg : public CThorArg, implements IHThorTempTableArg
-{
-public:
-    virtual void Link() const { RtlCInterface::Link(); }
-    virtual bool Release() const { return RtlCInterface::Release(); }
-    virtual void onCreate(ICodeContext * _ctx, IHThorArg *, MemoryBuffer * in) { ctx = _ctx; }
-
-    virtual IInterface * selectInterface(ActivityInterfaceEnum which)
-    {
-        switch (which)
-        {
-        case TAIarg:
-        case TAItemptablearg_1:
-            return static_cast<IHThorTempTableArg *>(this);
-        }
-        return NULL;
-    }
-
-    virtual unsigned getFlags()                         { return 0; }
-    virtual bool isConstant()                           { return (getFlags() & TTFnoconstant) == 0; }
-    virtual size32_t getRowSingle(ARowBuilder & rowBuilder) { return 0; }
-};
-
 class CThorInlineTableArg : public CThorArg, implements IHThorInlineTableArg
 {
 public:
@@ -1542,7 +1498,7 @@ class CThorSortArg : public CThorArg, implements IHThorSortArg, implements IHTho
     virtual const char * getSortedFilename()            { return NULL; }
     virtual ICompare * queryCompareLeftRight()          { return NULL; }
     virtual unsigned getAlgorithmFlags()                { return TAFconstant; }
-    virtual const char * queryAlgorithm()               { return NULL; }
+    virtual const char * getAlgorithm()               { return NULL; }
     virtual ICompare * queryCompareSerializedRow()      { return NULL; }
 };
 
@@ -1831,29 +1787,6 @@ class CThorKeyedDistributeArg : public CThorArg, implements IHThorKeyedDistribut
 };
 
 
-class CThorCountIndexArg : public CThorArg, implements IHThorCountIndexArg
-{
-    virtual void Link() const { RtlCInterface::Link(); }
-    virtual bool Release() const { return RtlCInterface::Release(); }
-    virtual void onCreate(ICodeContext * _ctx, IHThorArg *, MemoryBuffer * in) { ctx = _ctx; }
-
-    virtual IInterface * selectInterface(ActivityInterfaceEnum which)
-    {
-        switch (which)
-        {
-        case TAIarg:
-        case TAIcountindexarg_1:
-            return static_cast<IHThorCountIndexArg *>(this);
-        }
-        return NULL;
-    }
-
-    virtual bool hasPostFilter() { return false; };
-    virtual size32_t isValid(const void * src, unsigned __int64 _fpos, IBlobProvider * blobs) { return true; }
-    virtual void extractLookupFields() {}
-    virtual bool canMatchAny()                              { return true; }
-};
-
 class CThorCountFileArg : public CThorArg, implements IHThorCountFileArg
 {
     virtual void Link() const { RtlCInterface::Link(); }
@@ -2190,7 +2123,7 @@ class CThorWorkunitReadArg : public CThorArg, implements IHThorWorkunitReadArg
     }
 
     virtual int querySequence() { return -3; }
-    virtual const char * queryWUID() { return NULL; }
+    virtual const char * getWUID() { return NULL; }
     virtual ICsvToRowTransformer * queryCsvTransformer() { return NULL; }
     virtual IXmlToRowTransformer * queryXmlTransformer() { return NULL; }
 };
@@ -2301,7 +2234,7 @@ class CThorCsvWriteArg : public CThorArg, implements IHThorCsvWriteArg
     virtual unsigned getExpiryDays()                        { return 0; }
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC)  { }
     virtual void getEncryptKey(size32_t & keyLen, void * & key) { keyLen = 0; key = 0; }
-    virtual const char * queryCluster(unsigned idx)         { return NULL; }
+    virtual const char * getCluster(unsigned idx)         { return NULL; }
 };
 
 
@@ -2394,9 +2327,9 @@ class CThorXmlWriteArg : public CThorArg, implements IHThorXmlWriteArg
         return NULL;
     }
 
-    virtual const char * queryIteratorPath()           { return NULL; }             // supplies the prefix and suffix for a row
-    virtual const char * queryHeader()                 { return NULL; }
-    virtual const char * queryFooter()                 { return NULL; }
+    virtual const char * getXmlIteratorPath()        { return NULL; }             // supplies the prefix and suffix for a row
+    virtual const char * getHeader()                 { return NULL; }
+    virtual const char * getFooter()                 { return NULL; }
     virtual unsigned getXmlFlags()                     { return 0; }
 
     virtual int getSequence()                               { return -3; }
@@ -2405,7 +2338,7 @@ class CThorXmlWriteArg : public CThorArg, implements IHThorXmlWriteArg
     virtual unsigned getExpiryDays()                        { return 0; }
     virtual void getUpdateCRCs(unsigned & eclCRC, unsigned __int64 & totalCRC)  { }
     virtual void getEncryptKey(size32_t & keyLen, void * & key) { keyLen = 0; key = 0; }
-    virtual const char * queryCluster(unsigned idx)         { return NULL; }
+    virtual const char * getCluster(unsigned idx)         { return NULL; }
 };
 
 
@@ -2430,24 +2363,22 @@ class CThorSoapActionArg : public CThorArg, implements IHThorSoapActionArg
     }
 
     virtual void toXML(const byte * self, IXmlWriter & out) { return; }
-    virtual const char * queryHeader()                  { return NULL; }
-    virtual const char * queryFooter()                  { return NULL; }
+    virtual const char * getHeader()                  { return NULL; }
+    virtual const char * getFooter()                  { return NULL; }
     virtual unsigned getFlags()                         { return 0; }
     virtual unsigned numParallelThreads()               { return 0; }
     virtual unsigned numRecordsPerBatch()               { return 0; }
-    virtual const char * queryUserName()                { return NULL; }
-    virtual const char * queryPassword()                { return NULL; }
     virtual int numRetries()                            { return -1; }
     virtual double getTimeout()                          { return -1.0; }
     virtual double getTimeLimit()                        { return 0.0; }
-    virtual const char * querySoapAction()              { return NULL; }
-    virtual const char * queryNamespaceName()           { return NULL; }
-    virtual const char * queryNamespaceVar()            { return NULL; }
-
-    virtual const char * queryHttpHeaderName()          { return NULL; }
-    virtual const char * queryHttpHeaderValue()         { return NULL; }
-    virtual const char * queryProxyAddress()            { return NULL; }
-    virtual const char * queryAcceptType()              { return NULL; }
+    virtual const char * getSoapAction()              { return NULL; }
+    virtual const char * getNamespaceName()           { return NULL; }
+    virtual const char * getNamespaceVar()            { return NULL; }
+
+    virtual const char * getHttpHeaderName()          { return NULL; }
+    virtual const char * getHttpHeaderValue()         { return NULL; }
+    virtual const char * getProxyAddress()            { return NULL; }
+    virtual const char * getAcceptType()              { return NULL; }
     virtual void getLogText(size32_t & lenText, char * & text, const void * left) { lenText =0; text = NULL; }
 };
 
@@ -2472,28 +2403,26 @@ class CThorSoapCallArg : public CThorArg, implements IHThorSoapCallArg
     }
     
 //writing to the soap service.
-    virtual const char * queryInputIteratorPath()       { return NULL; }
+    virtual const char * getInputIteratorPath()       { return NULL; }
     virtual unsigned onFailTransform(ARowBuilder & rowBuilder, const void * left, IException * e) { return 0; }
 
     virtual void toXML(const byte * self, IXmlWriter & out) { return; }
-    virtual const char * queryHeader()                  { return NULL; }
-    virtual const char * queryFooter()                  { return NULL; }
+    virtual const char * getHeader()                  { return NULL; }
+    virtual const char * getFooter()                  { return NULL; }
     virtual unsigned getFlags()                         { return 0; }
     virtual unsigned numParallelThreads()               { return 0; }
     virtual unsigned numRecordsPerBatch()               { return 0; }
-    virtual const char * queryUserName()                { return NULL; }
-    virtual const char * queryPassword()                { return NULL; }
     virtual int numRetries()                            { return -1; }
     virtual double getTimeout()                          { return -1.0; }
     virtual double getTimeLimit()                        { return 0.0; }
-    virtual const char * querySoapAction()              { return NULL; }
-    virtual const char * queryNamespaceName()           { return NULL; }
-    virtual const char * queryNamespaceVar()            { return NULL; }
-
-    virtual const char * queryHttpHeaderName()          { return NULL; }
-    virtual const char * queryHttpHeaderValue()         { return NULL; }
-    virtual const char * queryProxyAddress()            { return NULL; }
-    virtual const char * queryAcceptType()              { return NULL; }
+    virtual const char * getSoapAction()              { return NULL; }
+    virtual const char * getNamespaceName()           { return NULL; }
+    virtual const char * getNamespaceVar()            { return NULL; }
+
+    virtual const char * getHttpHeaderName()          { return NULL; }
+    virtual const char * getHttpHeaderValue()         { return NULL; }
+    virtual const char * getProxyAddress()            { return NULL; }
+    virtual const char * getAcceptType()              { return NULL; }
     virtual void getLogText(size32_t & lenText, char * & text, const void * left) { lenText =0; text = NULL; }
 };
 typedef CThorSoapCallArg CThorHttpCallArg;

+ 4 - 1
thorlcr/activities/csvread/thcsvrslave.cpp

@@ -71,7 +71,10 @@ class CCsvReadSlaveActivity : public CDiskReadSlaveActivityBase, public CThorDat
                 if (thisLineLength < minRequired || avail < minRequired)
                     break;
                 if (minRequired == maxRowSize)
-                    throw MakeActivityException(&activity, 0, "File %s contained a line of length greater than %d bytes.", activity.helper->getFileName(), minRequired);
+                {
+                    OwnedRoxieString fileName(activity.helper->getFileName());
+                    throw MakeActivityException(&activity, 0, "File %s contained a line of length greater than %d bytes.", fileName.get(), minRequired);
+                }
                 if (minRequired >= maxRowSize/2)
                     minRequired = maxRowSize;
                 else

+ 12 - 4
thorlcr/activities/diskread/thdiskread.cpp

@@ -49,7 +49,10 @@ public:
                 if (isGrouped)
                     rSz--; // eog byte not to be included in this test.
                 if (rSz != recordSize->getMinRecordSize())
-                    throw MakeThorException(TE_RecordSizeMismatch, "Published record size %d for file %s, does not match coded record size %d", rSz, helper->getFileName(), recordSize->getMinRecordSize());
+                {
+                    OwnedRoxieString fileName(helper->getFileName());
+                    throw MakeThorException(TE_RecordSizeMismatch, "Published record size %d for file %s, does not match coded record size %d", rSz, fileName.get(), recordSize->getMinRecordSize());
+                }
             }
             if (!fileDesc->isCompressed() && (TDXcompress & helper->getFlags()))
             {
@@ -57,7 +60,8 @@ public:
                 if (isGrouped) rSz++;
                 if (rSz >= MIN_ROWCOMPRESS_RECSIZE)
                 {
-                    Owned<IException> e = MakeActivityWarning(&container, TE_CompressionMismatch, "Ignoring compression attribute on file '%s', which is not published as compressed in DFS", helper->getFileName());
+                    OwnedRoxieString fileName(helper->getFileName());
+                    Owned<IException> e = MakeActivityWarning(&container, TE_CompressionMismatch, "Ignoring compression attribute on file '%s', which is not published as compressed in DFS", fileName.get());
                     container.queryJob().fireException(e);
                 }
             }
@@ -79,7 +83,10 @@ public:
     {
         IHThorDiskReadBaseArg *helper = (IHThorDiskReadBaseArg *)queryHelper();
         if (0 != (helper->getFlags() & TDXtemporary) && !container.queryJob().queryUseCheckpoints())
-            container.queryTempHandler()->deregisterFile(helper->getFileName(), fileDesc->queryProperties().getPropBool("@pausefile"));
+        {
+            OwnedRoxieString fileName(helper->getFileName());
+            container.queryTempHandler()->deregisterFile(fileName, fileDesc->queryProperties().getPropBool("@pausefile"));
+        }
     }
     virtual void init()
     {
@@ -165,7 +172,8 @@ public:
         {
             if (!helper->hasSegmentMonitors() && !helper->hasFilter() && !(helper->getFlags() & TDXtemporary))
             {
-                Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), helper->getFileName(), 0 != ((TDXtemporary|TDXjobtemp) & helper->getFlags()), 0 != (TDRoptional & helper->getFlags()));
+                OwnedRoxieString fileName(helper->getFileName());
+                Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), fileName, 0 != ((TDXtemporary|TDXjobtemp) & helper->getFlags()), 0 != (TDRoptional & helper->getFlags()));
                 if (file.get() && canMatch)
                 {
                     if (0 != (TDRunfilteredcount & helper->getFlags()) && file->queryAttributes().hasProp("@recordCount"))

+ 6 - 5
thorlcr/activities/diskwrite/thdiskwrite.cpp

@@ -65,8 +65,9 @@ public:
         IHThorCsvWriteArg *helper=(IHThorCsvWriteArg *)queryHelper();
         ICsvParameters *csvParameters = helper->queryCsvParameters();
         StringBuffer separator;
-        const char *s = csvParameters->querySeparator(0);
-        while (*s)
+        OwnedRoxieString rs(csvParameters->getSeparator(0));
+        const char *s = rs;
+        while (s && *s)
         {
             if (',' == *s)
                 separator.append("\\,");
@@ -75,9 +76,9 @@ public:
             ++s;
         }
         props.setProp("@csvSeparate", separator.str());
-        props.setProp("@csvQuote", csvParameters->queryQuote(0));
-        props.setProp("@csvTerminate", csvParameters->queryTerminator(0));
-        props.setProp("@csvEscape", csvParameters->queryEscape(0));
+        props.setProp("@csvQuote", rs.setown(csvParameters->getQuote(0)));
+        props.setProp("@csvTerminate", rs.setown(csvParameters->getTerminator(0)));
+        props.setProp("@csvEscape", rs.setown(csvParameters->getEscape(0)));
 
         CWriteMasterBase::done(); // will publish
     }

+ 2 - 2
thorlcr/activities/diskwrite/thdwslave.cpp

@@ -82,7 +82,7 @@ protected:
     {
         if (!singleHF || firstNode())
         {
-            const char * header = helper->queryCsvParameters()->queryHeader();
+            OwnedRoxieString header(helper->queryCsvParameters()->getHeader());
             if (header)
             {
                 csvOutput.beginLine();
@@ -116,7 +116,7 @@ protected:
         }
         if (!singleHF || lastNode())
         {
-            const char * footer = helper->queryCsvParameters()->queryFooter();
+            OwnedRoxieString footer(helper->queryCsvParameters()->getFooter());
             if (footer)
             {
                 csvOutput.beginLine();

+ 3 - 2
thorlcr/activities/fetch/thfetch.cpp

@@ -51,7 +51,8 @@ public:
     }
     virtual void init()
     {
-        fetchFile.setown(queryThorFileManager().lookup(container.queryJob(), helper->getFileName(), false, 0 != (helper->getFetchFlags() & FFdatafileoptional), true));
+        OwnedRoxieString fname(helper->getFileName());
+        fetchFile.setown(queryThorFileManager().lookup(container.queryJob(), fname, false, 0 != (helper->getFetchFlags() & FFdatafileoptional), true));
         if (fetchFile)
         {
             queryThorFileManager().noteFileRead(container.queryJob(), fetchFile);
@@ -72,7 +73,7 @@ public:
                 }
             }
             else if (encrypted)
-                throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", helper->getFileName());
+                throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", fname.get());
             mapping.setown(getFileSlaveMaps(fetchFile->queryLogicalName(), *fileDesc, container.queryJob().queryUserDescriptor(), container.queryJob().querySlaveGroup(), container.queryLocalOrGrouped(), false, NULL, fetchFile->querySuperFile()));
             mapping->serializeFileOffsetMap(offsetMapMb);
         }

+ 1 - 1
thorlcr/activities/fetch/thfetchslave.cpp

@@ -623,7 +623,7 @@ public:
         {
             streams[f].setown(createBufferedIOStream(fetchStream->queryPartIO(f)));
             // NB: the index is based on path iteration matches, so on lookup the elements start at positioned stream
-            // i.e. queryIteratorPath not used here.
+            // i.e. getXmlIteratorPath not used (or supplied) here.
             parsers[f].setown(createXMLParse(*streams[f], "/", *xmlSelect, xr_none, ((IHThorXmlFetchArg *)fetchBaseHelper)->requiresContents()));
         }
     }

+ 3 - 2
thorlcr/activities/hashdistrib/thhashdistrib.cpp

@@ -138,8 +138,9 @@ public:
         IHThorKeyedDistributeArg *helper = (IHThorKeyedDistributeArg *)queryHelper();
 
         StringBuffer scoped;
-        queryThorFileManager().addScope(container.queryJob(), helper->getIndexFileName(), scoped);
-        Owned<IDistributedFile> f = queryThorFileManager().lookup(container.queryJob(), helper->getIndexFileName());
+        OwnedRoxieString indexFileName(helper->getIndexFileName());
+        queryThorFileManager().addScope(container.queryJob(), indexFileName, scoped);
+        Owned<IDistributedFile> f = queryThorFileManager().lookup(container.queryJob(), indexFileName);
         if (!f)
             throw MakeActivityException(this, 0, "KeyedDistribute: Failed to find key: %s", scoped.str());
         if (0 == f->numParts())

+ 2 - 1
thorlcr/activities/hashdistrib/thhashdistribslave.cpp

@@ -2049,7 +2049,8 @@ public:
         data.read(tlkSz);
         Owned<IFileIO> iFileIO = createIFileI((size32_t)tlkSz, data.readDirect((size32_t)tlkSz));
 
-        StringBuffer name(helper->getIndexFileName());
+        OwnedRoxieString indexFileName(helper->getIndexFileName());
+        StringBuffer name(indexFileName);
         name.append("_tlk"); // MORE - this does not look right!
         CKeyLookup *l = new CKeyLookup(*this, helper, createKeyIndex(name.str(), 0, *iFileIO, true, false)); // MORE - crc is not 0...
         ihash = l;

+ 8 - 4
thorlcr/activities/indexread/thindexread.cpp

@@ -153,7 +153,10 @@ protected:
                     }
                 }
                 if (!keyIndex)
-                    throw MakeThorException(TE_FileNotFound, "Top level key part does not exist, for key: %s", indexBaseHelper->getFileName());
+                {
+                    OwnedRoxieString indexName(indexBaseHelper->getFileName());
+                    throw MakeThorException(TE_FileNotFound, "Top level key part does not exist, for key: %s", indexName.get());
+                }
             
                 unsigned maxSize = indexBaseHelper->queryDiskRecordSize()->querySerializedDiskMeta()->getRecordSize(NULL); // used only if fixed
                 Owned <IKeyManager> tlk = createKeyManager(keyIndex, maxSize, NULL);
@@ -192,8 +195,8 @@ public:
     void init()
     {
         nofilter = false;
-
-        index.setown(queryThorFileManager().lookup(container.queryJob(), indexBaseHelper->getFileName(), false, 0 != (TIRoptional & indexBaseHelper->getFlags()), true));
+        OwnedRoxieString indexName(indexBaseHelper->getFileName());
+        index.setown(queryThorFileManager().lookup(container.queryJob(), indexName, false, 0 != (TIRoptional & indexBaseHelper->getFlags()), true));
         if (index)
         {
             bool localKey = index->queryAttributes().getPropBool("@local");
@@ -226,7 +229,8 @@ public:
     }
     void serializeSlaveData(MemoryBuffer &dst, unsigned slave)
     {
-        dst.append(indexBaseHelper->getFileName());
+        OwnedRoxieString indexName(indexBaseHelper->getFileName());
+        dst.append(indexName);
         if (!container.queryLocalOrGrouped())
             dst.append(mpTag);
         IArrayOf<IPartDescriptor> parts;

+ 29 - 17
thorlcr/activities/indexwrite/thindexwrite.cpp

@@ -58,7 +58,8 @@ public:
     }
     virtual void init()
     {
-        dlfn.set(helper->getFileName());
+        OwnedRoxieString fname(helper->getFileName());
+        dlfn.set(fname);
         isLocal = 0 != (TIWlocal & helper->getFlags());
         unsigned maxSize = helper->queryDiskRecordSize()->getMinRecordSize();
         if (maxSize > KEYBUILD_MAXLENGTH)
@@ -67,8 +68,14 @@ public:
         singlePartKey = 0 != (helper->getFlags() & TIWsmall) || dlfn.isExternal();
         clusters.kill();
         unsigned idx=0;
-        while (helper->queryCluster(idx))
-            clusters.append(helper->queryCluster(idx++));
+        while (true)
+        {
+            OwnedRoxieString cluster(helper->getCluster(idx));
+            if(!cluster)
+                break;
+            clusters.append(cluster);
+            idx++;
+        }
         IArrayOf<IGroup> groups;
         if (singlePartKey)
         {
@@ -78,7 +85,7 @@ public:
         else if (!isLocal || globals->getPropBool("@buildLocalTlks", true))
             buildTlk = true;
 
-        fillClusterArray(container.queryJob(), helper->getFileName(), clusters, groups);
+        fillClusterArray(container.queryJob(), fname, clusters, groups);
         unsigned restrictedWidth = 0;
         if (TIWhaswidth & helper->getFlags())
         {
@@ -108,21 +115,22 @@ public:
         }
         else
             restrictedWidth = singlePartKey?1:container.queryJob().querySlaves();
-        fileDesc.setown(queryThorFileManager().create(container.queryJob(), helper->getFileName(), clusters, groups, 0 != (TIWoverwrite & helper->getFlags()), 0, buildTlk, restrictedWidth));
+        fileDesc.setown(queryThorFileManager().create(container.queryJob(), fname, clusters, groups, 0 != (TIWoverwrite & helper->getFlags()), 0, buildTlk, restrictedWidth));
         if (buildTlk)
             fileDesc->queryPart(fileDesc->numParts()-1)->queryProperties().setProp("@kind", "topLevelKey");
 
-        if (helper->getDistributeIndexName())
+        OwnedRoxieString diName(helper->getDistributeIndexName());
+        if (diName.get())
         {
             assertex(!isLocal);
             buildTlk = false;
-            Owned<IDistributedFile> _f = queryThorFileManager().lookup(container.queryJob(), helper->getDistributeIndexName());
+            Owned<IDistributedFile> _f = queryThorFileManager().lookup(container.queryJob(), diName);
             checkFormatCrc(this, _f, helper->getFormatCrc(), true);
             IDistributedFile *f = _f->querySuperFile();
             if (!f) f = _f;
             Owned<IDistributedFilePart> existingTlk = f->getPart(f->numParts()-1);
             if (!existingTlk->queryAttributes().hasProp("@kind") || 0 != stricmp("topLevelKey", existingTlk->queryAttributes().queryProp("@kind")))
-                throw MakeActivityException(this, 0, "Cannot build new key '%s' based on non-distributed key '%s'", helper->getFileName(), helper->getDistributeIndexName());
+                throw MakeActivityException(this, 0, "Cannot build new key '%s' based on non-distributed key '%s'", fname.get(), diName.get());
             IPartDescriptor *tlkDesc = fileDesc->queryPart(fileDesc->numParts()-1);
             IPropertyTree &props = tlkDesc->queryProperties();
             if (existingTlk->queryAttributes().hasProp("@size"))
@@ -135,7 +143,7 @@ public:
         
         StringBuffer datasetName;
         fileSize = 0;
-        const char *dname = helper->getDatasetName();
+        OwnedRoxieString dname(helper->getDatasetName());
         if (dname)
         {
             if (dname[0] == '~')
@@ -182,7 +190,8 @@ public:
         {
             dst.append(true);
             IPartDescriptor *partDesc = fileDesc->queryPart(slave);
-            dst.append(helper->getFileName());
+            OwnedRoxieString fname(helper->getFileName());
+            dst.append(fname.get());
             partDesc->serialize(dst);
         }
         else
@@ -203,10 +212,11 @@ public:
                 }
                 else if (!isLocal)
                 {
-                    assertex(helper->getDistributeIndexName());
+                    OwnedRoxieString diName(helper->getDistributeIndexName());
+                    assertex(diName.get());
                     IPartDescriptor *tlkDesc = fileDesc->queryPart(fileDesc->numParts()-1);
                     tlkDesc->serialize(dst);
-                    Owned<IDistributedFile> _f = queryThorFileManager().lookup(container.queryJob(), helper->getDistributeIndexName());
+                    Owned<IDistributedFile> _f = queryThorFileManager().lookup(container.queryJob(), diName);
                     IDistributedFile *f = _f->querySuperFile();
                     if (!f) f = _f;
                     Owned<IDistributedFilePart> existingTlk = f->getPart(f->numParts()-1);
@@ -227,11 +237,12 @@ public:
     {
         IHThorIndexWriteArg *helper = (IHThorIndexWriteArg *)queryHelper();
         StringBuffer scopedName;
-        queryThorFileManager().addScope(container.queryJob(), helper->getFileName(), scopedName);
+        OwnedRoxieString fname(helper->getFileName());
+        queryThorFileManager().addScope(container.queryJob(), fname, scopedName);
         updateActivityResult(container.queryJob().queryWorkUnit(), helper->getFlags(), helper->getSequence(), scopedName.str(), recordsProcessed);
 
         // MORE - add in the extra entry somehow
-        if (helper->getFileName())
+        if (fname.get())
         {
             IPropertyTree &props = fileDesc->queryProperties();
             props.setPropInt64("@recordCount", recordsProcessed);
@@ -248,9 +259,9 @@ public:
             props.setPropInt("@formatCrc", helper->getFormatCrc());
             if (isLocal)
                 props.setPropBool("@local", true);
-            container.queryTempHandler()->registerFile(helper->getFileName(), container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
+            container.queryTempHandler()->registerFile(fname, container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
             if (!dlfn.isExternal())
-                queryThorFileManager().publish(container.queryJob(), helper->getFileName(), false, *fileDesc);
+                queryThorFileManager().publish(container.queryJob(), fname, false, *fileDesc);
         }
     }
     virtual void slaveDone(size32_t slaveIdx, MemoryBuffer &mb)
@@ -301,7 +312,8 @@ public:
         IHThorIndexWriteArg *helper = (IHThorIndexWriteArg *) queryHelper();
         if (0 == (TIWvarfilename & helper->getFlags()))
         {
-            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), helper->getFileName(), false, true);
+            OwnedRoxieString fname(helper->getFileName());
+            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), fname, false, true);
             if (file)
             {
                 if (0 == (TIWoverwrite & helper->getFlags()))

+ 11 - 4
thorlcr/activities/indexwrite/thindexwriteslave.cpp

@@ -150,7 +150,8 @@ public:
                     tlkDesc.setown(deserializePartFileDescriptor(data));
                 else if (!isLocal) // exising tlk then..
                 {
-                    assertex(helper->getDistributeIndexName());
+                    OwnedRoxieString diName(helper->getDistributeIndexName());
+                    assertex(diName.get());
                     tlkDesc.setown(deserializePartFileDescriptor(data));
                     unsigned c;
                     data.read(c);
@@ -166,7 +167,7 @@ public:
                         }
                     }
                     if (!existingTlkIFile)
-                        throw MakeThorException(TE_FileNotFound, "Top level key part does not exist, for key: %s", helper->getDistributeIndexName());
+                        throw MakeThorException(TE_FileNotFound, "Top level key part does not exist, for key: %s", diName.get());
                 }
             }
         }
@@ -214,9 +215,15 @@ public:
             StringBuffer name(nameLen, nameBuff);
             StringBuffer value(valueLen, valueBuff);
             if(*nameBuff == '_' && strcmp(name, "_nodeSize") != 0)
-                throw MakeActivityException(this, 0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), helper->getFileName());
+            {
+                OwnedRoxieString fname(helper->getFileName());
+                throw MakeActivityException(this, 0, "Invalid name %s in user metadata for index %s (names beginning with underscore are reserved)", name.str(), fname.get());
+            }
             if(!validateXMLTag(name.str()))
-                throw MakeActivityException(this, 0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), helper->getFileName());
+            {
+                OwnedRoxieString fname(helper->getFileName());
+                throw MakeActivityException(this, 0, "Invalid name %s in user metadata for index %s (not legal XML element name)", name.str(), fname.get());
+            }
             if(!metadata) metadata.setown(createPTree("metadata"));
             metadata->setProp(name.str(), value.str());
         }

+ 14 - 10
thorlcr/activities/keydiff/thkeydiff.cpp

@@ -47,11 +47,12 @@ public:
     void init()
     {
         helper = (IHThorKeyDiffArg *)queryHelper();
-
-        originalIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), helper->queryOriginalName()));
-        newIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), helper->queryUpdatedName()));
+        OwnedRoxieString origName(helper->getOriginalName());
+        OwnedRoxieString updatedName(helper->getUpdatedName());
+        originalIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), origName));
+        newIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), updatedName));
         if (originalIndexFile->numParts() != newIndexFile->numParts())
-            throw MakeActivityException(this, TE_KeyDiffIndexSizeMismatch, "Index %s and %s differ in width", helper->queryOriginalName(), helper->queryUpdatedName());
+            throw MakeActivityException(this, TE_KeyDiffIndexSizeMismatch, "Index %s and %s differ in width", origName.get(), updatedName.get());
         if (originalIndexFile->querySuperFile() || newIndexFile->querySuperFile())
             throw MakeActivityException(this, 0, "Diffing super files not supported");  
 
@@ -72,8 +73,9 @@ public:
         queryThorFileManager().noteFileRead(container.queryJob(), newIndexFile);
 
         IArrayOf<IGroup> groups;
-        fillClusterArray(container.queryJob(), helper->queryOutputName(), clusters, groups);
-        patchDesc.setown(queryThorFileManager().create(container.queryJob(), helper->queryOutputName(), clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width));
+        OwnedRoxieString outputName(helper->getOutputName());
+        fillClusterArray(container.queryJob(), outputName, clusters, groups);
+        patchDesc.setown(queryThorFileManager().create(container.queryJob(), outputName, clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width));
     }
     void serializeSlaveData(MemoryBuffer &dst, unsigned slave)
     {
@@ -149,7 +151,8 @@ public:
     void done()
     {
         StringBuffer scopedName;
-        queryThorFileManager().addScope(container.queryJob(), helper->queryOutputName(), scopedName);
+        OwnedRoxieString outputName(helper->getOutputName());
+        queryThorFileManager().addScope(container.queryJob(), outputName, scopedName);
         Owned<IWorkUnit> wu = &container.queryJob().queryWorkUnit().lock();
         Owned<IWUResult> r = wu->updateResultBySequence(helper->getSequence());
         r->setResultStatus(ResultStatusCalculated);
@@ -164,10 +167,10 @@ public:
             patchProps.setProp("ECL", originalProps.queryProp("ECL"));
         if (originalProps.getPropBool("@local"))
             patchProps.setPropBool("@local", true);
-        container.queryTempHandler()->registerFile(helper->queryOutputName(), container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
+        container.queryTempHandler()->registerFile(outputName, container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
         Owned<IDistributedFile> patchFile;
         // set part sizes etc
-        queryThorFileManager().publish(container.queryJob(), helper->queryOutputName(), false, *patchDesc, &patchFile, 0, false);
+        queryThorFileManager().publish(container.queryJob(), outputName, false, *patchDesc, &patchFile, 0, false);
         try { // set file size
             if (patchFile) {
                 __int64 fs = patchFile->getFileSize(true,false);
@@ -203,7 +206,8 @@ public:
         if (0==(KDPoverwrite & helper->getFlags()))
         {
             if (KDPvaroutputname & helper->getFlags()) return;
-            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), helper->queryOutputName(), false, true);
+            OwnedRoxieString outputName(helper->getOutputName());
+            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), outputName, false, true);
             if (file)
                 throw MakeActivityException(this, TE_OverwriteNotSpecified, "Cannot write %s, file already exists (missing OVERWRITE attribute?)", file->queryLogicalName());
         }

+ 8 - 5
thorlcr/activities/keydiff/thkeydiffslave.cpp

@@ -77,8 +77,10 @@ public:
         }
 
         StringBuffer originalFilePart, updatedFilePart;
-        locateFilePartPath(this, helper->queryOriginalName(), *originalIndexPart, originalFilePart);
-        locateFilePartPath(this, helper->queryUpdatedName(), *updatedIndexPart, updatedFilePart);
+        OwnedRoxieString origName(helper->getOriginalName());
+        OwnedRoxieString updatedName(helper->getUpdatedName());
+        locateFilePartPath(this, origName, *originalIndexPart, originalFilePart);
+        locateFilePartPath(this, updatedName, *updatedIndexPart, updatedFilePart);
         StringBuffer patchFilePath;
         getPartFilename(*patchPart, 0, patchFilePath);
         if (globals->getPropBool("@replicateAsync", true))
@@ -94,8 +96,8 @@ public:
             if (!copyTlk)
             {
                 StringBuffer tmp;
-                locateFilePartPath(this, tmp.clear().append(helper->queryOriginalName()).append(" [TLK]").str(), *originalIndexTlkPart, originalFilePart.clear());
-                locateFilePartPath(this, tmp.clear().append(helper->queryUpdatedName()).append(" [TLK]").str(), *updatedIndexTlkPart, updatedFilePart.clear());
+                locateFilePartPath(this, tmp.clear().append(origName).append(" [TLK]").str(), *originalIndexTlkPart, originalFilePart.clear());
+                locateFilePartPath(this, tmp.clear().append(updatedName).append(" [TLK]").str(), *updatedIndexTlkPart, updatedFilePart.clear());
                 getPartFilename(*patchTlkPart, 0, tmp.clear());
                 tlkDiffGenerator.setown(createKeyDiffGenerator(originalFilePart.str(), updatedFilePart.str(), tmp.str(), 0, true, COMPRESS_METHOD_LZMA));
             }
@@ -126,7 +128,8 @@ public:
                 {
                     StringBuffer patchFilePathTlk, updatedFilePartTlk, tmp;
                     getPartFilename(*patchTlkPart, 0, patchFilePathTlk);
-                    locateFilePartPath(this, tmp.append(helper->queryUpdatedName()).append(" [TLK]").str(), *updatedIndexTlkPart, updatedFilePartTlk);
+                    OwnedRoxieString updatedName(helper->getUpdatedName());
+                    locateFilePartPath(this, tmp.append(updatedName).append(" [TLK]").str(), *updatedIndexTlkPart, updatedFilePartTlk);
                     OwnedIFile dstIFileTlk = createIFile(patchFilePathTlk.str());
                     OwnedIFile updatedIFileTlk = createIFile(updatedFilePartTlk.str());
                     copyFile(dstIFileTlk, updatedIFileTlk);

+ 5 - 4
thorlcr/activities/keyedjoin/thkeyedjoin.cpp

@@ -68,7 +68,8 @@ public:
     }
     void init()
     {
-        indexFile.setown(queryThorFileManager().lookup(container.queryJob(), helper->getIndexFileName(), false, 0 != (helper->getJoinFlags() & JFindexoptional), true));
+        OwnedRoxieString indexFileName(helper->getIndexFileName());
+        indexFile.setown(queryThorFileManager().lookup(container.queryJob(), indexFileName, false, 0 != (helper->getJoinFlags() & JFindexoptional), true));
 
         unsigned keyReadWidth = (unsigned)container.queryJob().getWorkUnitValueInt("KJKRR", 0);
         if (!keyReadWidth || keyReadWidth>container.queryJob().querySlaves())
@@ -76,7 +77,7 @@ public:
         
 
         initMb.clear();
-        initMb.append(helper->getIndexFileName());
+        initMb.append(indexFileName.get());
         if (helper->diskAccessRequired())
             numTags += 2;
         initMb.append(numTags);
@@ -197,7 +198,7 @@ public:
                 }
                 if (helper->diskAccessRequired())
                 {
-                    const char *fetchFilename = helper->getFileName();
+                    OwnedRoxieString fetchFilename(helper->getFileName());
                     if (fetchFilename)
                     {
                         dataFile.setown(queryThorFileManager().lookup(container.queryJob(), fetchFilename, false, 0 != (helper->getFetchFlags() & FFdatafileoptional), true));
@@ -221,7 +222,7 @@ public:
                                 }
                             }
                             else if (encrypted)
-                                throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", helper->getFileName());
+                                throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", fetchFilename.get());
                             unsigned dataReadWidth = (unsigned)container.queryJob().getWorkUnitValueInt("KJDRR", 0);
                             if (!dataReadWidth || dataReadWidth>container.queryJob().querySlaves())
                                 dataReadWidth = container.queryJob().querySlaves();

+ 14 - 9
thorlcr/activities/keypatch/thkeypatch.cpp

@@ -46,11 +46,13 @@ public:
     {
         helper = (IHThorKeyPatchArg *)queryHelper();
 
-        Owned<IDistributedFile> originalIndexFile = queryThorFileManager().lookup(container.queryJob(), helper->queryOriginalName());
-        Owned<IDistributedFile> patchFile = queryThorFileManager().lookup(container.queryJob(), helper->queryPatchName());
+        OwnedRoxieString originalName(helper->getOriginalName());
+        OwnedRoxieString patchName(helper->getPatchName());
+        Owned<IDistributedFile> originalIndexFile = queryThorFileManager().lookup(container.queryJob(), originalName);
+        Owned<IDistributedFile> patchFile = queryThorFileManager().lookup(container.queryJob(), patchName);
         
         if (originalIndexFile->numParts() != patchFile->numParts())
-            throw MakeActivityException(this, TE_KeyPatchIndexSizeMismatch, "Index %s and patch %s differ in width", helper->queryOriginalName(), helper->queryPatchName());
+            throw MakeActivityException(this, TE_KeyPatchIndexSizeMismatch, "Index %s and patch %s differ in width", originalName.get(), patchName.get());
         if (originalIndexFile->querySuperFile() || patchFile->querySuperFile())
             throw MakeActivityException(this, 0, "Patching super files not supported");
         
@@ -69,8 +71,9 @@ public:
             throw MakeActivityException(this, 0, "Unsupported: keypatch(%s, %s) - Cannot patch a key that's wider(%d) than the target cluster size(%d)", originalIndexFile->queryLogicalName(), patchFile->queryLogicalName(), width, container.queryJob().querySlaves());
 
         IArrayOf<IGroup> groups;
-        fillClusterArray(container.queryJob(), helper->queryOutputName(), clusters, groups);
-        newIndexDesc.setown(queryThorFileManager().create(container.queryJob(), helper->queryOutputName(), clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width));
+        OwnedRoxieString outputName(helper->getOutputName());
+        fillClusterArray(container.queryJob(), outputName, clusters, groups);
+        newIndexDesc.setown(queryThorFileManager().create(container.queryJob(), outputName, clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width));
         if (!local)
             newIndexDesc->queryPart(newIndexDesc->numParts()-1)->queryProperties().setProp("@kind", "topLevelKey");
     }
@@ -133,7 +136,8 @@ public:
     void done()
     {
         StringBuffer scopedName;
-        queryThorFileManager().addScope(container.queryJob(), helper->queryOutputName(), scopedName);
+        OwnedRoxieString outputName(helper->getOutputName());
+        queryThorFileManager().addScope(container.queryJob(), outputName, scopedName);
         Owned<IWorkUnit> wu = &container.queryJob().queryWorkUnit().lock();
         Owned<IWUResult> r = wu->updateResultBySequence(helper->getSequence());
         r->setResultStatus(ResultStatusCalculated);
@@ -156,8 +160,8 @@ public:
         if (originalProps.getPropBool("@local"))
             props.setPropBool("@local", true);
 
-        container.queryTempHandler()->registerFile(helper->queryOutputName(), container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
-        queryThorFileManager().publish(container.queryJob(), helper->queryOutputName(), false, *newIndexDesc);
+        container.queryTempHandler()->registerFile(outputName, container.queryOwner().queryGraphId(), 0, false, WUFileStandard, &clusters);
+        queryThorFileManager().publish(container.queryJob(), outputName, false, *newIndexDesc);
     }
     void preStart(size32_t parentExtractSz, const byte *parentExtract)
     {
@@ -166,7 +170,8 @@ public:
         if (0==(KDPoverwrite & helper->getFlags()))
         {
             if (KDPvaroutputname & helper->getFlags()) return;
-            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), helper->queryOutputName(), false, true);
+            OwnedRoxieString outputName(helper->getOutputName());
+            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), outputName, false, true);
             if (file)
                 throw MakeActivityException(this, TE_OverwriteNotSpecified, "Cannot write %s, file already exists (missing OVERWRITE attribute?)", file->queryLogicalName());
         }

+ 8 - 5
thorlcr/activities/keypatch/thkeypatchslave.cpp

@@ -77,8 +77,10 @@ public:
         }
 
         StringBuffer originalFilePart, patchFilePart;
-        locateFilePartPath(this, helper->queryOriginalName(), *originalIndexPart, originalFilePart);
-        locateFilePartPath(this, helper->queryPatchName(), *patchPart, patchFilePart);
+        OwnedRoxieString originalName(helper->getOriginalName());
+        OwnedRoxieString patchName(helper->getPatchName());
+        locateFilePartPath(this, originalName, *originalIndexPart, originalFilePart);
+        locateFilePartPath(this, patchName, *patchPart, patchFilePart);
 
         StringBuffer newIndexFilePath;
         getPartFilename(*newIndexPart, 0, newIndexFilePath);
@@ -95,8 +97,8 @@ public:
             if (!copyTlk)
             {
                 StringBuffer tmp;
-                locateFilePartPath(this, tmp.clear().append(helper->queryOriginalName()).append(" [TLK]").str(), *originalIndexTlkPart, originalFilePart);
-                locateFilePartPath(this, tmp.clear().append(helper->queryPatchName()).append(" [TLK]").str(), *patchTlkPart, patchFilePart);
+                locateFilePartPath(this, tmp.clear().append(originalName).append(" [TLK]").str(), *originalIndexTlkPart, originalFilePart);
+                locateFilePartPath(this, tmp.clear().append(patchName).append(" [TLK]").str(), *patchTlkPart, patchFilePart);
                 getPartFilename(*newIndexTlkPart, 0, tmp.clear());
                 tlkPatchApplicator.setown(createKeyDiffApplicator(patchFilePart.str(), originalFilePart.str(), tmp.str(), NULL, true, true));
             }
@@ -123,7 +125,8 @@ public:
                 {
                     StringBuffer newFilePathTlk, patchFilePathTlk, tmp;
                     getPartFilename(*newIndexTlkPart, 0, newFilePathTlk);
-                    locateFilePartPath(this, tmp.append(helper->queryPatchName()).append(" [TLK]").str(), *patchTlkPart, patchFilePathTlk);
+                    OwnedRoxieString patchName(helper->getPatchName());
+                    locateFilePartPath(this, tmp.append(patchName).append(" [TLK]").str(), *patchTlkPart, patchFilePathTlk);
                     OwnedIFile newIFileTlk = createIFile(newFilePathTlk.str());
                     OwnedIFile patchIFileTlk = createIFile(patchFilePathTlk.str());
                     copyFile(newIFileTlk, patchIFileTlk);

+ 5 - 5
thorlcr/activities/msort/thmsort.cpp

@@ -41,11 +41,11 @@ public:
     {
         IHThorSortArg *helper = (IHThorSortArg *)queryHelper();
         IHThorAlgorithm *algo = static_cast<IHThorAlgorithm *>(helper->selectInterface(TAIalgorithm_1));
-        char const *algoname = algo->queryAlgorithm();
+        OwnedRoxieString algoname = algo->getAlgorithm();
         unsigned flags = algo->getAlgorithmFlags();
         if (algoname && (0 != stricmp(algoname, "quicksort")))
         {
-            Owned<IException> e = MakeActivityException(this, 0, "Ignoring, unsupported sort order algorithm '%s'", algoname);
+            Owned<IException> e = MakeActivityException(this, 0, "Ignoring, unsupported sort order algorithm '%s'", algoname.get());
             reportExceptionToWorkunit(container.queryJob().queryWorkUnit(), e);
         }
     }
@@ -77,11 +77,11 @@ protected:
     {
         IHThorSortArg *helper = (IHThorSortArg *)queryHelper();
         IHThorAlgorithm *algo = static_cast<IHThorAlgorithm *>(helper->selectInterface(TAIalgorithm_1));
-        char const *algoname = algo->queryAlgorithm();
+        OwnedRoxieString algoname(algo->getAlgorithm());
         unsigned flags = algo->getAlgorithmFlags();
         if (algoname && (0 != stricmp(algoname, "quicksort")))
         {
-            Owned<IException> e = MakeActivityException(this, 0, "Ignoring, unsupported sort order algorithm '%s'", algoname);
+            Owned<IException> e = MakeActivityException(this, 0, "Ignoring, unsupported sort order algorithm '%s'", algoname.get());
             reportExceptionToWorkunit(container.queryJob().queryWorkUnit(), e);
         }
     }
@@ -136,7 +136,7 @@ protected:
                 skewThreshold = container.queryJob().getWorkUnitValueInt("defaultSkewThreshold", 0);
         }
         StringBuffer cosortfilenames;
-        const char *cosortlogname = helper->getSortedFilename();
+        OwnedRoxieString cosortlogname(helper->getSortedFilename());
         if (cosortlogname&&*cosortlogname) {
 
             Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), cosortlogname);

+ 10 - 5
thorlcr/activities/piperead/thprslave.cpp

@@ -242,14 +242,16 @@ public:
         }
         else
             _inrowif = this;
-        readTransformer.setown(createReadRowStream(_inrowif->queryRowAllocator(), _inrowif->queryRowDeserializer(), helper->queryXmlTransformer(), helper->queryCsvTransformer(), helper->queryXmlIteratorPath(), flags));
+        OwnedRoxieString xmlIteratorPath(helper->getXmlIteratorPath());
+        readTransformer.setown(createReadRowStream(_inrowif->queryRowAllocator(), _inrowif->queryRowDeserializer(), helper->queryXmlTransformer(), helper->queryCsvTransformer(), xmlIteratorPath, flags));
         appendOutputLinked(this);
     }
     virtual void start()
     {
         ActivityTimer s(totalCycles, timeActivities, NULL);
         eof = false;
-        openPipe(helper->getPipeProgram(), "PIPEREAD");
+        OwnedRoxieString pipeProgram(helper->getPipeProgram());
+        openPipe(pipeProgram, "PIPEREAD");
         dataLinkStart("PIPEREAD", container.queryId());
     }
     virtual void stop()
@@ -355,7 +357,8 @@ public:
         recreate = helper->recreateEachRow();
         grouped = 0 != (flags & TPFgroupeachrow);
 
-        readTransformer.setown(createReadRowStream(queryRowAllocator(), queryRowDeserializer(), helper->queryXmlTransformer(), helper->queryCsvTransformer(), helper->queryXmlIteratorPath(), flags));
+        OwnedRoxieString xmlIterator(helper->getXmlIteratorPath());
+        readTransformer.setown(createReadRowStream(queryRowAllocator(), queryRowDeserializer(), helper->queryXmlTransformer(), helper->queryCsvTransformer(), xmlIterator, flags));
         readTransformer->setStream(pipeStream); // NB the pipe process stream is provided to pipeStream after pipe->run()
 
         appendOutputLinked(this);
@@ -372,8 +375,10 @@ public:
             writeTransformer->ready();
         }
         if (!recreate)
-            openPipe(helper->getPipeProgram(), "PIPETHROUGH");
-
+        {
+            OwnedRoxieString pipeProgram(helper->getPipeProgram());
+            openPipe(pipeProgram, "PIPETHROUGH");
+        }
         startInput(inputs.item(0));
         dataLinkStart("PIPETHROUGH", container.queryId());
         pipeWriter = new PipeWriterThread(*this);

+ 4 - 1
thorlcr/activities/pipewrite/thpwslave.cpp

@@ -55,7 +55,10 @@ public:
     {
         assertex(helper);
         if (!recreate)
-            openPipe(helper->getPipeProgram());
+        {
+            OwnedRoxieString pipeProgram(helper->getPipeProgram());
+            openPipe(pipeProgram);
+        }
     }
     void abort()
     {

+ 8 - 6
thorlcr/activities/spill/thspill.cpp

@@ -36,8 +36,9 @@ public:
     {
         IHThorSpillArg *helper = (IHThorSpillArg *)queryHelper();
         IArrayOf<IGroup> groups;
-        fillClusterArray(container.queryJob(), helper->getFileName(), clusters, groups);
-        fileDesc.setown(queryThorFileManager().create(container.queryJob(), helper->getFileName(), clusters, groups, true, TDWnoreplicate+TDXtemporary));
+        OwnedRoxieString fname(helper->getFileName());
+        fillClusterArray(container.queryJob(), fname, clusters, groups);
+        fileDesc.setown(queryThorFileManager().create(container.queryJob(), fname, clusters, groups, true, TDWnoreplicate+TDXtemporary));
         IPropertyTree &props = fileDesc->queryProperties();
         bool blockCompressed=false;
         void *ekey;
@@ -59,8 +60,8 @@ public:
 
         if (container.queryOwner().queryOwner() && (!container.queryOwner().isGlobal())) // I am in a child query
         { // do early, because this will be local act. and will not come back to master until end of owning graph.
-            container.queryTempHandler()->registerFile(helper->getFileName(), container.queryOwner().queryGraphId(), helper->getTempUsageCount(), TDXtemporary & helper->getFlags(), getDiskOutputKind(helper->getFlags()), &clusters);
-            queryThorFileManager().publish(container.queryJob(), helper->getFileName(), true, *fileDesc);
+            container.queryTempHandler()->registerFile(fname, container.queryOwner().queryGraphId(), helper->getTempUsageCount(), TDXtemporary & helper->getFlags(), getDiskOutputKind(helper->getFlags()), &clusters);
+            queryThorFileManager().publish(container.queryJob(), fname, true, *fileDesc);
         }
     }
     void serializeSlaveData(MemoryBuffer &dst, unsigned slave)
@@ -75,8 +76,9 @@ public:
         if (!container.queryOwner().queryOwner() || container.queryOwner().isGlobal()) // I am in a child query
         {
             IHThorSpillArg *helper = (IHThorSpillArg *)queryHelper();
-            container.queryTempHandler()->registerFile(helper->getFileName(), container.queryOwner().queryGraphId(), helper->getTempUsageCount(), TDXtemporary & helper->getFlags(), getDiskOutputKind(helper->getFlags()), &clusters);
-            queryThorFileManager().publish(container.queryJob(), helper->getFileName(), true, *fileDesc);
+            OwnedRoxieString fname(helper->getFileName());
+            container.queryTempHandler()->registerFile(fname, container.queryOwner().queryGraphId(), helper->getTempUsageCount(), TDXtemporary & helper->getFlags(), getDiskOutputKind(helper->getFlags()), &clusters);
+            queryThorFileManager().publish(container.queryJob(), fname, true, *fileDesc);
         }
     }
     void slaveDone(size32_t slaveIdx, MemoryBuffer &mb)

+ 3 - 79
thorlcr/activities/temptable/thtmptableslave.cpp

@@ -23,86 +23,10 @@
 #include "thactivityutil.ipp"
 
 /*
- * Deprecated in 3.8, this class is being kept for backward compatibility,
- * since now the code generator is using InlineTables (below) for all
- * temporary tables and rows.
- */
-class CTempTableSlaveActivity : public CSlaveActivity, public CThorDataLink
-{
-private:
-    IHThorTempTableArg * helper;
-    bool empty;
-    unsigned currentRow;
-    unsigned numRows;
-    size32_t maxrecsize;
-    bool isLocal;
-public:
-    IMPLEMENT_IINTERFACE_USING(CSimpleInterface);
-
-    CTempTableSlaveActivity(CGraphElementBase *_container) : CSlaveActivity(_container), CThorDataLink(this) { }
-    virtual bool isGrouped() { return false; }
-    void init(MemoryBuffer &data, MemoryBuffer &slaveData)
-    {
-        appendOutputLinked(this);
-        isLocal = false;
-        helper = static_cast <IHThorTempTableArg *> (queryHelper());
-    }
-    void start()
-    {
-        ActivityTimer s(totalCycles, timeActivities, NULL);
-        dataLinkStart("TEMPTABLE", container.queryId());
-        currentRow = 0;
-        isLocal = container.queryOwnerId() && container.queryOwner().isLocalOnly();
-        empty = isLocal ? false : !firstNode();
-        numRows = helper->numRows();
-    }
-    void stop()
-    {
-        dataLinkStop();
-    }
-    CATCH_NEXTROW()
-    {
-        ActivityTimer t(totalCycles, timeActivities, NULL);
-        if (empty || abortSoon)
-            return NULL;
-        // Filtering empty rows, returns the next valid row
-        while (currentRow < numRows) {
-            RtlDynamicRowBuilder row(queryRowAllocator());
-            size32_t sizeGot = helper->getRow(row, currentRow++);
-            if (sizeGot)
-            {
-                dataLinkIncrement();
-                return row.finalizeRowClear(sizeGot);
-            }
-        }
-        return NULL;
-    }
-    void getMetaInfo(ThorDataLinkMetaInfo &info)
-    {
-        initMetaInfo(info);
-        info.isSource = true;
-        info.unknownRowsOutput = false;
-        if (isLocal || firstNode())
-            info.totalRowsMin = helper->numRows();
-        else
-            info.totalRowsMin = 0;
-        info.totalRowsMax = info.totalRowsMin;
-    }
-};
-
-CActivityBase *createTempTableSlave(CGraphElementBase *container)
-{
-    return new CTempTableSlaveActivity(container);
-}
-
-/*
- * This class is essentially a temp table, but this could be used for creating massive
- * test tables and will also be used when optimising NORMALISE(ds, count) to
- * DATASET(count, transform), so could end up consuming a lot of rows.
+ * This class can be used for creating massive temp tables and will also be used
+ * when optimising NORMALISE(ds, count) to DATASET(count, transform), so could end
+ * up consuming a lot of rows.
  *
- * It also uses an extended version of the helper (to get distributed flag), and it was
- * simple enough to clone. Should be simpler to deprecate the old 32bit temp table
- * in the future, too.
  */
 class CInlineTableSlaveActivity : public CSlaveActivity, public CThorDataLink
 {

+ 1 - 6
thorlcr/activities/temptable/thtmptableslave.ipp

@@ -20,15 +20,10 @@
 
 #include "platform.h"
 #include "jiface.hpp"       // IInterface defined in jlib   
-#include "eclhelper.hpp"        // for IHThorTempTableArg
+#include "eclhelper.hpp"        // for IHThorInlineTableArg
 #include "slave.ipp"
 #include "thactivityutil.ipp"
 
-
-
-activityslaves_decl CActivityBase *createTempTableSlave(CGraphElementBase *container);
-
-
 activityslaves_decl CActivityBase *createInlineTableSlave(CGraphElementBase *container);
 
 

+ 32 - 17
thorlcr/activities/thdiskbase.cpp

@@ -38,7 +38,8 @@ CDiskReadMasterBase::CDiskReadMasterBase(CMasterGraphElement *info) : CMasterAct
 void CDiskReadMasterBase::init()
 {
     IHThorDiskReadBaseArg *helper = (IHThorDiskReadBaseArg *) queryHelper();
-    Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), helper->getFileName(), 0 != ((TDXtemporary|TDXjobtemp) & helper->getFlags()), 0 != (TDRoptional & helper->getFlags()), true);
+    OwnedRoxieString fileName(helper->getFileName());
+    Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), fileName, 0 != ((TDXtemporary|TDXjobtemp) & helper->getFlags()), 0 != (TDRoptional & helper->getFlags()), true);
 
     if (file)
     {
@@ -84,19 +85,20 @@ void CDiskReadMasterBase::init()
             free(ekey);
             if (!encrypted)
             {
-                Owned<IException> e = MakeActivityWarning(&container, TE_EncryptionMismatch, "Ignoring encryption key provided as file '%s' was not published as encrypted", helper->getFileName());
+                Owned<IException> e = MakeActivityWarning(&container, TE_EncryptionMismatch, "Ignoring encryption key provided as file '%s' was not published as encrypted", fileName.get());
                 container.queryJob().fireException(e);
             }
         }
         else if (encrypted)
-            throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", helper->getFileName());
+            throw MakeActivityException(this, 0, "File '%s' was published as encrypted but no encryption key provided", fileName.get());
     }
 }
 
 void CDiskReadMasterBase::serializeSlaveData(MemoryBuffer &dst, unsigned slave)
 {
     IHThorDiskReadBaseArg *helper = (IHThorDiskReadBaseArg *) queryHelper();
-    dst.append(helper->getFileName());
+    OwnedRoxieString fileName(helper->getFileName());
+    dst.append(fileName);
     dst.append(subfileLogicalFilenames.ordinality());
     if (subfileLogicalFilenames.ordinality())
     {
@@ -116,7 +118,10 @@ void CDiskReadMasterBase::done()
     if (!abortSoon) // in case query has relinquished control of file usage to another query (e.g. perists) 
     {
         if (0 != (helper->getFlags() & TDXupdateaccessed))
-            queryThorFileManager().updateAccessTime(container.queryJob(), helper->getFileName());
+        {
+            OwnedRoxieString fileName(helper->getFileName());
+            queryThorFileManager().updateAccessTime(container.queryJob(), fileName);
+        }
     }
 }
 
@@ -144,10 +149,11 @@ void CWriteMasterBase::publish()
 {
     if (published) return;
     published = true;
+    OwnedRoxieString fname(diskHelperBase->getFileName());
     if (!(diskHelperBase->getFlags() & (TDXtemporary|TDXjobtemp)))
     {
         StringBuffer scopedName;
-        queryThorFileManager().addScope(container.queryJob(), diskHelperBase->getFileName(), scopedName);
+        queryThorFileManager().addScope(container.queryJob(), fname, scopedName);
         updateActivityResult(container.queryJob().queryWorkUnit(), diskHelperBase->getFlags(), diskHelperBase->getSequence(), scopedName.str(), recordsProcessed);
     }
 
@@ -165,11 +171,11 @@ void CWriteMasterBase::publish()
             props.setPropInt64("@totalCRC", totalCRC);
         }
     }
-    container.queryTempHandler()->registerFile(diskHelperBase->getFileName(), container.queryOwner().queryGraphId(), diskHelperBase->getTempUsageCount(), TDXtemporary & diskHelperBase->getFlags(), getDiskOutputKind(diskHelperBase->getFlags()), &clusters);
+    container.queryTempHandler()->registerFile(fname, container.queryOwner().queryGraphId(), diskHelperBase->getTempUsageCount(), TDXtemporary & diskHelperBase->getFlags(), getDiskOutputKind(diskHelperBase->getFlags()), &clusters);
     if (!dlfn.isExternal())
     {
         bool mangle = 0 != (diskHelperBase->getFlags() & (TDXtemporary|TDXjobtemp));
-        queryThorFileManager().publish(container.queryJob(), diskHelperBase->getFileName(), mangle, *fileDesc, NULL, targetOffset);
+        queryThorFileManager().publish(container.queryJob(), fname, mangle, *fileDesc, NULL, targetOffset);
     }
 }
 
@@ -206,7 +212,8 @@ void CWriteMasterBase::preStart(size32_t parentExtractSz, const byte *parentExtr
     {
         if (0 == ((TDXvarfilename|TDXtemporary|TDXjobtemp) & diskHelperBase->getFlags()))
         {
-            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), diskHelperBase->getFileName(), false, true);
+            OwnedRoxieString fname(diskHelperBase->getFileName());
+            Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), fname, false, true);
             if (file)
             {
                 if (0 == (TDWextend+TDWoverwrite & diskHelperBase->getFlags()))
@@ -221,11 +228,12 @@ void CWriteMasterBase::init()
 {
     published = false;
     recordsProcessed = 0;
-    dlfn.set(diskHelperBase->getFileName());
+    OwnedRoxieString fname(diskHelperBase->getFileName());
+    dlfn.set(fname);
     if (diskHelperBase->getFlags() & TDWextend)
     {
         assertex(0 == (diskHelperBase->getFlags() & (TDXtemporary|TDXjobtemp)));
-        Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), diskHelperBase->getFileName(), false, true);
+        Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), fname, false, true);
         if (file.get())
         {
             fileDesc.setown(file->getFileDescriptor());
@@ -239,11 +247,17 @@ void CWriteMasterBase::init()
         bool overwriteok = 0!=(TDWoverwrite & diskHelperBase->getFlags());
         
         unsigned idx=0;
-        while (diskHelperBase->queryCluster(idx))
-            clusters.append(diskHelperBase->queryCluster(idx++));
+        while (true)
+        {
+            OwnedRoxieString cluster(diskHelperBase->getCluster(idx));
+            if(!cluster)
+                break;
+            clusters.append(cluster);
+            idx++;
+        }
         IArrayOf<IGroup> groups;
-        fillClusterArray(container.queryJob(), diskHelperBase->getFileName(), clusters, groups);
-        fileDesc.setown(queryThorFileManager().create(container.queryJob(), diskHelperBase->getFileName(), clusters, groups, overwriteok, diskHelperBase->getFlags()));
+        fillClusterArray(container.queryJob(), fname, clusters, groups);
+        fileDesc.setown(queryThorFileManager().create(container.queryJob(), fname, clusters, groups, overwriteok, diskHelperBase->getFlags()));
         if (1 == groups.ordinality())
             targetOffset = getGroupOffset(groups.item(0), container.queryJob().querySlaveGroup());
         IPropertyTree &props = fileDesc->queryProperties();
@@ -278,10 +292,11 @@ void CWriteMasterBase::init()
 
 void CWriteMasterBase::serializeSlaveData(MemoryBuffer &dst, unsigned slave)
 {
-    dst.append(diskHelperBase->getFileName());
+    OwnedRoxieString fname(diskHelperBase->getFileName());
+    dst.append(fname.get());
     if (diskHelperBase->getFlags() & TDXtemporary)
     {
-        unsigned usageCount = container.queryJob().queryWorkUnit().queryFileUsage(diskHelperBase->getFileName());
+        unsigned usageCount = container.queryJob().queryWorkUnit().queryFileUsage(fname);
         if (0 == usageCount) usageCount = diskHelperBase->getTempUsageCount();
         dst.append(usageCount);
     }

+ 1 - 0
thorlcr/activities/thdiskbase.ipp

@@ -49,6 +49,7 @@ class CWriteMasterBase : public CMasterActivity
     Owned<ProgressInfo> replicateProgress;
     __int64 recordsProcessed;
     bool published;
+    OwnedRoxieString filename;
     CDfsLogicalFileName dlfn;
 protected:
     StringArray clusters;

+ 5 - 4
thorlcr/activities/wuidread/thwuidread.cpp

@@ -32,9 +32,9 @@ public:
         IHThorWorkunitReadArg *helper = (IHThorWorkunitReadArg *)queryHelper();
         size32_t lenData;
         void *tempData;
-        const char *wuid = helper->queryWUID();
-        if (wuid)
-            queryCodeContext()->getExternalResultRaw(lenData, tempData, wuid, helper->queryName(), helper->querySequence(), helper->queryXmlTransformer(), helper->queryCsvTransformer());
+        OwnedRoxieString fromWuid(helper->getWUID());
+        if (fromWuid)
+            queryCodeContext()->getExternalResultRaw(lenData, tempData, fromWuid, helper->queryName(), helper->querySequence(), helper->queryXmlTransformer(), helper->queryCsvTransformer());
         else
             queryCodeContext()->getResultRaw(lenData, tempData, helper->queryName(), helper->querySequence(), helper->queryXmlTransformer(), helper->queryCsvTransformer());
         msg.clear();
@@ -79,7 +79,8 @@ CActivityBase *createWorkUnitActivityMaster(CMasterGraphElement *container)
 {
     StringBuffer diskFilename;
     IHThorWorkunitReadArg *wuReadHelper = (IHThorWorkunitReadArg *)container->queryHelper();
-    if (getWorkunitResultFilename(*container, diskFilename, wuReadHelper->queryWUID(), wuReadHelper->queryName(), wuReadHelper->querySequence()))
+    OwnedRoxieString fromWuid(wuReadHelper->getWUID());
+    if (getWorkunitResultFilename(*container, diskFilename, fromWuid, wuReadHelper->queryName(), wuReadHelper->querySequence()))
     {
         Owned<IHThorDiskReadArg> diskReadHelper = createWorkUnitReadArg(diskFilename, LINK(wuReadHelper));
         Owned<CActivityBase> retAct = createDiskReadActivityMaster(container, diskReadHelper);

+ 2 - 1
thorlcr/activities/xmlparse/thxmlparseslave.cpp

@@ -134,7 +134,8 @@ public:
                     break;
                 unsigned len;
                 helper->getSearchText(len, searchStr, nxt);
-                xmlParser.setown(createXMLParse(searchStr, len, helper->queryIteratorPath(), *this, xr_noRoot, helper->requiresContents()));
+                OwnedRoxieString xmlIteratorPath(helper->getXmlIteratorPath());
+                xmlParser.setown(createXMLParse(searchStr, len, xmlIteratorPath, *this, xr_noRoot, helper->requiresContents()));
             }
         }
         catch (IOutOfMemException *e)

+ 2 - 1
thorlcr/activities/xmlread/thxmlreadslave.cpp

@@ -81,7 +81,8 @@ class CXmlReadSlaveActivity : public CDiskReadSlaveActivityBase, public CThorDat
                 stream.set(crcStream);
             }
             inputIOstream.setown(createBufferedIOStream(stream));
-            xmlParser.setown(createXMLParse(*inputIOstream.get(), activity.helper->queryIteratorPath(), *this, (0 != (TDRxmlnoroot & activity.helper->getFlags()))?xr_noRoot:xr_none, 0 != (TDRusexmlcontents & activity.helper->getFlags())));
+            OwnedRoxieString xmlIterator(activity.helper->getXmlIteratorPath());
+            xmlParser.setown(createXMLParse(*inputIOstream.get(), xmlIterator, *this, (0 != (TDRxmlnoroot & activity.helper->getFlags()))?xr_noRoot:xr_none, 0 != (TDRusexmlcontents & activity.helper->getFlags())));
         }
         virtual void close(CRC32 &fileCRC)
         {

+ 3 - 2
thorlcr/activities/xmlwrite/thxmlwrite.cpp

@@ -40,11 +40,12 @@ public:
 
         IPropertyTree &props = fileDesc->queryProperties();
         StringBuffer rowTag;
-        const char * path = helper->queryIteratorPath();
-        if (!path)
+        OwnedRoxieString xmlpath(helper->getXmlIteratorPath());
+        if (!xmlpath)
             rowTag.append("Row");
         else
         {
+            const char *path = xmlpath;
             if (*path == '/') path++;
             if (strchr(path, '/')) UNIMPLEMENTED;
             rowTag.append(path);

+ 5 - 4
thorlcr/activities/xmlwrite/thxmlwriteslave.cpp

@@ -40,13 +40,14 @@ public:
     virtual void write()
     {
         StringBuffer rowTag;
-        const char * path = helper->queryIteratorPath();
-        if (!path)
+        OwnedRoxieString xmlpath(helper->getXmlIteratorPath());
+        if (!xmlpath)
         {
             rowTag.append("Row");
         }
         else
         {
+            const char *path = xmlpath;
             if (*path == '/') path++;
             if (strchr(path, '/')) UNIMPLEMENTED;
             rowTag.append(path);
@@ -56,7 +57,7 @@ public:
         CommonXmlWriter xmlWriter(helper->getXmlFlags());
         if (!dlfn.isExternal() || firstNode()) // if external, 1 header,footer
         {
-            const char * header = helper->queryHeader();
+            OwnedRoxieString header(helper->getHeader());
             if (header)
                 xmlOutput.clear().append(header);
             else
@@ -80,7 +81,7 @@ public:
         }
         if (!dlfn.isExternal() || lastNode()) // if external, 1 header,footer
         {
-            const char * footer = helper->queryFooter();
+            OwnedRoxieString footer(helper->getFooter());
             if (footer)
                 xmlOutput.clear().append(footer);
             else

+ 0 - 2
thorlcr/graph/thgraph.cpp

@@ -961,9 +961,7 @@ bool isGlobalActivity(CGraphElementBase &container)
         case TAKstreamediterator:
         case TAKworkunitread:
         case TAKchilddataset:
-        case TAKtemptable:
         case TAKinlinetable:
-        case TAKtemprow:
         case TAKnull:
         case TAKemptyaction:
         case TAKlocalresultread:

+ 2 - 3
thorlcr/graph/thgraph.hpp

@@ -474,12 +474,11 @@ class graph_decl CGraphBase : public CInterface, implements ILocalGraph, impleme
         virtual char *getResultVarString(const char * name, unsigned sequence) { return ctx->getResultVarString(name, sequence); }
         virtual UChar *getResultVarUnicode(const char * name, unsigned sequence) { return ctx->getResultVarUnicode(name, sequence); }
         virtual unsigned getResultHash(const char * name, unsigned sequence) { return ctx->getResultHash(name, sequence); }
+        virtual const char *cloneVString(const char *str) const { return ctx->cloneVString(str); }
+        virtual const char *cloneVString(size32_t len, const char *str) const { return ctx->cloneVString(len, str); }
         virtual char *getWuid() { return ctx->getWuid(); }
         virtual void getExternalResultRaw(unsigned & tlen, void * & tgt, const char * wuid, const char * stepname, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer) { ctx->getExternalResultRaw(tlen, tgt, wuid, stepname, sequence, xmlTransformer, csvTransformer); }
         virtual void executeGraph(const char * graphName, bool realThor, size32_t parentExtractSize, const void * parentExtract) { ctx->executeGraph(graphName, realThor, parentExtractSize, parentExtract); }
-        virtual __int64 countDiskFile(const char * lfn, unsigned recordSize) { return ctx->countDiskFile(lfn, recordSize); }
-        virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg) { return ctx->countIndex(activityId, arg); }
-        virtual __int64 countDiskFile(__int64 activityId, IHThorCountFileArg & arg) { return ctx->countDiskFile(activityId, arg); }
         virtual char * getExpandLogicalName(const char * logicalName) { return ctx->getExpandLogicalName(logicalName); }
         virtual void addWuException(const char * text, unsigned code, unsigned severity) { ctx->addWuException(text, code, severity); }
         virtual void addWuAssertFailure(unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, bool isAbort) { ctx->addWuAssertFailure(code, text, filename, lineno, column, isAbort); }

+ 3 - 46
thorlcr/graph/thgraphmaster.cpp

@@ -47,6 +47,8 @@
 #include "thmem.hpp"
 #include "thcompressutil.hpp"
 
+using roxiemem::OwnedRoxieString;
+
 static CriticalSection *jobManagerCrit;
 MODULE_INIT(INIT_PRIORITY_STANDARD)
 {
@@ -480,7 +482,7 @@ bool CMasterGraphElement::checkUpdate()
         return false;
 
     bool doCheckUpdate = false;
-    StringAttr filename;
+    OwnedRoxieString filename;
     unsigned eclCRC;
     unsigned __int64 totalCRC;
     bool temporary = false;
@@ -1037,51 +1039,6 @@ public:
             throw MakeStringException(TE_FailedToRetrieveWorkunitValue, "Failed to retrieve external data value %s from workunit %s", stepname, wuid);
         }
     }
-    virtual __int64 countDiskFile(const char * name, unsigned recordSize)
-    {
-        unsigned __int64 size = 0;
-        Owned<IDistributedFile> f = queryThorFileManager().lookup(job, name);
-        if (f) 
-        {
-            size = f->getFileSize(true,false);
-            if (size % recordSize)
-                throw MakeStringException(9001, "File %s has size %"I64F"d which is not a multiple of record size %d", name, size, recordSize);
-            return size / recordSize;
-        }
-        DBGLOG("Error could not resolve file %s", name);
-        throw MakeStringException(9003, "Error could not resolve %s", name);
-    }
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg) { UNIMPLEMENTED; }
-    virtual __int64 countDiskFile(__int64 id, IHThorCountFileArg & arg)
-    {
-        // would have called the above function in a try block but corrupted registers whenever I tried.
-
-        Owned<IHThorCountFileArg> a = &arg;  // make sure it gets destroyed....
-        arg.onCreate(this, NULL, NULL);
-        arg.onStart(NULL, NULL);
-
-        const char *name = arg.getFileName();
-        Owned<IDistributedFile> f = queryThorFileManager().lookup(job, name, 0 != ((TDXtemporary|TDXjobtemp) & arg.getFlags()));
-        if (f) 
-        {
-            IOutputMetaData * rs = arg.queryRecordSize();
-            assertex(rs->isFixedSize());
-            unsigned recordSize = rs->getMinRecordSize();
-            unsigned __int64 size = f->getFileSize(true,false);
-            if (size % recordSize)
-            {
-                throw MakeStringException(0, "Physical file %s has size %"I64F"d which is not a multiple of record size %d", name, size, recordSize);
-            }
-            return size / recordSize;
-        }
-        else if (arg.getFlags() & TDRoptional)
-            return 0;
-        else
-        {
-            PrintLog("Error could not resolve file %s", name);
-            throw MakeStringException(0, "Error could not resolve %s", name);
-        }
-    }
     virtual void addWuException(const char * text, unsigned code, unsigned severity)
     {
         DBGLOG("%s", text);

+ 0 - 3
thorlcr/graph/thgraphslave.cpp

@@ -934,9 +934,6 @@ public:
 
     virtual void getExternalResultRaw(unsigned & tlen, void * & tgt, const char * wuid, const char * stepname, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer) { throwUnexpected(); }
 
-    virtual __int64 countDiskFile(const char * lfn, unsigned recordSize) { throwUnexpected(); } 
-    virtual __int64 countIndex(__int64 activityId, IHThorCountIndexArg & arg) { throwUnexpected(); }
-    virtual __int64 countDiskFile(__int64 id, IHThorCountFileArg & arg) { throwUnexpected(); }
     virtual void addWuException(const char * text, unsigned code, unsigned severity)
     {
         DBGLOG("%s", text);

+ 4 - 3
thorlcr/master/thactivitymaster.cpp

@@ -96,7 +96,10 @@ public:
             IHThorDiskReadArg *diskHelper = QUERYINTERFACE(helper, IHThorDiskReadArg);
             mb.append(NULL != diskHelper); // flag to slaves that they should create diskread
             if (diskHelper)
-                mb.append(diskHelper->getFileName());
+            {
+                OwnedRoxieString fileName(diskHelper->getFileName());
+                mb.append(fileName);
+            }
         }
     }
     virtual CActivityBase *factory(ThorActivityKind kind)
@@ -123,9 +126,7 @@ public:
             case TAKnormalize:
             case TAKnormalizechild:
             case TAKnormalizelinkedchild:
-            case TAKtemptable:
             case TAKinlinetable:
-            case TAKtemprow:
             case TAKpull:
             case TAKnull:
             case TAKpiperead:

+ 0 - 4
thorlcr/slave/slave.cpp

@@ -481,10 +481,6 @@ public:
             case TAKapply:
                 ret = createApplySlave(this);
                 break;
-            case TAKtemptable:
-            case TAKtemprow:
-                ret = createTempTableSlave(this);
-                break;
             case TAKinlinetable:
                 ret = createInlineTableSlave(this);
                 break;

+ 10 - 0
thorlcr/thorcodectx/thcodectx.cpp

@@ -97,6 +97,16 @@ IEngineRowAllocator * CThorCodeContextBase::getRowAllocator(IOutputMetaData * me
     return job.getRowAllocator(meta, activityId);
 }
 
+const char * CThorCodeContextBase::cloneVString(const char * str) const
+{
+    return job.queryRowManager()->cloneVString(str);
+}
+
+const char * CThorCodeContextBase::cloneVString(size32_t len, const char * str) const
+{
+    return job.queryRowManager()->cloneVString(len, str);
+}
+
 ILocalGraph *CThorCodeContextBase::resolveLocalQuery(__int64 gid)
 {
     ILocalGraph *graph = job.getGraph((graph_id)gid);

+ 2 - 0
thorlcr/thorcodectx/thcodectx.hpp

@@ -108,6 +108,8 @@ public:
     virtual char *getGroupName(); // thorlib.group()
     virtual char *queryIndexMetaData(char const * lfn, char const * xpath) { UNIMPLEMENTED; }
     virtual IEngineRowAllocator * getRowAllocator(IOutputMetaData * meta, unsigned activityId) const;
+    virtual const char *cloneVString(const char *str) const;
+    virtual const char *cloneVString(size32_t len, const char *str) const;
     virtual ILocalGraph *resolveLocalQuery(__int64 gid);
     virtual IThorChildGraph * resolveChildQuery(__int64 activityId, IHThorArg * colocal);
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags);

+ 1 - 1
thorlcr/thorutil/thmem.hpp

@@ -52,7 +52,7 @@ interface ICompare;
 #define ReleaseClearThorRow(row) ReleaseClearRoxieRow(row)
 #define LinkThorRow(row) LinkRoxieRow(row)
 
-
+using roxiemem::OwnedRoxieString;
 
 graph_decl void setThorInABox(unsigned num);