Browse Source

Merge branch 'candidate-6.4.2'

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 8 years ago
parent
commit
96d2908987

+ 1 - 0
clienttools/IDEPlugins/ESDL/esdl.bat.in

@@ -40,6 +40,7 @@ if %action%==Commit goto genecl
 if %action%==Submit goto publish
 if %action%==Generate goto genecl
 if %action%==Custom1 goto publish
+if %action%==Unknown goto publish
 if %action%==Custom2 goto genecl
 if %action%==Custom3 goto eof
 if %action%==Custom4 goto eof

+ 15 - 0
common/remote/sockfile.cpp

@@ -2315,6 +2315,21 @@ public:
         // then also send sMode, cFlags
         unsigned short sMode = parent->getShareMode();
         unsigned short cFlags = parent->getCreateFlags();
+        switch ((compatIFSHmode)_compatmode)
+        {
+            case compatIFSHnone:
+                sMode = IFSHnone;
+                break;
+            case compatIFSHread:
+                sMode = IFSHread;
+                break;
+            case compatIFSHwrite:
+                sMode = IFSHfull;
+                break;
+            case compatIFSHall:
+                sMode = IFSHfull;
+                break;
+        }
         sendBuffer.append((RemoteFileCommandType)RFCopenIO).append(localname).append((byte)_mode).append((byte)_compatmode).append((byte)_extraFlags).append(sMode).append(cFlags);
         parent->sendRemoteCommand(sendBuffer, replyBuffer);
 

+ 12 - 3
common/workunit/workunit.cpp

@@ -2010,7 +2010,7 @@ mapEnums workunitSortFields[] =
    { WUSFpriority, "@priorityClass" },
    { WUSFprotected, "@protected" },
    { WUSFwuid, "@" },
-   { WUSFecl, "Query/Text" },
+   { WUSFecl, "Query/ShortText" },
    { WUSFfileread, "FilesRead/File/@name" },
    { WUSFtotalthortime, "@totalThorTime|"
                         "Statistics/Statistic[@c='summary'][@creator='thor'][@kind='TimeElapsed']/@value|"
@@ -7403,7 +7403,10 @@ void CLocalWUQuery::setQueryType(WUQueryType qt)
 
 IStringVal& CLocalWUQuery::getQueryText(IStringVal &str) const
 {
-    str.set(p->queryProp("Text"));
+    const char *text = p->queryProp("Text");
+    if (!text)
+        text = p->queryProp("ShortText");
+    str.set(text);
     return str;
 }
 
@@ -7488,10 +7491,10 @@ unsigned CLocalWUQuery::getQueryDllCrc() const
 
 void CLocalWUQuery::setQueryText(const char *text)
 {
-    p->setProp("Text", text);
     bool isArchive = isArchiveQuery(text);
     if (isArchive)
     {
+        p->setProp("Text", text);
         Owned<IPropertyTree> xml = createPTreeFromXMLString(text, ipt_caseInsensitive|ipt_lowmem);
         const char * path = xml->queryProp("Query/@attributePath");
         if (path)
@@ -7503,6 +7506,12 @@ void CLocalWUQuery::setQueryText(const char *text)
         else
             p->setProp("ShortText", xml->queryProp("Query"));
     }
+    else
+    {
+        p->setProp("Text", text);     // At some point in the future we may be able to remove this,
+                                      // but as long as there may be new workunits compiled by old systems, we can't
+        p->setProp("ShortText", text);
+    }
     p->setPropBool("@isArchive", isArchive);
     if (isArchive)
         p->setPropBool("@hasArchive", true); //preserved if setQueryText is called multiple times.  Should setting this be more explicit?

+ 30 - 8
docs/DynamicESDL/DESDL-Mods/ESDLget_data_from.xml

@@ -1,11 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
- 
-   <sect2 id="ESDL_Attributes_get_data_from">
-      <title>get_data_from ("<emphasis role="bold">field</emphasis><emphasis
-      role="bold">")</emphasis></title>
-
-      <para>For code reuse and simplification, when complex versioning changes
-      have been made.</para>
-    </sect2>
+<sect1 id="ESDL_Attributes_get_data_from">
+  <title><emphasis role="bold">get_data_from</emphasis></title>
+
+  <para><indexterm>
+      <primary>get_data_from</primary>
+    </indexterm>The get_data_from attribute allows you to specify that a field
+  gets its data from another variable. This supports code reuse when complex
+  versioning changes are made.</para>
+
+  <para><emphasis role="bold">Example:</emphasis></para>
+
+  <programlisting>ESPresponse RoxieEchoPersonInfoResponse
+{
+  ESPstruct NameInfo Name;
+  string Var1;
+  [get_data_from("Var1")] string Var2;
+};
+</programlisting>
+
+  <para>In the example above, the query returns the data in Var1 then the
+  service puts the data into the Var2 field and sends that in the response to
+  the client. </para>
+
+  <para>In this example both Var1 and Var2 are in the response to the client.
+  Typically, Var1 and Var2 are in non-overlapping versions so only one will be
+  in the response depending on the version specified. </para>
+
+  <para>Since the get_data_from attribute supports complex data types, such as
+  an ESPstruct, the fields do not have to be limited to string types.</para>
+</sect1>

+ 47 - 0
docs/DynamicESDL/DESDL-Mods/ESDLoptional.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<sect1 id="ESDL_Attributes_optional">
+  <title><emphasis role="bold">optional</emphasis></title>
+
+  <para><indexterm>
+      <primary>optional</primary>
+    </indexterm>The optional attribute allows you to specify that a field is
+  optional and is hidden or not depending on the absence or presence of a URL
+  decoration.</para>
+
+  <para>When a field has an optional attribute, the field is visible only when
+  the option appears on the URL. But when the option starts with an
+  exclamation point (!), then the field is hidden only if the option is in the
+  URL.</para>
+
+  <para><emphasis role="bold">Example:</emphasis></para>
+
+  <programlisting>ESPrequest RoxieEchoPersonInfoRequest
+{
+     ESPstruct NameInfo Name;
+                            string First;
+                            string Middle;
+                            string Last;
+     [optional("dev")]      string NickName;
+     [optional("!_NonUS_")] string SSN;
+};</programlisting>
+
+  <para>Assuming the service is running on a server with the hostname of
+  example.com and the service binding is set to 8003:</para>
+
+  <para>If the URL is <programlisting>http://example.com:8003/ </programlisting></para>
+
+  <para>then SSN is visible and NickName is hidden;</para>
+
+  <para>If the URL is <programlisting>http://example.com:8003/?dev </programlisting></para>
+
+  <para>then SSN and NickName are both visible</para>
+
+  <para>If the URL is <programlisting>http://example.com:8003/?dev&amp;_NonUS_ </programlisting></para>
+
+  <para>then NickName is visible and SSN is hidden.</para>
+
+  <para>If the URL is <programlisting>http://example.com:8003/?_NonUS_</programlisting>
+  then both NickName and SSN are hidden.</para>
+</sect1>

+ 6 - 0
docs/DynamicESDL/ESDL_LangRef_Includer.xml

@@ -231,6 +231,12 @@
     <xi:include href="DynamicESDL/DESDL-Mods/ESDLdepr_ver.xml"
                 xpointer="element(/1)"
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="DynamicESDL/DESDL-Mods/ESDLget_data_from.xml"
+                xpointer="element(/1)"
+                xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="DynamicESDL/DESDL-Mods/ESDLoptional.xml"
+                xpointer="element(/1)"
+                xmlns:xi="http://www.w3.org/2001/XInclude" />
 
     <xi:include href="DynamicESDL/DESDL-Mods/ESDLhelp.xml"
                 xpointer="element(/1)"

+ 1 - 1
docs/ECLStandardLibraryReference/SLR-Mods/GetLogicalFileAttribute.xml

@@ -86,7 +86,7 @@ OUTPUT(STD.File.GetLogicalFileAttribute(file,'workunit'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'accessed'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'maxRecordSize'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'csvQuote'));
-OUTPUT(STD.File.GetLogicalFileAttribute(file,'blockCompressed '));
+OUTPUT(STD.File.GetLogicalFileAttribute(file,'blockCompressed'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'compressedSize'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'fileCrc'));
 OUTPUT(STD.File.GetLogicalFileAttribute(file,'formatCrc'));

+ 4 - 4
docs/ECLWatch/ECLWa_mods/ECLWatchSrc.xml

@@ -294,7 +294,7 @@
         </variablelist>
 
         <para>When you specify any Filter options, the Filter Action button
-        displays <emphasis>Filter Set</emphasis>. <figure>
+        displays <emphasis role="bold">Filter Set</emphasis>. <figure>
             <title>Filter Set</title>
 
             <mediaobject>
@@ -1511,7 +1511,7 @@
 
             <listitem>
               <para>Select the <emphasis role="bold">Superfiles</emphasis> tab
-              (when enabled) to display the super file information. </para>
+              (when enabled) to display the superfile information.</para>
             </listitem>
 
             <listitem>
@@ -1526,8 +1526,8 @@
 
             <listitem>
               <para>Select the <emphasis role="bold">Graphs</emphasis> tab
-              (when enabled) to display any graphs associated with the file.
-              </para>
+              (when enabled) to display any graphs associated with the
+              file.</para>
             </listitem>
 
             <listitem>

+ 461 - 283
docs/ECLWatch/TheECLWatchMan.xml

@@ -42,15 +42,18 @@
       <para></para>
     </legalnotice>
 
-    <xi:include href="common/Version.xml" xpointer="xpointer(//*[@id='FooterInfo'])"
+    <xi:include href="common/Version.xml"
+                xpointer="xpointer(//*[@id='FooterInfo'])"
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
 
-    <xi:include href="common/Version.xml" xpointer="xpointer(//*[@id='DateVer'])"
+    <xi:include href="common/Version.xml"
+                xpointer="xpointer(//*[@id='DateVer'])"
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
 
     <corpname>HPCC Systems<superscript>®</superscript></corpname>
 
-    <xi:include href="common/Version.xml" xpointer="xpointer(//*[@id='Copyright'])"
+    <xi:include href="common/Version.xml"
+                xpointer="xpointer(//*[@id='Copyright'])"
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
 
     <mediaobject role="logo">
@@ -63,20 +66,442 @@
   <chapter id="ECLWatch_Intro">
     <title>Introducing ECL Watch</title>
 
-    <sect1 id="ECLWatch_Introduction" role="nobrk">
-      <title>Introduction</title>
+    <para>ECL Watch is a service that runs on the Enterprise Services Platform
+    (ESP), a middleware component on the HPCC Platform.</para>
+
+    <para>ECL Watch provides an interface to the HPCC system and allows you to
+    view information and interrogate nodes to confirm all expected processes
+    are running. It is a plugin that is useful for Systems Administrators to
+    check processes, examine topology, and view logs. It is useful to ECL
+    Programmers to monitor the status of jobs and files, and other pertinent
+    information. This provides a simple view into the system and a means to
+    perform Workunit and data files maintenance.</para>
+
+    <para>The ECL Watch interface is a browser based set of pages where you
+    can access and interface with the HPCC System. To Run <emphasis
+    role="bold">ECL Watch</emphasis> using you browser, go to the node on your
+    system running <emphasis role="bold">ESP/ECL Watch</emphasis> on port
+    8010. For example, http://nnn.nnn.nnn.nnn:8010, where nnn.nnn.nnn.nnn is
+    your ESP/ECL Watch node's IP address. This will launch ECL Watch.</para>
+
+    <para>ECL Watch is organized by categories based on several system
+    functions. These functions or actions are accessible through the links
+    along the top of the main home page. However there are several ECL Watch
+    items with common functionality universally across pages of ECL
+    Watch.</para>
+
+    <sect1 id="Common_Elements">
+      <title>Common Elements</title>
+
+      <para>There are common elements that are useful anywhere within ECL
+      Watch.</para>
+
+      <sect2 id="OpenInNewPage">
+        <title>Open in New Page</title>
+
+        <para>The <emphasis role="bold">Open in New Page</emphasis> link
+        allows you to open a new window directly to the item which you are
+        viewing. <figure>
+            <title>Open in New Page</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA500.jpg" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+
+        <para>Opening a new page of the current view is useful in several
+        ways:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><emphasis role="bold">Open in New Page</emphasis> is a
+            shareable link. Right-click on <emphasis role="bold">Open in New
+            Page</emphasis> and select <emphasis>Copy link address</emphasis>
+            from the context menu. You can now save, share, or send that link
+            and the recipient can open a window directly to the (new)
+            page.</para>
+          </listitem>
+
+          <listitem>
+            <para>New pages maintain filter states. If you have set a filter
+            and share that link, the new page has the same filter set.</para>
+          </listitem>
+
+          <listitem>
+            <para>The new page is live. (If that page has auto-refresh
+            enabled) The recipient doesn't need to reset the page or refresh
+            to see current state.</para>
+          </listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="ListWidgets">
+        <title>List widgets</title>
+
+        <para><figure>
+            <title>List Widgets</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA-Comm.jpg" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+
+        <para>ECL Watch commonly displays items in the forms of a list. Lists
+        of workunits, lists of logical files, lists of Roxie queries, etc. The
+        following elements in ECL Watch work on any list widget:</para>
+
+        <para><itemizedlist>
+            <listitem>
+              <para>Download as CSV (Workunits, DFU Workunits, Logical files,
+              and Roxie queries)</para>
+            </listitem>
+
+            <listitem>
+              <para>Column check box. Select all rows by selecting the check
+              box at top (Use Shift+Click to select a range)</para>
+            </listitem>
+
+            <listitem>
+              <para>Sort by column header. Click on the column header to sort
+              that column according to that column's contents.</para>
+            </listitem>
+
+            <listitem>
+              <para>Resize Column Widths by dragging the borders.</para>
+            </listitem>
+
+            <listitem>
+              <para>Filters that allow you to set criteria for the items to
+              display in the list.</para>
+            </listitem>
+          </itemizedlist></para>
+
+        <sect3>
+          <title>List Filters</title>
+
+          <para>Filter options on a list allow you to use specified criteria
+          to set what you display in the list. Press the <emphasis
+          role="bold">Filter</emphasis> action button to display the filter
+          options. When you specify any Filter options, the Filter action
+          button changes and then displays <emphasis role="bold">Filter
+          Set</emphasis> and the filter indicator image lights up. When you
+          then copy an <emphasis role="bold">Open in New Page</emphasis> link
+          with the filter set, the filter condition persists. Filter
+          conditions limit the results displayed until you clear the
+          filter.</para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="ECLWA_BannerItems">
+        <title>Banner Items</title>
+
+        <para>The banner area of ECL Watch appears at the top of all pages.
+        </para>
+
+        <sect3 id="ECLWAtchHomeButton">
+          <title>Home Button</title>
+
+          <para>The HPCC Systems home button is also the main Activity menu
+          link. More than just a decoration the home ECL Watch button actually
+          opens up the Activity page, discussed in more detail in the ensuing
+          chapter.</para>
+
+          <para>The icons to the left of the home button are links to
+          different areas of ECL Watch. Each of the link areas are discussed
+          in subsequent chapters.</para>
+        </sect3>
+
+        <sect3 id="MonitorIndicatorLight">
+          <title>Monitor indicator light</title>
+
+          <para>The Monitor indicator light is used to provide an at a glance
+          snapshot of your overall system health. If you have monitoring and
+          reporting configured (see <emphasis>HPCC Monitoring and
+          Reporting</emphasis>) then this light will display a color based on
+          the the overall (configurable) system health. The light is black if
+          there is no monitoring or reporting configured for your
+          system.</para>
+        </sect3>
+
+        <sect3 id="DownloadAsCSV">
+          <title>Download as CSV</title>
+
+          <para>With most lists in ECL Watch you have the ability to download
+          selected rows as a CSV formatted file. You can then open the CSV
+          file in any spreadsheet application which supports CSV
+          format.</para>
+        </sect3>
+      </sect2>
+
+      <sect2 id="ECLWatch_GlobalSearch">
+        <title>Global Search</title>
+
+        <para>The global search box can be found on the navigation bar at the
+        top of the ECL Watch page.<figure>
+            <title>Global Search box</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA008.jpg" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+
+        <para>You can search ECL Workunits, DFU Workunits, Logical Files, and
+        Queries using the global search box. The global search box also
+        supports using wildcards. To limit or filter your search results you
+        can use keywords as displayed in the empty search box.</para>
+
+        <para><variablelist>
+            <varlistentry>
+              <term>file:</term>
+
+              <listitem>
+                <para>Preface the search string with
+                <emphasis>file:</emphasis> to search Logical Files.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>wuid:</term>
+
+              <listitem>
+                <para>Preface the search string with
+                <emphasis>wuid:</emphasis> to search only Workunit ids.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>ecl:</term>
+
+              <listitem>
+                <para>Preface the search string with <emphasis>ecl:</emphasis>
+                to search only the ECL workunits.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>dfu:</term>
+
+              <listitem>
+                <para>Preface the search string with <emphasis>dfu:</emphasis>
+                to search only DFU workunits.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>query:</term>
+
+              <listitem>
+                <para>Preface the search string with
+                <emphasis>query:</emphasis> to search only published
+                queries.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>Examples of using the global search:</para>
+
+        <para>Enter <emphasis>W201510*</emphasis> into the search box, and it
+        will return all of the workunits from October 2015.</para>
+
+        <para>Enter <emphasis>file:keys</emphasis> into the search box, and it
+        will return all of the logical files that contain "keys". <figure>
+            <title>Global Search Example</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA015.jpg" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+
+        <!-- Enter <i>ecl:output</i> into the global search box and it will return all of the workunits that contain "output" in the ECL page of ECL Watch-->
+      </sect2>
+
+      <sect2>
+        <title>Advanced Menu</title>
+
+        <para>There is a section at the top right on the navigation bar with
+        some useful information and features. This section shows you who you
+        are logged in as (if your system has authentication enabled). The
+        Advanced menu is located on the right hand side of the navigation bar.
+        There are several items that you can access from the advanced
+        menu.</para>
+
+        <para><figure>
+            <title>Advanced menu</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA007b.jpg" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+
+        <para>There may be a number displayed on the menu link. A number
+        displayed next to it indicates how many errors and warnings have been
+        generated during your session. Click on the advanced menu to display a
+        list of features.</para>
+
+        <sect3 id="ECLWatch_AdvancedMenuAccess">
+          <title>Access the Advanced menu</title>
+
+          <para>You access the advanced menu items from the advanced menu link
+          at the top right corner of ECL Watch.<!--Removed some content stashed in GitStash : ECLWA-1115.xml others culled stored in git-br H8872-NewestECLfor50 **--></para>
+
+          <para>The <emphasis role="bold">Set Banner</emphasis> link allows
+          you to set a custom banner message at the top of your browser window
+          when you open ECL Watch. You can use this feature to send messages
+          to users.</para>
+
+          <para>The <emphasis role="bold">Error/Warning(s)</emphasis> link
+          displays a tab showing you Errors, Warnings, and Information
+          messages. You can filter this page by checking the boxes at the
+          bottom of the tab. A copy facility is also provided.</para>
+
+          <para>The <emphasis role="bold">Transition Guide</emphasis> link
+          opens a new browser tab to the page where you can find more
+          information about transitioning from using the previous version of
+          HPCC and ECL Watch.</para>
+
+          <para>The <emphasis role="bold">Additional Resources</emphasis> link
+          opens submenu with links to the HPCC
+          Systems<superscript>®</superscript> <emphasis
+          role="bold">Downloads</emphasis> page, where you can browse and
+          download additional HPCC resources. It also has links to <emphasis
+          role="bold">Issue Reporting</emphasis>, <emphasis
+          role="bold">Forums</emphasis>, and the HPCC <emphasis
+          role="bold">Red Book</emphasis>.</para>
+
+          <para>The <emphasis role="bold">Configuration</emphasis> link opens
+          for viewing the XML version of the configuration file in use on your
+          system.</para>
+
+          <para>The <emphasis role="bold">About</emphasis> link opens a dialog
+          to display some information about the version of the HPCC platform
+          and graph controls installed on your server.</para>
+        </sect3>
+
+        <sect3 id="ECLWatch_AdvancedMenuLoggedInAs" role="nobrk">
+          <title>Logged In As</title>
+
+          <para>The <emphasis role="bold">Logged In As:</emphasis> link at the
+          top of the ECL Watch page displays information about the current
+          user on a cluster configured for authentication. <figure>
+              <title>Logged In As</title>
+
+              <mediaobject>
+                <imageobject>
+                  <imagedata fileref="images/ECLWMyAccount.jpg" />
+                </imageobject>
+              </mediaobject>
+            </figure></para>
+
+          <para><orderedlist>
+              <listitem>
+                <para>Click on the <emphasis role="bold"><emphasis
+                role="bold">LOGGED IN AS:</emphasis></emphasis> link.</para>
+
+                <para>The User Details window opens. The default window opens
+                on the Summary tab.</para>
+
+                <para><figure>
+                    <title>User Details window</title>
+
+                    <mediaobject>
+                      <imageobject>
+                        <imagedata fileref="images/ECLWA474.jpg" />
+                      </imageobject>
+                    </mediaobject>
+                  </figure></para>
+              </listitem>
+
+              <listitem>
+                <para>From The User Details page Summary tab, you can Confirm
+                the User Name that you are logged in as.</para>
+
+                <para>You can change your password.</para>
+
+                <para>Note that Administrator rights are needed to manage
+                users and permissions.</para>
+
+                <para>Ensure you are using an account with Administrator
+                rights if you intend to manage users or permissions.</para>
+              </listitem>
+
+              <listitem>
+                <para>Verify the password expiration date, or if password is
+                set to expire.</para>
+              </listitem>
+            </orderedlist></para>
+
+          <sect4 id="ECLWatch_AdvancedMenuChangePassword" role="nobrk">
+            <title>Change Password</title>
 
-      <para>ECL Watch is a service that runs on the Enterprise Services
-      Platform (ESP), a middleware component on the HPCC Platform.</para>
+            <para>If authentication is enabled on your HPCC system, you can
+            change your password, right from the User Details window.
+            <orderedlist>
+                <listitem>
+                  <para>Click on the <emphasis role="bold"><emphasis
+                  role="bold">LOGGED IN AS:</emphasis></emphasis> link.</para>
 
-      <para>ECL Watch provides an interface to the HPCC system and allows you
-      to view information and interrogate nodes to confirm all expected
-      processes are running. It is a plugin that is useful for Systems
-      Administrators to check processes, examine topology, and view logs. It
-      is useful to ECL Programmers to monitor the status of jobs and files,
-      and other pertinent information. This provides a simple view into the
-      system and a means to perform Workunit and data files
-      maintenance.</para>
+                  <para>The User Details window opens. The default window
+                  opens on the Summary tab. There are fields on the Summary
+                  tab where you can change your password.</para>
+                </listitem>
+
+                <listitem>
+                  <para>Enter your desired new password.</para>
+
+                  <para>Make sure it meets whatever criteria your system may
+                  have for passwords.</para>
+                </listitem>
+
+                <listitem>
+                  <para>Confirm your new password.</para>
+
+                  <para>Make sure that it matches the password you entered in
+                  the previous field.</para>
+                </listitem>
+
+                <listitem>
+                  <para>Press the Save button. It is in the upper left portion
+                  of the window.</para>
+                </listitem>
+              </orderedlist></para>
+          </sect4>
+
+          <sect4 id="ECLWatch_AdvancedMenuPermissionGroups">
+            <title>Permission groups</title>
+
+            <para>The second tab on the User Details window labelled Member
+            Of, displays a list of groups. The groups your account belongs to,
+            are indicated with a checkmark.</para>
+
+            <para>You must be an administrator to modify any of group
+            settings.</para>
+          </sect4>
+
+          <sect4 id="ECLWatch_AdvancedMenuUserPermissions">
+            <title>User Permissions tab</title>
+
+            <para>The third tab on the User Details window labelled <emphasis
+            role="bold">User Permissions</emphasis>, displays a list of
+            permission settings. Note that Administrator rights are needed to
+            manage users and permissions. Ensure you are using an account with
+            Administrator rights if you intend to manage users or
+            permissions.</para>
+
+            <para>This is where you can access the user permissions area. A
+            more detailed description of the user permissions settings is
+            covered in the <link linkend="User_Permissions_Chapter">User
+            Permissions</link> section.</para>
+          </sect4>
+        </sect3>
+      </sect2>
     </sect1>
   </chapter>
 
@@ -567,98 +992,6 @@
     <xi:include href="ECLScheduler/ECLSched-Mods/ECLSchedComp.xml"
                 xpointer="xpointer(//*[@id='ECLSched_Interface'])"
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
-
-    <sect1>
-      <title>Search Results</title>
-
-      <para>The <emphasis role="bold">Search Results</emphasis> tab displays
-      when you perform a search. The search capabilities of ECL Watch are a
-      very powerful tool.</para>
-
-      <sect2 id="ECLWatch_GlobalSearch">
-        <title>Global Search</title>
-
-        <para>The global search box can be found on the navigation bar at the
-        top of the ECL Watch page.<figure>
-            <title>Global Search box</title>
-
-            <mediaobject>
-              <imageobject>
-                <imagedata fileref="images/ECLWA008.jpg" />
-              </imageobject>
-            </mediaobject>
-          </figure></para>
-
-        <para>You can search ECL Workunits, DFU Workuntis, Logical Files, and
-        Queries using the global search box. The global search box also
-        supports wild cards. To limit or filter your search results you can
-        use keywords as displayed in the empty search box.</para>
-
-        <para><variablelist>
-            <varlistentry>
-              <term>file:</term>
-
-              <listitem>
-                <para>Preface the search string with
-                <emphasis>file:</emphasis> to search Logical Files.</para>
-              </listitem>
-            </varlistentry>
-
-            <varlistentry>
-              <term>wuid:</term>
-
-              <listitem>
-                <para>Preface the search string with
-                <emphasis>wuid:</emphasis> to search only Workunit ids.</para>
-              </listitem>
-            </varlistentry>
-
-            <varlistentry>
-              <term>ecl:</term>
-
-              <listitem>
-                <para>Preface the search string with <emphasis>ecl:</emphasis>
-                to search only the ECL workunits.</para>
-              </listitem>
-            </varlistentry>
-
-            <varlistentry>
-              <term>dfu:</term>
-
-              <listitem>
-                <para>Preface the search string with <emphasis>dfu:</emphasis>
-                to search only DFU workunits.</para>
-              </listitem>
-            </varlistentry>
-
-            <varlistentry>
-              <term>query:</term>
-
-              <listitem>
-                <para>Preface the search string with
-                <emphasis>query:</emphasis> to search only published
-                queries.</para>
-              </listitem>
-            </varlistentry>
-          </variablelist>Examples of using the global search:</para>
-
-        <para>Enter <emphasis>W201510*</emphasis> into the search box, and it
-        will return all of the workunits from October 2015.</para>
-
-        <para>Enter <emphasis>file:keys</emphasis> into the search box, and it
-        will return all of the logical files that contain "keys". <figure>
-            <title>Global Search Example</title>
-
-            <mediaobject>
-              <imageobject>
-                <imagedata fileref="images/ECLWA015.jpg" />
-              </imageobject>
-            </mediaobject>
-          </figure></para>
-
-        <!-- Enter <i>ecl:output</i> into the global search box and it will return all of the workunits that contain "output" in the ECL page of ECL Watch-->
-      </sect2>
-    </sect1>
   </chapter>
 
   <chapter id="ECLWatch_ECLWorkunits">
@@ -773,7 +1106,8 @@
                   xpointer="xpointer(//*[@id='Desprays'])"
                   xmlns:xi="http://www.w3.org/2001/XInclude" />
 
-      <xi:include href="HPCCDataHandling/DH-Mods/DH-Mod1.xml" xpointer="xpointer(//*[@id='Copy'])"
+      <xi:include href="HPCCDataHandling/DH-Mods/DH-Mod1.xml"
+                  xpointer="xpointer(//*[@id='Copy'])"
                   xmlns:xi="http://www.w3.org/2001/XInclude" />
 
       <xi:include href="HPCCDataHandling/DH-Mods/DH-Mod1.xml"
@@ -1028,7 +1362,7 @@
           </mediaobject>
         </figure></para>
 
-      <sect2 id="TopologyTargets">
+      <sect2 id="TopologyTargets" role="brk">
         <title>Targets</title>
 
         <para>The <emphasis role="bold">Targets</emphasis> Action button
@@ -1052,7 +1386,7 @@
         the selected component.</para>
       </sect2>
 
-      <sect2 id="TopologyServices">
+      <sect2 id="TopologyServices" role="brk">
         <title>Services</title>
 
         <para>Press the <emphasis role="bold">Services</emphasis> Action
@@ -1078,7 +1412,7 @@
         selected component.</para>
       </sect2>
 
-      <sect2 id="ECLWatch_Operations_TopologyMachines">
+      <sect2 id="ECLWatch_Operations_TopologyMachines" role="brk">
         <title>Machines</title>
 
         <para>Press the <emphasis role="bold">Machines</emphasis> Action
@@ -1100,6 +1434,22 @@
         services on each node. Select the component to view the Summary,
         Configuration, or Logs tabs for that selected component.</para>
       </sect2>
+
+      <sect2 role="brk">
+        <title>Roxie File Copy Status</title>
+
+        <para>In the Topology section for Roxie clusters, the <emphasis
+        role="bold">Roxie Files Copy Status</emphasis> tab shows the number of
+        files a cluster has left to copy.<figure>
+            <title>File Copy Status</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata fileref="images/ECLWA467.jpg" vendor="ECLWatchSS" />
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </sect2>
     </sect1>
 
     <sect1 id="ECLWatch_Operations_DiskUsage">
@@ -1457,178 +1807,6 @@
                 xmlns:xi="http://www.w3.org/2001/XInclude" />
   </chapter>
 
-  <chapter id="Account_Info">
-    <title>Advanced Menu</title>
-
-    <para>There is a section at the top right on the navigation bar with some
-    useful information and features. This section shows you who you are logged
-    in as (if your system has authentication enabled). The Advanced menu is
-    located on the right hand side of the navigation bar. There are several
-    items that you can access from the advanced menu.</para>
-
-    <para><figure>
-        <title>Advanced menu</title>
-
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="images/ECLWA007b.jpg" />
-          </imageobject>
-        </mediaobject>
-      </figure></para>
-
-    <para>There may be a number displayed on the menu link. A number displayed
-    next to it indicates how many errors and warnings have been generated
-    during your session. Click on the advanced menu to display a list of
-    features.</para>
-
-    <sect1 id="ECLWatch_AdvancedMenuAccess">
-      <title>Access the Advanced menu</title>
-
-      <para>You access the advanced menu items from the advanced menu link at
-      the top right corner of ECL Watch.<!--Removed some content stashed in GitStash : ECLWA-1115.xml others culled stored in git-br H8872-NewestECLfor50 **--></para>
-
-      <para>The <emphasis role="bold">Set Banner</emphasis> link allows you to
-      set a custom banner message at the top of your browser window when you
-      open ECL Watch. You can use this feature to send messages to
-      users.</para>
-
-      <para>The <emphasis role="bold">Error/Warning(s)</emphasis> link
-      displays a tab showing you Errors, Warnings, and Information messages.
-      You can filter this page by checking the boxes at the bottom of the tab.
-      A copy facility is also provided.</para>
-
-      <para>The <emphasis role="bold">Open Legacy ECL Watch</emphasis> link
-      opens a tab to the previous version of ECL Watch. The legacy version of
-      ECL Watch is deprecated; this link is only available for a limited time
-      to help in the transition.</para>
-
-      <para>The <emphasis role="bold">Additional Resources</emphasis> link
-      opens a tab to the HPCC Systems<superscript>®</superscript> download
-      page, where you can browse and download additional HPCC resources:
-      documentation, white papers, training videos, wiki pages, the red book
-      and other HPCC related source code.</para>
-
-      <para>The <emphasis role="bold">Release Notes</emphasis> link opens a
-      tab with the relevant release notes for the version of HPCC that you are
-      using. Read the release notes for more information specific to the
-      release you are working on.</para>
-
-      <para>The <emphasis role="bold">Configuration</emphasis> link opens for
-      viewing the xml version of the configuration file in use on your
-      system.</para>
-
-      <para>The <emphasis role="bold">About</emphasis> link opens a dialog to
-      display some information about the version of the HPCC platform and
-      graph controls installed on your server.</para>
-    </sect1>
-
-    <sect1 id="ECLWatch_AdvancedMenuUserDetails" role="nobrk">
-      <title>User Details</title>
-
-      <para>The LOGGED IN AS link shows information about the current user on
-      a cluster configured for authentication.</para>
-
-      <para><orderedlist>
-          <listitem>
-            <para>Click on the <emphasis role="bold"><emphasis
-            role="bold">LOGGED IN AS:</emphasis></emphasis> link.</para>
-
-            <para>The User Details window opens. The default window opens on
-            the Summary tab.</para>
-
-            <para><figure>
-                <title>User Details window</title>
-
-                <mediaobject>
-                  <imageobject>
-                    <imagedata fileref="images/ECLWA474.jpg" />
-                  </imageobject>
-                </mediaobject>
-              </figure></para>
-          </listitem>
-
-          <listitem>
-            <para>From The User Details page Summary tab, you can Confirm the
-            User Name that you are logged in as.</para>
-
-            <para>You can change your password.</para>
-
-            <para>Note that Administrator rights are needed to manage users
-            and permissions.</para>
-
-            <para>Ensure you are using an account with Administrator rights if
-            you intend to manage users or permissions.</para>
-          </listitem>
-
-          <listitem>
-            <para>Verify the password expiration date, or if password is set
-            to expire.</para>
-          </listitem>
-        </orderedlist></para>
-
-      <sect2 id="ECLWatch_AdvancedMenuChangePassword" role="nobrk">
-        <title>Change Password</title>
-
-        <para>If authentication is enabled on your HPCC system, you can change
-        your password, right from the User Details window. <!--***? is this still valid : don't see where this is in new ECLWatch ***--><orderedlist>
-            <listitem>
-              <para>Click on the <emphasis role="bold"><emphasis
-              role="bold">LOGGED IN AS:</emphasis></emphasis> link.</para>
-
-              <para>The User Details window opens. The default window opens on
-              the Summary tab. There are fields on the Summary tab where you
-              can change your password.</para>
-            </listitem>
-
-            <listitem>
-              <para>Enter your desired new password.</para>
-
-              <para>Make sure it meets whatever criteria your system may have
-              for passwords.</para>
-            </listitem>
-
-            <listitem>
-              <para>Confirm your new password.</para>
-
-              <para>Make sure that it matches the password you entered in the
-              previous field.</para>
-            </listitem>
-
-            <listitem>
-              <para>Press the Save button. It is in the upper left portion of
-              the window.</para>
-            </listitem>
-          </orderedlist></para>
-      </sect2>
-
-      <sect2 id="ECLWatch_AdvancedMenuPermissionGroups">
-        <title>Permission groups</title>
-
-        <para>The second tab on the User Details window labelled Member Of,
-        displays a list of groups. The groups your account belongs to, are
-        indicated with a checkmark.</para>
-
-        <para>You must be an administrator to modify any of group
-        settings.</para>
-      </sect2>
-
-      <sect2 id="ECLWatch_AdvancedMenuUserPermissions">
-        <title>User Permissions tab</title>
-
-        <para>The third tab on the User Details window labelled <emphasis
-        role="bold">User Permissions</emphasis>, displays a list of permission
-        settings. Note that Administrator rights are needed to manage users
-        and permissions. Ensure you are using an account with Administrator
-        rights if you intend to manage users or permissions.</para>
-
-        <para>This is where you can access the user permissions area. A more
-        detailed description of the user permissions settings is covered in
-        the <link linkend="User_Permissions_Chapter">User Permissions</link>
-        section.</para>
-      </sect2>
-    </sect1>
-  </chapter>
-
   <chapter id="Resources">
     <title>Resources</title>
 

BIN
docs/images/ECLWA-Comm.jpg


BIN
docs/images/ECLWA007b.jpg


BIN
docs/images/ECLWA464.jpg


BIN
docs/images/ECLWA465.jpg


BIN
docs/images/ECLWA466.jpg


BIN
docs/images/ECLWA467.jpg


BIN
docs/images/ECLWA500.jpg


BIN
docs/images/ECLWACommS01.snag


+ 42 - 1
ecl/eclcc/eclcc.cpp

@@ -402,6 +402,7 @@ protected:
     bool optShowPaths = false;
     bool optNoSourcePath = false;
     bool optFastSyntax = false;
+    bool optCheckIncludePaths = true;
     bool optXml = false;
     mutable bool daliConnected = false;
     mutable bool disconnectReported = false;
@@ -1852,6 +1853,40 @@ bool EclCC::generatePrecompiledHeader()
     }
 }
 
+static void checkForOverlappingPaths(const char * path)
+{
+    StringArray originalPaths;
+    originalPaths.appendList(path, ENVSEPSTR);
+
+    StringArray expandedPaths;
+    ForEachItemIn(i1, originalPaths)
+    {
+        const char * cur = originalPaths.item(i1);
+        if (*cur)
+        {
+            StringBuffer expanded;
+            makeAbsolutePath(cur, expanded);
+            expandedPaths.append(expanded);
+        }
+    }
+
+    //Sort alphabetically, smallest strings will come first
+    expandedPaths.sortAscii(!filenamesAreCaseSensitive);
+
+    //If one string is a subset of another then the shorter will come immediately before at least one that overlaps
+    for (unsigned i=1; i < expandedPaths.ordinality(); i++)
+    {
+        const char * prev = expandedPaths.item(i-1);
+        const char * next = expandedPaths.item(i);
+        if (hasPrefix(next, prev, filenamesAreCaseSensitive))
+        {
+            if (!streq(next, prev))
+                throw MakeStringException(99, "Include paths -I '%s' and '%s' overlap", prev, next);
+        }
+    }
+}
+
+
 
 bool EclCC::processFiles()
 {
@@ -1888,9 +1923,11 @@ bool EclCC::processFiles()
 
 
     StringBuffer searchPath;
-    if (!optNoStdInc)
+    if (!optNoStdInc && stdIncludeLibraryPath.length())
         searchPath.append(stdIncludeLibraryPath).append(ENVSEPCHAR);
     searchPath.append(includeLibraryPath);
+    if (optCheckIncludePaths)
+        checkForOverlappingPaths(searchPath);
 
     Owned<IErrorReceiver> errs = optXml ? createXmlFileErrorReceiver(stderr) : createFileErrorReceiver(stderr);
     pluginsRepository.setown(createNewSourceFileEclRepository(errs, pluginsPath.str(), ESFallowplugins, logVerbose ? PLUGIN_DLL_MODULE : 0));
@@ -2252,6 +2289,10 @@ int EclCC::parseCommandLineOptions(int argc, const char* argv[])
         {
             // For use by eclccserver - not documented in usage()
         }
+        else if (iter.matchFlag(optCheckIncludePaths, "--checkIncludePaths"))
+        {
+            //Only here to provide backward compatibility for the include path checking if it proves to cause issues.
+        }
         else if (iter.matchOption(tempArg, "--deny"))
         {
             if (stricmp(tempArg, "all")==0)

+ 2 - 1
ecl/eclcc/eclcc.hpp

@@ -95,6 +95,7 @@ const char * const helpText[] = {
     "!   -legacywhen   Use legacy when/side-effects semantics (deprecated)",
     "    --logfile <file> Write log to specified file",
     "!   --logdetail=n Set the level of detail in the log file",
+    "!   --maxErrors=<n> Limit the number of errors, aborting on the nth (default = 5)",
     "    --metacache=x Specify directory to store distributed meta information",
     "!   --nologfile   Do not write any logfile",
 #ifdef _WIN32
@@ -102,7 +103,7 @@ const char * const helpText[] = {
 #endif
     "!   --nogpg       Do not run gpg to check signatures on signed code",
     "    --nosourcepath Compile as if the source came from stdin",
-    "!   --maxErrors=<n> Limit the number of errors, aborting on the nth (default = 5)",
+    "!   --nostdinc    Do not include the current directory in -I",
 #ifndef _WIN32
     "!   -pch          Generate precompiled header for eclinclude4.hpp",
 #endif

+ 5 - 1
esp/services/esdl_svc_engine/esdl_binding.cpp

@@ -1273,7 +1273,11 @@ void EsdlBindingImpl::addService(const char * name,
 
 void EsdlBindingImpl::initEsdlServiceInfo(IEsdlDefService &srvdef)
 {
-    const char *verstr = srvdef.queryProp("default_client_version");
+    const char *verstr = srvdef.queryProp("version");
+    if(verstr && *verstr)
+        m_defaultSvcVersion.set(verstr);
+
+    verstr = srvdef.queryProp("default_client_version");
     if (verstr && *verstr)
     {
         if (atof(verstr) > atof(m_defaultSvcVersion.str()))

+ 15 - 4
esp/src/eclwatch/DFUQueryWidget.js

@@ -89,6 +89,7 @@ define([
         templateString: template,
         baseClass: "DFUQueryWidget",
         i18n: nlsHPCC,
+        pathSepCharG: "/",
 
         postCreate: function (args) {
             this.inherited(arguments);
@@ -134,15 +135,25 @@ define([
                 origOnOpen.apply(context.desprayTooltipDialog, arguments);
 
                 if (!context.desprayIPSelect.initalized) {
+                    var pathSepChar;
                     context.desprayIPSelect.init({
                         DropZoneMachines: true,
                         callback: function (value, row) {
+                            var path = targetRow.machine.Directory.indexOf("\\");
                             targetRow.machine.Name = value
                             targetRow.machine.Netaddress = value
                             if (context.desprayTargetPath) {
                                 context.desprayTargetPath._dropZoneTarget = targetRow;
-                                context.desprayTargetPath.defaultValue = "/"
-                                context.desprayTargetPath.loadDropZoneFolders();
+                                if (path > -1) {
+                                    context.desprayTargetPath.defaultValue = "\\"
+                                    pathSepChar = "\\"
+                                    context.pathSepCharG = "\\"
+                                } else {
+                                    context.desprayTargetPath.defaultValue = "/"
+                                    pathSepChar = "/";
+                                    context.pathSepCharG = "/"
+                                }
+                                context.desprayTargetPath.loadDropZoneFolders(pathSepChar);
                             }
                         }
                     });
@@ -306,8 +317,8 @@ define([
                 arrayUtil.forEach(this.desprayGrid.store.data, function (item, idx) {
                     var request = domForm.toObject(context.id + "DesprayForm");
                     request.destPath = context.desprayTargetPath.getDropZoneFolder();
-                    if (!context.endsWith(request.destPath, "/")) {
-                        request.destPath += "/";
+                    if (!context.endsWith(request.destPath, context.pathSepCharG)) {
+                        request.destPath += context.pathSepCharG;
                     }
                     request.destPath += item.targetName;
                     item.despray({

+ 10 - 2
esp/src/eclwatch/LZBrowseWidget.js

@@ -202,15 +202,23 @@ define([
             }
 
             if (!this.dropZoneMachineSelect.initalized) {
+                var pathSepChar;
                 this.dropZoneMachineSelect.init({
                     DropZoneMachines: true,
                     callback: function (value, row) {
+                        var path = targetRow.machine.Directory.indexOf("\\");
                         targetRow.machine.Name = value
                         targetRow.machine.Netaddress = value
                         if (context.dropZoneFolderSelect) {
                             context.dropZoneFolderSelect._dropZoneTarget = targetRow;
-                            context.dropZoneFolderSelect.defaultValue = "/"
-                            context.dropZoneFolderSelect.loadDropZoneFolders();
+                            if (path > -1) {
+                                context.dropZoneFolderSelect.defaultValue = "\\"
+                                pathSepChar = "\\"
+                            } else {
+                                context.dropZoneFolderSelect.defaultValue = "/"
+                                pathSepChar = "/"
+                            }
+                            context.dropZoneFolderSelect.loadDropZoneFolders(pathSepChar);
                         }
                     }
                  });

+ 10 - 5
esp/src/eclwatch/TargetSelectClass.js

@@ -302,6 +302,11 @@ define([
                     }
                 }).then(function (response) {
                     if (lang.exists("TpDropZoneQueryResponse.TpDropZones.TpDropZone", response)) {
+                        context.set("options", []);
+                        context.options.push({
+                            label: "&nbsp;",
+                            value: ""
+                        });
                         arrayUtil.forEach(response.TpDropZoneQueryResponse.TpDropZones.TpDropZone, function(item, idx) {
                             var targetData = item.TpMachines.TpMachine;
                             for (var i = 0; i < targetData.length; ++i) {
@@ -310,14 +315,14 @@ define([
                                     value: targetData[i].Netaddress
                                 });
                             }
+                            context._postLoad();
                         });
                     }
-                    context._postLoad();
                 });
             }
         },
 
-        _loadDropZoneFolders: function (Netaddr, Path, OS, depth) {
+        _loadDropZoneFolders: function (pathSepChar, Netaddr, Path, OS, depth) {
             depth = depth || 0;
             var retVal = [];
             retVal.push(Path);
@@ -341,7 +346,7 @@ define([
                         var files = response.FileListResponse.files.PhysicalFileStruct;
                         for (var i = 0; i < files.length; ++i) {
                             if (files[i].isDir) {
-                                requests.push(context._loadDropZoneFolders(Netaddr, Path + "/" + files[i].name, OS, ++depth));
+                                requests.push(context._loadDropZoneFolders(pathSepChar, Netaddr, Path + pathSepChar + files[i].name, OS, ++depth));
                             }
                         }
                     }
@@ -360,7 +365,7 @@ define([
             return str.indexOf(suffix, str.length - suffix.length) !== -1;
         },
 
-        loadDropZoneFolders: function () {
+        loadDropZoneFolders: function (pathSepChar) {
             var context = this;
             this.getDropZoneFolder = function () {
                 var baseFolder = this._dropZoneTarget.machine.Directory;
@@ -368,7 +373,7 @@ define([
                 return baseFolder + selectedFolder;
             }
             if (this._dropZoneTarget) {
-                this._loadDropZoneFolders(this._dropZoneTarget.machine.Netaddress, this._dropZoneTarget.machine.Directory, this._dropZoneTarget.machine.OS).then(function (results) {
+                this._loadDropZoneFolders(pathSepChar, this._dropZoneTarget.machine.Netaddress, this._dropZoneTarget.machine.Directory, this._dropZoneTarget.machine.OS).then(function (results) {
                     results.sort();
                     var store = new Memory({
                         data: arrayUtil.map(results, function (_path) {

+ 2 - 2
system/jlib/jfile.cpp

@@ -3326,7 +3326,7 @@ public:
     }
 
     virtual bool isValid()  { return false; }
-    virtual IFile & query() { return *(IFile *)NULL; }
+    virtual IFile & query() { throwUnexpected(); }
     virtual bool isDir() {  return false; }
 
 };
@@ -3889,7 +3889,7 @@ public:
     {
         if (isValid())
             return *item(idx).file;
-        return *(IFile *) NULL;
+        throwUnexpected();
     }
     virtual StringBuffer &getName(StringBuffer &buf)
     {

+ 6 - 0
system/jlib/jfile.hpp

@@ -624,4 +624,10 @@ extern jlib_decl void removeSentinelFile(IFile * file);
 extern jlib_decl StringBuffer & appendCurrentDirectory(StringBuffer & target, bool blankIfFails);
 extern jlib_decl timestamp_type getTimeStamp(IFile * file);
 
+#ifdef _WIN32
+const static bool filenamesAreCaseSensitive = false;
+#else
+const static bool filenamesAreCaseSensitive = true;
+#endif
+
 #endif

+ 2 - 2
system/jlib/jhash.hpp

@@ -459,9 +459,9 @@ protected:
     }       
 
 public:
-    CMinHashTable<C>()
+    CMinHashTable<C>(unsigned _initialSize = 7)
     {
-        htn = 7;
+        htn = _initialSize;
         n = 0;
         table = (C **)calloc(sizeof(C *),htn);
     }

+ 686 - 0
system/jlib/jptree-attrvalues.hpp

@@ -0,0 +1,686 @@
+    "_",
+    "/",
+    ".",
+    "",
+    "*",
+    "\\,",
+    "0 secs",
+    "-1"
+    "1:1",
+    "1:M",
+    "Access to cluster topology",
+    "Access to despraying of files",
+    "Access to DFU",
+    "Access to DFU exceptions",
+    "Access to DFU workunits",
+    "Access to DFU XRef",
+    "Access to ECL direct service",
+    "Access to ECL Direct service",
+    "Access to ESDL configuration service",
+    "Access to files in dropzone",
+    "Access to machine information",
+    "Access to own workunits",
+    "Access to permissions for file scopes",
+    "Access to roxie control commands",
+    "Access to SMC service",
+    "Access to SNMP metrics information",
+    "Access to spraying files",
+    "Access to thor queues",
+    "Access to upload files to dropzone",
+    "Access to workunits owned by others",
+    "Access to WS ECL service",
+    "Access to WS Logging service",
+    "Action",
+    "Action #1",
+    "Action #2",
+    "active",
+    "activities",
+    "Aggregate",
+    "Alias",
+    "any",
+    "Application",
+    "archive",
+    "ASSERT",
+    "Associated",
+    "Attr",
+    "Begin Loop",
+    "blank",
+    "blocked",
+    "Body",
+    "bytes",
+    "calculated",
+    "canstall",
+    "ca.pem",
+    "cd",
+    "certificate.cer",
+    "checkasserts",
+    "Child",
+    "Child Dataset",
+    "childfile",
+    "_childGraph",
+    "Client",
+    "Cluster",
+    "ClusterLock",
+    "ClusterTopologyAccess",
+    "cnt",
+    "coLocal",
+    "compile",
+    "compile:compile c++",
+    "compiled",
+    "compile:generate c++",
+    "compile:generate PARSE",
+    "compile:generate PARSE:analyse",
+    "compile:generate PARSE:compile",
+    "compile:generate PARSE:create structure",
+    "compile:generate PARSE:generate",
+    "compile:generate PARSE:optimize",
+    "compile:generate PARSE:prepare",
+    "compile:global implicit projects",
+    "compile:implicit projects",
+    "compile:optimize graph",
+    "compile:parseTime",
+    "compile:peephole optimize",
+    "compile:resource graph",
+    "compile:tree transform",
+    "compile:tree transform: check dependency",
+    "compile:tree transform: compound activity",
+    "compile:tree transform: convert logical",
+    "compile:tree transform: convert SetResult to Extract",
+    "compile:tree transform: expand delayed calls",
+    "compile:tree transform: global fold",
+    "compile:tree transform: hoist nested compound",
+    "compile:tree transform: merge thor",
+    "compile:tree transform: migrate",
+    "compile:tree transform: normalize",
+    "compile:tree transform: normalize.annotations",
+    "compile:tree transform: normalize.DFStransform",
+    "compile:tree transform: normalize.initial",
+    "compile:tree transform: normalize.KeyedProjectTransformer",
+    "compile:tree transform: normalize.linkedChildRows",
+    "compile:tree transform: normalize result",
+    "compile:tree transform: normalize.scope",
+    "compile:tree transform: optimize activities",
+    "compile:tree transform: optimize disk read",
+    "compile:tree transform: spot global cse",
+    "compile:tree transform: stored results",
+    "compile:tree transform: substituteClusterSize",
+    "compile:tree transform: thor hole",
+    "compile:write c++",
+    "compiling",
+    "completed",
+    "componentfiles/configxml",
+    "componentfiles/dafilesrv",
+    "componentfiles/dali",
+    "componentfiles/dfuplus",
+    "componentfiles/dfuserver",
+    "componentfiles/DropZone",
+    "componentfiles/eclagent",
+    "componentfiles/ecldirect",
+    "componentfiles/eclminus",
+    "componentfiles/eclplus",
+    "componentfiles/esdlsvcengine",
+    "componentfiles/esp",
+    "componentfiles/esploggingagent",
+    "componentfiles/espsmc",
+    "componentfiles/ftslave",
+    "componentfiles/hqltest",
+    "componentfiles/ldapServer",
+    "componentfiles/loggingmanager",
+    "componentfiles/sasha",
+    "componentfiles/SiteCertificate",
+    "componentfiles/soapplus",
+    "componentfiles/thor",
+    "componentfiles/topology",
+    "componentfiles/ws_ecl",
+    "componentfiles/wslogging",
+    "condition",
+    "conf",
+    "copy",
+    "Count",
+    "Count Project",
+    "cpp",
+    "created_by",
+    "created_for",
+    "CRON",
+    "csv",
+    "Csv Write",
+    "dafilesrv",
+    "DafilesrvProcess",
+    "DaFileSrv process",
+    "dafilesrv.xsd",
+    "dali",
+    "DaliServerProcess",
+    "dali.xsd",
+    "data",
+    "data2",
+    "data3",
+    "data4",
+    "date",
+    "Debug",
+    "Dedup",
+    "definition",
+    "Degroup",
+    "Denormalize",
+    "Denormalize Group",
+    "Dependency",
+    "_dependsOn",
+    "deploy_map.xml",
+    "deserialized",
+    "Destination",
+    "/dev*,/sys,/proc/*",
+    "dfu",
+    "DfuAccess",
+    "DFUcopy",
+    "DfuExceptions",
+    "DfuExceptionsAccess",
+    "dfuplus",
+    "DfuplusProcess",
+    "dfuplus.xsd",
+    "dfuserver",
+    "DFUserver",
+    "DFU Server",
+    "dfuserver_monitor_queue",
+    "DfuServerProcess",
+    "dfuserver_queue",
+    "dfuserver.xsd",
+    "DfuWorkunitsAccess",
+    "DfuXrefAccess",
+    "dhcpd",
+    "_diskAccessRequired",
+    "DiskUsageStats",
+    "Disk Write",
+    "dll",
+    "done",
+    "DropZone",
+    "DropZone process",
+    "dropzone.xsd",
+    "DynamicESDL",
+    "ecl",
+    "ECL",
+    "eclagent",
+    "EclAgent",
+    "ECLagent",
+    "EclAgentBuild",
+    "eclagent_config.xsd",
+    "EclAgent process",
+    "EclAgentProcess",
+    "eclcc",
+    "eclccserver",
+    "ECLCCserver",
+    "eclccserver_deploy_map.xml",
+    "EclCCServer process",
+    "EclCCServerProcess",
+    "eclccserver.xsd",
+    "ecl.common",
+    "ecldirect",
+    "EclDirectAccess",
+    "EclDirectSoapBinding",
+    "eclminus",
+    "eclplus",
+    "EclPlusProcess",
+    "eclplus.xsd",
+    "eclscheduler",
+    "eclscheduler_deploy_map.xml",
+    "EclScheduler process",
+    "EclSchedulerProcess",
+    "eclscheduler.xsd",
+    "EclWatch",
+    "Edition",
+    "End Loop",
+    "Environment_Initialize",
+    "EsdlBinding",
+    "ESDLConfigAccess",
+    "esdl_svc_engine",
+    "esdlsvcengine.xsd",
+    "esp",
+    "esploggingagent",
+    "ESPLoggingAgent",
+    "esploggingagent.xsd",
+    "EspProcess",
+    "ESP server",
+    "ESPserver",
+    "EspService",
+    "ESPservice",
+    "esp_service_ecldirect.xsd",
+    "esp_service_module",
+    "ESP services for SMC",
+    "esp_service_wsecl2.xsd",
+    "espsmc",
+    "espsmcservice.xsd",
+    "esp.xsd",
+    "Exception",
+    "Exceptions",
+    "expandpersistinputdependencies",
+    "fAddFileRelationship",
+    "fAddSuperFile",
+    "failed",
+    "failonleaks",
+    "failure",
+    "false",
+    "False",
+    "falseval",
+    "farm1",
+    "farm2",
+    "fCreateSuperFile",
+    "fDeleteLogicalFile",
+    "fDeleteSuperFile",
+    "fFileExists",
+    "fFinishSuperFileTransaction",
+    "fgetParseTree",
+    "fGetSuperFileSubCount",
+    "file",
+    "File",
+    "FileDesprayAccess",
+    "FileIOAccess",
+    "_fileName",
+    "__filepos",
+    "filepos",
+    "__fileposition__",
+    "files",
+    "Files",
+    "FileScopeAccess",
+    "fileservices",
+    "FileSprayAccess",
+    "FilesRead",
+    "FileUploadAccess",
+    "Filter",
+    "Filtered Project",
+    "finished",
+    "Firstn",
+    "flat",
+    "float",
+    "Format",
+    "fRemoveSuperFile",
+    "_fromChild",
+    "fSetColumnMapping",
+    "fStartSuperFileTransaction",
+    "fSuperFileExists",
+    "ftslave",
+    "ftslave_linux.xsd",
+    "FTSlave process",
+    "FTSlaveProcess",
+    "function",
+    "Funnel",
+    "global",
+    "_globalUsageCount",
+    "graph",
+    "Graph",
+    "graphBin",
+    "_graphid",
+    "_graphId",
+    "_graphIndependent",
+    "Graphs",
+    "Group",
+    "grouped",
+    "Grouped Aggregate",
+    "Grouped Dedup",
+    "Grouped Filter",
+    "Grouped Iterate",
+    "Grouped Normalize",
+    "Grouped Process",
+    "Grouped Project",
+    "Grouped Rollup",
+    "Grouped Sort",
+    "Grouped Split",
+    "Hash Aggregate",
+    "Hash Dedup",
+    "Hash Distribute",
+    "hpcc",
+    "HPCCSystems",
+    "hqltest",
+    "HqlTestProcess",
+    "hthor",
+    "HThorServer",
+    "http",
+    "httpd",
+    "http://www.w3.org/1999/XMLSchema-instance",
+    "id",
+    "If",
+    "ignore",
+    "import",
+    "in",
+    "_indexFileName",
+    "Index Write",
+    "inds",
+    "infile",
+    "initial",
+    "Inline Dataset",
+    "Inline Row",
+    "inputs",
+    "_internal",
+    "isokay",
+    "_isSpill",
+    "_isTransformSpill",
+    "Item",
+    "Iterate",
+    "Job",
+    "jobtemp",
+    "Join",
+    "json",
+    "KB",
+    "kerberos",
+    "key",
+    "_kind",
+    "lang",
+    "layouttranslationenabled",
+    "ldapServer",
+    "LDAPServerProcess",
+    "ldapserver.xsd",
+    "LDS",
+    "LEFT",
+    "lhs",
+    "lib_fileservices",
+    "libfileservices.so",
+    "lib_parselib",
+    "libparselib.so",
+    "lib_stringlib",
+    "libstringlib.so",
+    "lib_unicodelib",
+    "libunicodelib.so",
+    "libworkunitservices.so",
+    "Lightweight Self Join",
+    "link",
+    "linux",
+    "Linux",
+    "linuxmachine",
+    "local",
+    "Local Dedup",
+    "localdomain",
+    "Local Group",
+    "localhost",
+    "Local Index Write",
+    "Local Join",
+    "Local Result",
+    "Local Sort",
+    "Local Sorted",
+    "location",
+    "lock",
+    "log",
+    "loggingmanager",
+    "LoggingManager",
+    "loggingmanager.xsd",
+    "loggingservice_binding",
+    "logicalName",
+    "lookupjoin",
+    "Lookup Join",
+    "Loop",
+    "_loopid",
+    "MachineInfoAccess",
+    "makechildren",
+    "makedataset",
+    "master",
+    "matches",
+    "MatchSmith",
+    "maxcompilethreads",
+    "maxCompileThreads",
+    "maxseeklookahead",
+    "Merge",
+    "Merge Join",
+    "MetricsAccess",
+    "mirror",
+    "Monitor",
+    "msg",
+    "msgs",
+    "name",
+    "no",
+    "node",
+    "nofold",
+    "none",
+    "normal",
+    "Normalize",
+    "ns",
+    "null",
+    "Null",
+    "NumAllocations",
+    "NumAllocationScans",
+    "NumAtmostTriggered",
+    "NumDiskAccepted",
+    "NumDiskRowsRead",
+    "NumDiskSeeks",
+    "NumGroupMax",
+    "NumGroups",
+    "NumIndexAccepted",
+    "NumIndexMerges",
+    "NumIndexNullSkips",
+    "NumIndexRejected",
+    "NumIndexRowsRead",
+    "NumIndexScans",
+    "NumIndexSeeks",
+    "NumIndexSkips",
+    "NumIndexWildSeeks",
+    "NumLeafCacheAdds",
+    "NumLeafCacheHits",
+    "NumNodeCacheAdds",
+    "NumNodeCacheHits",
+    "numrecs",
+    "_numResults",
+    "NumRowsProcessed",
+    "NumStarted",
+    "NumStopped",
+    "Nway Graph Input",
+    "once",
+    "OnWarning",
+    "OnWarnings",
+    "options",
+    "Options",
+    "ordered",
+    "OriginalTextFilesEclPath",
+    "OriginalTextFilesIp",
+    "OriginalTextFilesOsPath",
+    "OrigName",
+    "OthersWorkunitsAccess",
+    "ou=EclDirectAccess,ou=EspServices,ou=ecl",
+    "ou=EspServices,ou=ecl",
+    "ou=SMC,ou=EspServices,ou=ecl",
+    "ou=workunits,ou=ecl",
+    "ou=WsEcl,ou=EspServices,ou=ecl",
+    "OwnWorkunitsAccess",
+    "parallel",
+    "Parameters",
+    "_parentActivity",
+    "Parse",
+    "Part",
+    "partial",
+    "Parts",
+    "Pid",
+    "Pipe Through",
+    "Plugin",
+    "PluginProcess",
+    "Plugins",
+    "plugin.xsd",
+    "predictedCount",
+    "preload",
+    "privatekey.cer",
+    "Process",
+    "progress",
+    "Progress",
+    "Project",
+    "Quantile",
+    "query",
+    "Query",
+    "Queue",
+    "queued",
+    "Read",
+    "Read Local Result",
+    "_record_layout",
+    "recordSize",
+    "Recovery",
+    "Relationship",
+    "Relationships",
+    "reqd",
+    "result",
+    "Result",
+    "Results",
+    "RIGHT",
+    "ro1",
+    "rolledup",
+    "Root access to ECL Direct service",
+    "Root access to SMC service",
+    "Root access to WS ECL service",
+    "Root access to WS Logging service",
+    "rootGraph",
+    "Row",
+    "rowCount",
+    "roxie",
+    "Roxie",
+    "Roxie cluster",
+    "RoxieCluster",
+    "RoxieControlAccess",
+    "roxie_deploy_map.xml",
+    "RoxieServer",
+    "roxie.xsd",
+    "run",
+    "running",
+    "Running",
+    "Sample",
+    "sasha",
+    "SashaServer",
+    "Sasha Server process",
+    "SashaServerProcess",
+    "sasha.xsd",
+    "Schedule",
+    "SchemaRaw",
+    "Scope",
+    "sds",
+    "SDS_Initialize",
+    "section",
+    "Select Nth",
+    "Self Join",
+    "sequential",
+    "Sequential",
+    "Server",
+    "ServerList",
+    "setup",
+    "ShortText",
+    "single",
+    "SiteCertificate",
+    "SiteCertificate.xsd",
+    "SizePeakMemory",
+    "Skip Limit",
+    "smart",
+    "SmcAccess",
+    "soapplus",
+    "SoapPlusProcess",
+    "soapplus.xsd",
+    "somefile",
+    "Sort",
+    "sortedids",
+    "sortfixed",
+    "sortvar",
+    "Source",
+    "_sourceActivity",
+    "_sourceIndex",
+    "spillReason",
+    "Split",
+    "sq",
+    "started",
+    "State",
+    "Statistic",
+    "Statistics",
+    "Stats",
+    "std",
+    "std.system",
+    "str",
+    "Str",
+    "stripprefixlist",
+    "Subfile",
+    "SubFile",
+    "subgraph",
+    "submitted",
+    "success",
+    "summary",
+    "SuperFile",
+    "SuperOwner",
+    "supplied",
+    "Switch",
+    "sz",
+    "_targetActivity",
+    "targetclustertype",
+    "_targetIndex",
+    "targetip",
+    "@temp",
+    "temp",
+    "@temp/esp_service.xsl",
+    "Temporaries",
+    "temporary",
+    "tempr",
+    "Text",
+    "textsearch",
+    "TextSearch",
+    "thor",
+    "Thor",
+    "thorlib",
+    "Thorlib",
+    "ThorMaster",
+    "Thor process",
+    "ThorQueueAccess",
+    "thorversion",
+    "thor.xsd",
+    "TimeElapsed",
+    "TimeLocalExecute",
+    "TimeRemaining",
+    "TimeSortElapsed",
+    "topLevelKey",
+    "Top N",
+    "topology",
+    "Topology",
+    "topology.xsd",
+    "Total cluster time",
+    "totalRowCount",
+    "Total thor time",
+    "Tracing",
+    "true",
+    "True",
+    "ts",
+    "TS",
+    "undefined",
+    "unknown",
+    "_updateIfChanged",
+    "updown",
+    "US",
+    "user",
+    "utf8n",
+    "Value",
+    "Variable",
+    "Variables",
+    "view",
+    "wait",
+    "_when",
+    "WhenCompiled",
+    "WhenCreated",
+    "WhenGraphFinished",
+    "WhenGraphStarted",
+    "WhenQueryFinished",
+    "WhenQueryStarted",
+    "WhenWorkunitModified",
+    "Windows",
+    "Workflow",
+    "workunit",
+    "WorkUnit",
+    "Workunit DLL",
+    "workunit:optimize graph",
+    "workunit:resource graph",
+    "workunit:tree transform: optimize disk read",
+    "ws_access",
+    "ws_dfu",
+    "ws_dfuxref",
+    "ws_ecl",
+    "WsEclAccess",
+    "WS ECL Service",
+    "ws_eclSoapBinding",
+    "ws_esdlconfig",
+    "ws_fileio",
+    "ws_fs",
+    "wslogging",
+    "WsLoggingAccess",
+    "wslogging.xsd",
+    "ws_machine",
+    "ws_smc",
+    "WsSMC",
+    "ws_topology",
+    "ws_workunits",
+    "xgmml",
+    "xml",
+    "xmlValue",
+    "xslt",
+    "Yes",

+ 61 - 3
system/jlib/jptree.cpp

@@ -56,7 +56,7 @@ public:
     virtual bool first() override { return false; }
     virtual bool next() override { return false; }
     virtual bool isValid() override { return false; }
-    virtual IPropertyTree & query() override { assertex(false); return *(IPropertyTree *)NULL; }
+    virtual IPropertyTree & query() override { throwUnexpected(); }
 } *nullPTreeIterator;
 
 IPropertyTreeIterator *createNullPTreeIterator() { return LINK(nullPTreeIterator); } // initialize in init mod below.
@@ -66,6 +66,7 @@ IPropertyTreeIterator *createNullPTreeIterator() { return LINK(nullPTreeIterator
 
 #ifdef USE_READONLY_ATOMTABLE
 RONameTable *AttrStrUnionWithTable::roNameTable = nullptr;
+RONameTable *AttrStrUnionWithValueTable::roValueTable = nullptr;
 #endif
 static AtomRefTable *keyTable = nullptr;
 static AtomRefTable *keyTableNC = nullptr;
@@ -82,6 +83,11 @@ static const char * roAttributes[] =
 #include "jptree-attrs.hpp"    // potentially auto-generated
     nullptr
 };
+static const char * roAttributeValues[] =
+{
+#include "jptree-attrvalues.hpp"    // potentially auto-generated
+    nullptr
+};
 
 void initializeRoTable()
 {
@@ -89,6 +95,49 @@ void initializeRoTable()
     {
         AttrStrUnionWithTable::roNameTable->find(*attr, true);
     }
+    for (const char **value = roAttributeValues; *value; value++)
+    {
+        AttrStrUnionWithValueTable::roValueTable->find(*value, true);
+    }
+    // also populate read-only value table by generating some common constants
+    StringBuffer constStr;
+    for (unsigned c=0; c<1000; c++) // common unsigned values in attributes
+    {
+        constStr.clear().append(c);
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
+    for (unsigned c=1; c<=400; c++) // outer graphs
+    {
+        constStr.clear().append("graph").append(c);
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+        constStr.clear().append("Graph graph ").append(c);
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
+    for (unsigned c=1; c<=200; c++) // subgraphs
+    {
+        constStr.clear().append("sg").append(c);
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
+    for (unsigned c=1; c<=200; c++) // Edge 0
+    {
+        constStr.clear().append(c).append("_0");
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
+    for (unsigned c=0; c<35; c++)
+    {
+        char ch = c<9 ? ('1' + c) : ('A' + (c-9));
+        constStr.clear().append("~spill::").append(ch); // spills
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+        constStr.clear().append("gl").append(ch); // graph results
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+        constStr.clear().append("mf").append(ch); // meta factories
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
+    for (unsigned c=1; c<=10; c++) // global auto attributes
+    {
+        constStr.clear().append("auto").append(c);
+        AttrStrUnionWithValueTable::roValueTable->find(constStr.str(), true);
+    }
 #ifdef TRACE_ATOM_SIZE
     // If you are wanting an idea of the savings from use of the RO hash table, it may be useful to reset
     // the counts here. But it's more correct to actually leave them in place.
@@ -99,10 +148,17 @@ void initializeRoTable()
     for (const char **a = roAttributes; *a; a++)
     {
         // sanity check
-        unsigned idx = AttrStrUnionWithTable::roNameTable->findIndex(*a,AttrStrC::getHash(*a));
+        unsigned idx = AttrStrUnionWithTable::roNameTable->findIndex(*a, AttrStrC::getHash(*a));
         AttrStrC *val = AttrStrUnionWithTable::roNameTable->getIndex(idx);
         assert(val && val->eq(*a));
     }
+    for (const char **v = roAttributeValues; *v; v++)
+    {
+        // sanity check
+        unsigned idx = AttrStrUnionWithValueTable::roValueTable->findIndex(*v, AttrStrC::getHash(*v));
+        AttrStrC *val = AttrStrUnionWithValueTable::roValueTable->getIndex(idx);
+        assert(val && val->eq(*v));
+    }
 #endif
 }
 #endif
@@ -111,7 +167,8 @@ MODULE_INIT(INIT_PRIORITY_JPTREE)
 {
     nullPTreeIterator = new NullPTreeIterator;
 #ifdef USE_READONLY_ATOMTABLE
-    AttrStrUnionWithTable::roNameTable = new RONameTable;
+    AttrStrUnionWithTable::roNameTable = new RONameTable(255);
+    AttrStrUnionWithValueTable::roValueTable = new RONameTable(4095);
     initializeRoTable();
 #endif
     keyTable = new AtomRefTable;
@@ -128,6 +185,7 @@ MODULE_EXIT()
     keyTableNC->Release();
 #ifdef USE_READONLY_ATOMTABLE
     delete AttrStrUnionWithTable::roNameTable;
+    delete AttrStrUnionWithValueTable::roValueTable;
 #endif
     free(freelist);
     freelist = NULL;

+ 31 - 1
system/jlib/jptree.ipp

@@ -517,15 +517,45 @@ struct AttrStrUnionWithTable : public AttrStrUnion
     }
     static RONameTable *roNameTable;
 };
+
+struct AttrStrUnionWithValueTable : public AttrStrUnion
+{
+    inline const char *get() const
+    {
+        if (flag==3) // no point in also checking !isPtr() afaics
+            return roValueTable->getIndex(idx2)->str_DO_NOT_USE_DIRECTLY;  // Should probably rename this back now!
+        return AttrStrUnion::get();
+    }
+    bool set(const char *key)
+    {
+        if (key)
+        {
+            unsigned idx = roValueTable->findIndex(key, AttrStrC::getHash(key));
+            if (idx != (unsigned) -1)
+            {
+                assert(idx <= 0xffff);
+                flag = 3;
+                idx2 = idx;
+                return true;
+            }
+#ifdef _TRACE_VALUE_MISSES
+            PROGLOG("notfound key = %s", key);
+#endif
+        }
+        return false;
+    }
+    static RONameTable *roValueTable;
+};
 #else
 typedef AttrStrUnion AttrStrUnionWithTable;
+typedef AttrStrUnion AttrStrUnionWithValueTable;
 
 #endif
 
 struct AttrValue
 {
     AttrStrUnionWithTable key;
-    AttrStrUnion value;
+    AttrStrUnionWithValueTable value;
 };
 
 

+ 1 - 0
testing/regress/hpcc/util/ecl/cc.py

@@ -43,6 +43,7 @@ class ECLCC(Shell):
             return (repr(err), repr( err))
 
     def makeArchive(self, ecl):
+        self.defaults.append('--nostdinc')
         self.addIncludePath(ecl.dir_inc)
         dirname = ecl.dir_a
         filename = ecl.getArchive()

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

@@ -385,6 +385,7 @@ public:
             cachedMetaInfo.isSource = true;
             getPartsMetaInfo(cachedMetaInfo, partDescs.ordinality(), partDescs.getArray(), partHandler);
             cachedMetaInfo.unknownRowsOutput = true; // at least I don't think we know
+            cachedMetaInfo.fastThrough = true;
         }
         info = cachedMetaInfo;
     }

+ 3 - 0
thorlcr/activities/diskread/thdiskreadslave.cpp

@@ -466,6 +466,7 @@ public:
             initMetaInfo(cachedMetaInfo);
             cachedMetaInfo.isSource = true;
             getPartsMetaInfo(cachedMetaInfo, partDescs.ordinality(), partDescs.getArray(), partHandler);
+            cachedMetaInfo.fastThrough = true;
         }
         info = cachedMetaInfo;
         if (info.totalRowsMin==info.totalRowsMax)
@@ -877,6 +878,8 @@ public:
     {
         initMetaInfo(info);
         info.isSource = true;
+        if (totalCountKnown)
+            info.fastThrough = true;
         // MORE TBD
     }
     virtual bool isGrouped() const override { return false; }

+ 0 - 1
thorlcr/activities/nsplitter/thnsplitterslave.cpp

@@ -379,7 +379,6 @@ public:
     virtual void getMetaInfo(ThorDataLinkMetaInfo &info) override
     {
         initMetaInfo(info);
-        info.fastThrough = true;
         info.unknownRowsOutput = true;  // remove once calcMetaInfoSize() is called
 
         //GH->JCS I think the following line is correct and may remove some downstream spilling streams

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

@@ -279,6 +279,7 @@ public:
             cachedMetaInfo.isSource = true;
             getPartsMetaInfo(cachedMetaInfo, partDescs.ordinality(), partDescs.getArray(), partHandler);
             cachedMetaInfo.unknownRowsOutput = true; // at least I don't think we know
+            cachedMetaInfo.fastThrough = true;
         }
         info = cachedMetaInfo;
     }