浏览代码

Merge remote-tracking branch 'origin/candidate-5.0.0' into closedown-5.0.x

Conflicts:
	version.cmake

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 年之前
父节点
当前提交
d4ba0ae80f
共有 100 个文件被更改,包括 2980 次插入1074 次删除
  1. 24 8
      common/environment/dalienv.cpp
  2. 10 128
      common/environment/environment.cpp
  3. 0 3
      common/environment/environment.hpp
  4. 15 34
      common/thorhelper/layouttrans.cpp
  5. 1 3
      common/thorhelper/layouttrans.hpp
  6. 3 7
      common/thorhelper/layouttrans.ipp
  7. 3 1
      common/workunit/CMakeLists.txt
  8. 70 39
      common/workunit/workunit.cpp
  9. 1 0
      dali/base/dadfs.cpp
  10. 140 148
      dali/base/dautils.cpp
  11. 5 3
      dali/base/dautils.hpp
  12. 0 17
      dali/dafilesrv/dafscontrol.cpp
  13. 5 3
      dali/dfuplus/main.cpp
  14. 1 0
      docs/CMakeLists.txt
  15. 10 1
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-BUILD.xml
  16. 34 5
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-OUTPUT.xml
  17. 46 0
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-SOAPCALL.xml
  18. 9 2
      docs/ECLLanguageReference/ECLR_mods/ResrvdKywds-IMPORT.xml
  19. 49 0
      docs/ECLLanguageReference/ECLR_mods/Templ-OPTION.xml
  20. 1 1
      docs/ECLStandardLibraryReference/SLR-Mods/SprayVariable.xml
  21. 10 7
      docs/HPCCCertify/Cert-Mods/CertPreflight.xml
  22. 18 0
      docs/HPCCSystemAdmin/CMakeLists.txt
  23. 1465 0
      docs/HPCCSystemAdmin/HPCCSystemAdministratorsGuide.xml
  24. 373 0
      docs/HPCCSystemAdmin/SA-Mods/SysAdminConfigMod.xml
  25. 二进制
      docs/images/CS-1912.jpg
  26. 二进制
      docs/images/CS-sysfail.jpg
  27. 二进制
      docs/images/CSimg01.jpg
  28. 二进制
      docs/images/CSimg02.jpg
  29. 二进制
      docs/images/CSimg03.jpg
  30. 二进制
      docs/images/CSimg04.jpg
  31. 二进制
      docs/images/CSimg05.jpg
  32. 二进制
      docs/images/CSimg06.jpg
  33. 二进制
      docs/images/CSimg07.jpg
  34. 二进制
      docs/images/CSimg08.jpg
  35. 二进制
      docs/images/CSimg09.jpg
  36. 二进制
      docs/images/SA002.jpg
  37. 二进制
      docs/images/SA003.jpg
  38. 二进制
      docs/images/SA004.jpg
  39. 二进制
      docs/images/SA005.jpg
  40. 二进制
      docs/images/SA006.jpg
  41. 二进制
      docs/images/SA008.jpg
  42. 7 2
      ecl/hql/hqlparse.cpp
  43. 2 2
      ecl/hthor/hthor.cpp
  44. 1 1
      ecl/regress/demangle.ecl
  45. 1 1
      ecl/regress/err2201.ecl
  46. 1 1
      ecl/regress/err2203.ecl
  47. 1 1
      ecl/regress/err2204.ecl
  48. 1 1
      ecl/regress/err2205.ecl
  49. 1 1
      ecl/regress/err2206.ecl
  50. 1 1
      ecl/regress/err2208.ecl
  51. 1 1
      ecl/regress/err2209.ecl
  52. 1 1
      ecl/regress/err2210.ecl
  53. 1 1
      ecl/regress/errextrabreak.ecl
  54. 1 1
      ecl/regress/errextraelse.ecl
  55. 1 1
      ecl/regress/errextraend.ecl
  56. 1 1
      ecl/regress/errisvalid.ecl
  57. 1 1
      ecl/regress/errloop2.ecl
  58. 1 1
      ecl/regress/errloop3.ecl
  59. 1 1
      ecl/regress/errloop4.ecl
  60. 1 1
      ecl/regress/errloop5.ecl
  61. 1 1
      ecl/regress/errloop6.ecl
  62. 1 1
      ecl/regress/errloop7.ecl
  63. 1 1
      ecl/regress/errloop8.ecl
  64. 1 1
      ecl/regress/errmissingend.ecl
  65. 1 1
      ecl/regress/errmissingend1.ecl
  66. 1 1
      ecl/regress/errmissingend2.ecl
  67. 1 1
      ecl/regress/errmissingend3.ecl
  68. 1 1
      ecl/regress/errmissingend4.ecl
  69. 1 1
      ecl/regress/errnestedhashif.ecl
  70. 1 1
      ecl/regress/export2.ecl
  71. 1 1
      ecl/regress/export3.ecl
  72. 1 1
      ecl/regress/export4.ecl
  73. 1 1
      ecl/regress/gch2.ecl
  74. 1 1
      ecl/regress/hashelseif2.ecl
  75. 1 1
      ecl/regress/mangle.ecl
  76. 1 1
      ecl/regress/memleak9.ecl
  77. 1 1
      ecl/regress/mluber36.ecl
  78. 1 1
      ecl/regress/mluber63.ecl
  79. 1 1
      ecl/regress/mluber66.ecl
  80. 1 1
      ecl/regress/round.ecl
  81. 1 1
      ecl/regress/round2.ecl
  82. 1 1
      ecl/regress/rtaylor22.ecl
  83. 1 1
      ecl/regress/textsearch.ecl
  84. 1 1
      ecl/regress/tmptcall1.ecl
  85. 1 1
      ecl/regress/tmptcall2.ecl
  86. 1 1
      ecl/regress/tmptcall3.ecl
  87. 1 1
      ecl/regress/tmptcall4.ecl
  88. 2 12
      esp/build.sh
  89. 150 150
      esp/eclwatch/ws_XSLT/nls/bs/hpcc.xml
  90. 148 148
      esp/eclwatch/ws_XSLT/nls/hr/hpcc.xml
  91. 155 155
      esp/eclwatch/ws_XSLT/nls/sr/hpcc.xml
  92. 0 30
      esp/platform/espcfg.cpp
  93. 90 99
      esp/profiles/eclwatch.profile.js
  94. 11 2
      esp/scm/ws_dfu.ecm
  95. 7 1
      esp/scm/ws_workunits.ecm
  96. 68 14
      esp/services/ws_dfu/ws_dfuService.cpp
  97. 2 0
      esp/services/ws_dfu/ws_dfuService.hpp
  98. 1 1
      esp/services/ws_ecl/ws_ecl_service.cpp
  99. 0 4
      esp/services/ws_fileio/ws_fileioservice.cpp
  100. 0 0
      esp/services/ws_fs/ws_fsBinding.cpp

+ 24 - 8
common/environment/dalienv.cpp

@@ -379,6 +379,8 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
     // first get machine by IP
     // first get machine by IP
     StringBuffer ips;
     StringBuffer ips;
     ip.getIpText(ips);
     ip.getIpText(ips);
+
+    //Cannot use getEnvironmentFactory() since it is using a remotedali
     StringBuffer xpath;
     StringBuffer xpath;
     xpath.appendf("Environment/Hardware/Computer[@netAddress=\"%s\"]", ips.str());
     xpath.appendf("Environment/Hardware/Computer[@netAddress=\"%s\"]", ips.str());
     Owned<IPropertyTreeIterator> iter = querySDS().getElementsRaw(xpath,remotedali,timeout);
     Owned<IPropertyTreeIterator> iter = querySDS().getElementsRaw(xpath,remotedali,timeout);
@@ -393,6 +395,7 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
         ERRLOG("Unable to find domain for %s on dali %s", ips.str(),dalis.str());
         ERRLOG("Unable to find domain for %s on dali %s", ips.str(),dalis.str());
         return false;
         return false;
     }
     }
+
     xpath.clear().appendf("Environment/Software/%s",keyName);
     xpath.clear().appendf("Environment/Software/%s",keyName);
     if (version)
     if (version)
         xpath.appendf("[@version='%s']",version);
         xpath.appendf("[@version='%s']",version);
@@ -441,15 +444,21 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
     return false;
     return false;
 }
 }
 
 
-#define SDS_CONNECT_TIMEOUT 30000
 bool envGetConfigurationDirectory(const char *category, const char *component,const char *instance, StringBuffer &dirout)
 bool envGetConfigurationDirectory(const char *category, const char *component,const char *instance, StringBuffer &dirout)
 {
 {
     SessionId sessid = myProcessSession();
     SessionId sessid = myProcessSession();
     if (!sessid)
     if (!sessid)
         return false;
         return false;
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Software/Directories",sessid, 0, SDS_CONNECT_TIMEOUT);
-    if (conn) 
-        return getConfigurationDirectory(conn->queryRoot(),category,component,instance,dirout);
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
+    {
+        Owned<IPropertyTree> root = &env->getPTree();
+        IPropertyTree * child = root->queryPropTree("Software/Directories");
+        if (child)
+            return getConfigurationDirectory(child,category,component,instance,dirout);
+    }
     return false;
     return false;
 }
 }
 
 
@@ -483,10 +492,17 @@ IPropertyTree *envGetNASConfiguration()
     SessionId sessid = myProcessSession();
     SessionId sessid = myProcessSession();
     if (!sessid)
     if (!sessid)
         return NULL;
         return NULL;
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Hardware", sessid, 0, SDS_CONNECT_TIMEOUT);
-    if (!conn)
-        return NULL;
-    return envGetNASConfiguration(conn->queryRoot());
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
+    {
+        Owned<IPropertyTree> root = &env->getPTree();
+        IPropertyTree * hardware = root->queryPropTree("Hardware");
+        if (hardware)
+            return envGetNASConfiguration(hardware);
+    }
+    return NULL;
 }
 }
 
 
 IPropertyTree *envGetInstallNASHooks(SocketEndpoint *myEp)
 IPropertyTree *envGetInstallNASHooks(SocketEndpoint *myEp)

+ 10 - 128
common/environment/environment.cpp

@@ -30,16 +30,11 @@
 #include "dasds.hpp"
 #include "dasds.hpp"
 #include "dalienv.hpp"
 #include "dalienv.hpp"
 
 
-#define SDS_LOCK_TIMEOUT  10000
+#define SDS_LOCK_TIMEOUT  30000
 
 
 
 
 static int environmentTraceLevel = 1;
 static int environmentTraceLevel = 1;
-static char sEnvironmentConfFile[1024];
-static char sEnvironmentXMLFile[1024];
-static StringBuffer sEnvironmentConf;
 static Owned <IConstEnvironment> cache;
 static Owned <IConstEnvironment> cache;
-static CDateTime confFileCacheTime;
-static CDateTime xmlFileCacheTime;
 
 
 class CConstInstanceInfo;
 class CConstInstanceInfo;
 
 
@@ -334,10 +329,10 @@ class CEnvironmentFactory : public CInterface,
 {
 {
 public:
 public:
     IMPLEMENT_IINTERFACE;
     IMPLEMENT_IINTERFACE;
-   MAKEValueArray(SubscriptionId, SubscriptionIDs);
-   SubscriptionIDs subIDs;
+    MAKEValueArray(SubscriptionId, SubscriptionIDs);
+    SubscriptionIDs subIDs;
     Mutex mutex;
     Mutex mutex;
-   Owned<CSdsSubscription> subscription;
+    Owned<CSdsSubscription> subscription;
     
     
     CEnvironmentFactory()
     CEnvironmentFactory()
     {
     {
@@ -350,119 +345,6 @@ public:
         close(); //just in case it was not explicitly closed
         close(); //just in case it was not explicitly closed
     }
     }
 
 
-    //Create the first environment cache from a file
-    virtual IConstEnvironment* createEnvironmentByFile(const char* environmentConfFile, const char* environmentXMLFile)
-    {
-        sEnvironmentConfFile[0] = 0;
-        sEnvironmentXMLFile[0] = 0;
-        sEnvironmentConf.clear();
-
-        if (environmentConfFile && *environmentConfFile)
-        {  
-            strcpy(sEnvironmentConfFile, environmentConfFile);
-
-            IFile * pFile = createIFile(sEnvironmentConfFile);
-            if (pFile->exists( ))
-            {       
-                CDateTime fcreated, fmodified, faccessed;
-                if (pFile->getTime(&fcreated, &fmodified, &faccessed)) 
-                {
-                    xmlFileCacheTime = fmodified;
-                    Owned<IFileIO> pFileIO = pFile->openShared(IFOread, IFSHfull);
-                    if (pFileIO)
-                    {
-                        StringBuffer tmpBuf;
-                        offset_t fileSize = pFile->size();
-                        tmpBuf.ensureCapacity((unsigned)fileSize);
-                        tmpBuf.setLength((unsigned)fileSize);
-
-                        size32_t nRead = pFileIO->read(0, (size32_t) fileSize, (char*)tmpBuf.str());
-                        if (nRead == fileSize)
-                        {
-                            sEnvironmentConf = tmpBuf;
-                        }
-                    }
-                }
-            }
-        }
-
-        if (!environmentXMLFile || !*environmentXMLFile)
-            return NULL;
-
-        strcpy(sEnvironmentXMLFile, environmentXMLFile);
-
-        IFile * ifile = createIFile(sEnvironmentXMLFile);
-        if (!ifile->exists( ))
-            return NULL;
-    
-        CDateTime fcreated, fmodified, faccessed;
-        if (!ifile->getTime(&fcreated, &fmodified, &faccessed)) 
-            return NULL;
-
-        xmlFileCacheTime = fmodified;
-        cache.setown(new CLocalEnvironment(sEnvironmentXMLFile));
-
-        return cache.getLink();
-    }
-
-    virtual const char* getEnvironmentConf()
-    {
-        if (!sEnvironmentConfFile || !*sEnvironmentConfFile)
-            return NULL;
-
-        IFile * pFile = createIFile(sEnvironmentConfFile);
-        if (pFile->exists( ))
-        {       
-            CDateTime fcreated, fmodified, faccessed;
-            if (pFile->getTime(&fcreated, &fmodified, &faccessed)) 
-            {
-                if ((sEnvironmentConf.length() < 1) || (xmlFileCacheTime != fmodified))
-                {
-                    xmlFileCacheTime = fmodified;
-                    Owned<IFileIO> pFileIO = pFile->openShared(IFOread, IFSHfull);
-                    if (pFileIO)
-                    {
-                        StringBuffer tmpBuf;
-                        offset_t fileSize = pFile->size();
-                        tmpBuf.ensureCapacity((unsigned)fileSize);
-                        tmpBuf.setLength((unsigned)fileSize);
-
-                        size32_t nRead = pFileIO->read(0, (size32_t) fileSize, (char*)tmpBuf.str());
-                        if (nRead == fileSize)
-                        {
-                            sEnvironmentConf = tmpBuf;
-                        }
-                    }
-                }
-            }
-        }
-        return sEnvironmentConf.str();
-    }
-
-    virtual IConstEnvironment* openEnvironmentByFile()
-    {
-        //For cackward compatible
-        if (!sEnvironmentXMLFile || !*sEnvironmentXMLFile)
-            return openEnvironment();
-        
-        synchronized procedure(mutex);
-
-        IFile * ifile = createIFile(sEnvironmentXMLFile);
-        if (!ifile->exists( ))
-            return openEnvironment();
-    
-        CDateTime fcreated, fmodified, faccessed;
-        if (!ifile->getTime(&fcreated, &fmodified, &faccessed)) 
-            return openEnvironment();
-
-        if (!cache || (xmlFileCacheTime != fmodified))
-        {
-            xmlFileCacheTime = fmodified;
-            cache.setown(new CLocalEnvironment(sEnvironmentXMLFile));
-        }
-        return cache.getLink();
-    }
-
     virtual IConstEnvironment* openEnvironment()
     virtual IConstEnvironment* openEnvironment()
     {
     {
         synchronized procedure(mutex);
         synchronized procedure(mutex);
@@ -476,9 +358,9 @@ public:
         return cache.getLink();
         return cache.getLink();
     }
     }
 
 
-   virtual IEnvironment* updateEnvironment()
+    virtual IEnvironment* updateEnvironment()
     {
     {
-      Owned<IConstEnvironment> pConstEnv = openEnvironment();
+        Owned<IConstEnvironment> pConstEnv = openEnvironment();
 
 
         synchronized procedure(mutex);
         synchronized procedure(mutex);
         return &pConstEnv->lock();
         return &pConstEnv->lock();
@@ -530,7 +412,7 @@ public:
 
 
         synchronized procedure(mutex);
         synchronized procedure(mutex);
         subIDs.append(sub_id);
         subIDs.append(sub_id);
-      return sub_id;
+        return sub_id;
    }
    }
          
          
    virtual void unsubscribe(SubscriptionId sub_id)
    virtual void unsubscribe(SubscriptionId sub_id)
@@ -547,10 +429,10 @@ public:
 
 
    virtual void validateCache()
    virtual void validateCache()
    {
    {
-      if (!subscription)
-         subscription.setown( new CSdsSubscription() );
+        if (!subscription)
+            subscription.setown( new CSdsSubscription() );
       
       
-      subscription->handleEnvironmentChange();
+        subscription->handleEnvironmentChange();
    }
    }
 
 
 private:
 private:

+ 0 - 3
common/environment/environment.hpp

@@ -130,9 +130,6 @@ interface IEnvironment : extends IConstEnvironment
 interface IEnvironmentFactory : extends IInterface
 interface IEnvironmentFactory : extends IInterface
 {
 {
     virtual IConstEnvironment * openEnvironment() = 0;
     virtual IConstEnvironment * openEnvironment() = 0;
-    virtual IConstEnvironment * createEnvironmentByFile(const char * environmentConfFile, const char * environmentXMLFile) = 0;
-    virtual IConstEnvironment * openEnvironmentByFile() = 0;
-    virtual const char * getEnvironmentConf() = 0;
     virtual IEnvironment * updateEnvironment() = 0;
     virtual IEnvironment * updateEnvironment() = 0;
     virtual IEnvironment * loadLocalEnvironmentFile(const char * filename) = 0;
     virtual IEnvironment * loadLocalEnvironmentFile(const char * filename) = 0;
     virtual IEnvironment * loadLocalEnvironment(const char * xml) = 0;
     virtual IEnvironment * loadLocalEnvironment(const char * xml) = 0;

+ 15 - 34
common/thorhelper/layouttrans.cpp

@@ -380,7 +380,7 @@ void RowTransformer::generateCopies(unsigned & seq, CIArrayOf<RowRecord> const &
     }
     }
 }
 }
 
 
-void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, byte * out, size32_t outBuffSize, size32_t & outOffset) const
+void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, IMemoryBlock & out, size32_t & outOffset) const
 {
 {
     ctx->set(sequence, 0, 0, in+inOffset);
     ctx->set(sequence, 0, 0, in+inOffset);
     for(unsigned varIdx = 1; varIdx <= diskVarFieldRelOffsets.ordinality(); ++varIdx)
     for(unsigned varIdx = 1; varIdx <= diskVarFieldRelOffsets.ordinality(); ++varIdx)
@@ -402,7 +402,7 @@ void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ct
     inOffset += finalFixedSize;
     inOffset += finalFixedSize;
 
 
     ForEachItemIn(copyIdx, copies)
     ForEachItemIn(copyIdx, copies)
-        copies.item(copyIdx).copy(ctx, out, outBuffSize, outOffset);
+        copies.item(copyIdx).copy(ctx, out, outOffset);
 }
 }
 
 
 void RowTransformer::getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const
 void RowTransformer::getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const
@@ -435,17 +435,16 @@ void RowTransformer::createRowTransformContext(IRecordLayoutTranslator::RowTrans
     }
     }
 }
 }
 
 
-void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte * out, size32_t outBuffSize, size32_t & outOffset) const
+void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, IMemoryBlock & out, size32_t & outOffset) const
 {
 {
     if(sequence == static_cast<unsigned>(-1))
     if(sequence == static_cast<unsigned>(-1))
     {
     {
-        if(outOffset+fixedSize > outBuffSize)
-            throw MakeStringException(0, "Activity row exceeded expected size limit during record layout translation");
+        byte * target = out.ensure(outOffset+fixedSize);
         // integer field in row is big-endian
         // integer field in row is big-endian
 #if __BYTE_ORDER == __BIG_ENDIAN
 #if __BYTE_ORDER == __BIG_ENDIAN
-        memcpy(out+outOffset, reinterpret_cast<byte const *>(ctx->queryFposIn()) + sizeof(offset_t) - fixedSize, fixedSize);
+        memcpy(target+outOffset, reinterpret_cast<byte const *>(ctx->queryFposIn()) + sizeof(offset_t) - fixedSize, fixedSize);
 #else
 #else
-        _cpyrevn(out+outOffset, ctx->queryFposIn(), fixedSize);
+        _cpyrevn(target+outOffset, ctx->queryFposIn(), fixedSize);
 #endif
 #endif
         outOffset += fixedSize;
         outOffset += fixedSize;
         return;
         return;
@@ -459,18 +458,20 @@ void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte *
     if(childTransformer)
     if(childTransformer)
     {
     {
         size32_t inOffset = sizeof(size32_t);
         size32_t inOffset = sizeof(size32_t);
-        size32_t * outSizePtr = reinterpret_cast<size32_t *>(out+outOffset);
+        size32_t sizeOutOffset = outOffset;
         outOffset += sizeof(size32_t);
         outOffset += sizeof(size32_t);
         size32_t startOutOffset = outOffset;
         size32_t startOutOffset = outOffset;
         while(inOffset < diskFieldSize)
         while(inOffset < diskFieldSize)
-            childTransformer->transform(ctx, in, diskFieldSize, inOffset, out, outBuffSize, outOffset);
+            childTransformer->transform(ctx, in, diskFieldSize, inOffset, out, outOffset);
+
+        //Now patch the length up - transform may have resized out...
+        size32_t * outSizePtr = reinterpret_cast<size32_t *>(out.getMem()+sizeOutOffset);
         *outSizePtr = outOffset-startOutOffset;
         *outSizePtr = outOffset-startOutOffset;
     }
     }
     else
     else
     {
     {
-        if(outOffset+diskFieldSize > outBuffSize)
-            throw MakeStringException(0, "Activity row exceeded expected size limit during record layout translation");
-        memcpy(out+outOffset, in, diskFieldSize);
+        byte * target = out.ensure(outOffset+diskFieldSize);
+        memcpy(target+outOffset, in, diskFieldSize);
         outOffset += diskFieldSize;
         outOffset += diskFieldSize;
     }
     }
 }
 }
@@ -499,26 +500,10 @@ IRecordLayoutTranslator::RowTransformContext::~RowTransformContext()
     delete [] ptrs;
     delete [] ptrs;
 }
 }
 
 
-size32_t calcMetaSize(IDefRecordMeta const * meta)
-{
-    IDefRecordElement * record = meta->queryRecord();
-    size32_t size = record->getMaxSize();
-    unsigned numFields = record->numChildren();
-    if(meta->numKeyedFields() < numFields)
-    {
-        ITypeInfo * lastFieldType = record->queryChild(numFields-1)->queryType();
-        if(lastFieldType->isInteger())
-            size -= lastFieldType->getSize();
-    }
-    return size;
-}
-
 CRecordLayoutTranslator::CRecordLayoutTranslator(IDefRecordMeta const * _diskMeta, IDefRecordMeta const * _activityMeta) : diskMeta(const_cast<IDefRecordMeta *>(_diskMeta)), activityMeta(const_cast<IDefRecordMeta *>(_activityMeta)), activityKeySizes(NULL)
 CRecordLayoutTranslator::CRecordLayoutTranslator(IDefRecordMeta const * _diskMeta, IDefRecordMeta const * _activityMeta) : diskMeta(const_cast<IDefRecordMeta *>(_diskMeta)), activityMeta(const_cast<IDefRecordMeta *>(_activityMeta)), activityKeySizes(NULL)
 {
 {
     numKeyedDisk = diskMeta->numKeyedFields();
     numKeyedDisk = diskMeta->numKeyedFields();
     numKeyedActivity = activityMeta->numKeyedFields();
     numKeyedActivity = activityMeta->numKeyedFields();
-    diskMetaSize = calcMetaSize(diskMeta);
-    activityMetaSize = calcMetaSize(activityMeta);
     MappingLevel topMappingLevel(mappings);
     MappingLevel topMappingLevel(mappings);
     numTransformers = 0;
     numTransformers = 0;
     try
     try
@@ -620,10 +605,6 @@ void CRecordLayoutTranslator::createDiskSegmentMonitors(SegmentMonitorContext co
 
 
 void CRecordLayoutTranslator::checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const
 void CRecordLayoutTranslator::checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const
 {
 {
-    if(activityMetaSize != activitySize)
-        throw MakeStringException(0, "Key size mismatch during translation of index %s: ECL indicates size %u, ECL record meta has size %u", filename, activitySize, activityMetaSize);
-    if(diskMetaSize != diskSize)
-        throw MakeStringException(0, "Key size mismatch during translation of index %s: index indicates size %u, index record meta has size %u", filename, diskSize, diskMetaSize);
 }
 }
 
 
 IRecordLayoutTranslator::RowTransformContext * CRecordLayoutTranslator::getRowTransformContext()
 IRecordLayoutTranslator::RowTransformContext * CRecordLayoutTranslator::getRowTransformContext()
@@ -633,12 +614,12 @@ IRecordLayoutTranslator::RowTransformContext * CRecordLayoutTranslator::getRowTr
     return ctx.getClear();
     return ctx.getClear();
 }
 }
 
 
-size32_t CRecordLayoutTranslator::transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const
+size32_t CRecordLayoutTranslator::transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const
 {
 {
     size32_t inOffset = 0;
     size32_t inOffset = 0;
     size32_t outOffset = 0;
     size32_t outOffset = 0;
     ctx->setFposIn(fpos);
     ctx->setFposIn(fpos);
-    transformer.transform(ctx, in, inSize, inOffset, out, outBuffSize, outOffset);
+    transformer.transform(ctx, in, inSize, inOffset, out, outOffset);
     transformer.getFposOut(ctx, fpos);
     transformer.getFposOut(ctx, fpos);
     return outOffset;
     return outOffset;
 }
 }

+ 1 - 3
common/thorhelper/layouttrans.hpp

@@ -68,14 +68,12 @@ public:
 
 
     virtual bool querySuccess() const = 0;
     virtual bool querySuccess() const = 0;
     virtual Failure const & queryFailure() const = 0;
     virtual Failure const & queryFailure() const = 0;
-    virtual size32_t queryActivityKeySize() const = 0;
-    virtual size32_t queryDiskKeySize() const = 0;
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const = 0;
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const = 0;
     virtual bool queryKeysTransformed() const = 0;
     virtual bool queryKeysTransformed() const = 0;
     virtual SegmentMonitorContext * getSegmentMonitorContext() = 0;
     virtual SegmentMonitorContext * getSegmentMonitorContext() = 0;
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out) = 0;
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out) = 0;
     virtual RowTransformContext * getRowTransformContext() = 0;
     virtual RowTransformContext * getRowTransformContext() = 0;
-    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const = 0;
+    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const = 0;
 #ifdef DEBUG_HELPERS_REQUIRED
 #ifdef DEBUG_HELPERS_REQUIRED
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const = 0;
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const = 0;
 #endif
 #endif

+ 3 - 7
common/thorhelper/layouttrans.ipp

@@ -120,7 +120,7 @@ public:
     RowTransformer() {}
     RowTransformer() {}
     RowTransformer(unsigned & seq, FieldMapping::List const & mappings) { build(seq, mappings); }
     RowTransformer(unsigned & seq, FieldMapping::List const & mappings) { build(seq, mappings); }
     void build(unsigned & seq, FieldMapping::List const & mappings);
     void build(unsigned & seq, FieldMapping::List const & mappings);
-    void transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, byte * out, size32_t outBuffSize, size32_t & outOffset) const;
+    void transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, IMemoryBlock & out, size32_t & outOffset) const;
     void getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const;
     void getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const;
     void createRowTransformContext(IRecordLayoutTranslator::RowTransformContext * ctx) const;
     void createRowTransformContext(IRecordLayoutTranslator::RowTransformContext * ctx) const;
 
 
@@ -178,7 +178,7 @@ public:
     void addVarField(unsigned base) { varFields.append(base); }
     void addVarField(unsigned base) { varFields.append(base); }
     void setChildTransformer(RowTransformer * _transformer) { assertex(!childTransformer); childTransformer.setown(_transformer); }
     void setChildTransformer(RowTransformer * _transformer) { assertex(!childTransformer); childTransformer.setown(_transformer); }
     RowTransformer const * queryChildTransformer() const { return childTransformer; }
     RowTransformer const * queryChildTransformer() const { return childTransformer; }
-    void copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte * out, size32_t outBuffSize, size32_t & outOffset) const;
+    void copy(IRecordLayoutTranslator::RowTransformContext * ctx, IMemoryBlock & out, size32_t & outOffset) const;
 private:
 private:
     unsigned sequence;
     unsigned sequence;
     size32_t relOffset;
     size32_t relOffset;
@@ -196,14 +196,12 @@ public:
     IMPLEMENT_IINTERFACE;
     IMPLEMENT_IINTERFACE;
     virtual bool querySuccess() const { return !failure; }
     virtual bool querySuccess() const { return !failure; }
     virtual Failure const & queryFailure() const { return *failure; }
     virtual Failure const & queryFailure() const { return *failure; }
-    virtual size32_t queryActivityKeySize() const { return activityMetaSize; }
-    virtual size32_t queryDiskKeySize() const { return diskMetaSize; }
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const;
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const;
     virtual bool queryKeysTransformed() const { return keysTransformed; }
     virtual bool queryKeysTransformed() const { return keysTransformed; }
     virtual SegmentMonitorContext * getSegmentMonitorContext() { return new ExpandedSegmentMonitorList(this); }
     virtual SegmentMonitorContext * getSegmentMonitorContext() { return new ExpandedSegmentMonitorList(this); }
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out);
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out);
     virtual RowTransformContext * getRowTransformContext();
     virtual RowTransformContext * getRowTransformContext();
-    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const;
+    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const;
 #ifdef DEBUG_HELPERS_REQUIRED
 #ifdef DEBUG_HELPERS_REQUIRED
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const;
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const;
 #endif
 #endif
@@ -217,8 +215,6 @@ private:
 
 
     Linked<IDefRecordMeta> diskMeta;
     Linked<IDefRecordMeta> diskMeta;
     Linked<IDefRecordMeta> activityMeta;
     Linked<IDefRecordMeta> activityMeta;
-    size32_t activityMetaSize;
-    size32_t diskMetaSize;
     bool success;
     bool success;
     Owned<Failure> failure;
     Owned<Failure> failure;
     FieldMapping::List mappings;
     FieldMapping::List mappings;

+ 3 - 1
common/workunit/CMakeLists.txt

@@ -41,6 +41,7 @@ set (    SRCS
     )
     )
 
 
 include_directories ( 
 include_directories ( 
+         ./../../common/environment
          ./../../common/workunit
          ./../../common/workunit
          ./../../system/mp 
          ./../../system/mp 
          ./../../dali/ft 
          ./../../dali/ft 
@@ -68,7 +69,8 @@ target_link_libraries ( workunit
          dllserver 
          dllserver 
          nbcd 
          nbcd 
          eclrtl 
          eclrtl 
-         deftype 
+         deftype
+         environment
     )
     )
 
 
 
 

+ 70 - 39
common/workunit/workunit.cpp

@@ -45,6 +45,7 @@
 
 
 #include "wuerror.hpp"
 #include "wuerror.hpp"
 #include "wujobq.hpp"
 #include "wujobq.hpp"
+#include "environment.hpp"
 
 
 #define GLOBAL_WORKUNIT "global"
 #define GLOBAL_WORKUNIT "global"
 
 
@@ -4352,10 +4353,12 @@ void getRoxieProcessServers(IPropertyTree *roxie, SocketEndpointArray &endpoints
 
 
 void getRoxieProcessServers(const char *process, SocketEndpointArray &servers)
 void getRoxieProcessServers(const char *process, SocketEndpointArray &servers)
 {
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return;
         return;
-    getRoxieProcessServers(queryRoxieProcessTree(conn->queryRoot(), process), servers);
+    Owned<IPropertyTree> root = &env->getPTree();
+    getRoxieProcessServers(queryRoxieProcessTree(root, process), servers);
 }
 }
 
 
 class CEnvironmentClusterInfo: public CInterface, implements IConstWUClusterInfo
 class CEnvironmentClusterInfo: public CInterface, implements IConstWUClusterInfo
@@ -4503,13 +4506,15 @@ IStringVal &getProcessQueueNames(IStringVal &ret, const char *process, const cha
 {
 {
     if (process)
     if (process)
     {
     {
-        Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-        if (conn)
+        Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+        Owned<IConstEnvironment> env = factory->openEnvironment();
+        if (env)
         {
         {
+            Owned<IPropertyTree> root = &env->getPTree();
             StringBuffer queueNames;
             StringBuffer queueNames;
             StringBuffer xpath;
             StringBuffer xpath;
             xpath.appendf("%s[@process=\"%s\"]", type, process);
             xpath.appendf("%s[@process=\"%s\"]", type, process);
-            Owned<IPropertyTreeIterator> targets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+            Owned<IPropertyTreeIterator> targets = root->getElements("Software/Topology/Cluster");
             ForEach(*targets)
             ForEach(*targets)
             {
             {
                 IPropertyTree &target = targets->query();
                 IPropertyTree &target = targets->query();
@@ -4570,11 +4575,16 @@ extern WORKUNIT_API StringBuffer &getClusterThorQueueName(StringBuffer &ret, con
 
 
 extern WORKUNIT_API StringBuffer &getClusterThorGroupName(StringBuffer &ret, const char *cluster)
 extern WORKUNIT_API StringBuffer &getClusterThorGroupName(StringBuffer &ret, const char *cluster)
 {
 {
-    StringBuffer path;
-    Owned<IRemoteConnection> conn = querySDS().connect(path.append("Environment/Software/ThorCluster[@name=\"").append(cluster).append("\"]").str(), myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
     {
     {
-        getClusterGroupName(*conn->queryRoot(), ret);
+        Owned<IPropertyTree> root = &env->getPTree();
+        StringBuffer path;
+        path.append("Software/ThorCluster[@name=\"").append(cluster).append("\"]");
+        IPropertyTree * child = root->queryPropTree(path);
+        if (child)
+            getClusterGroupName(*child, ret);
     }
     }
 
 
     return ret;
     return ret;
@@ -4602,15 +4612,17 @@ extern WORKUNIT_API StringBuffer &getClusterEclAgentQueueName(StringBuffer &ret,
 
 
 extern WORKUNIT_API IStringIterator *getTargetClusters(const char *processType, const char *processName)
 extern WORKUNIT_API IStringIterator *getTargetClusters(const char *processType, const char *processName)
 {
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
     Owned<CStringArrayIterator> ret = new CStringArrayIterator;
     Owned<CStringArrayIterator> ret = new CStringArrayIterator;
-    if (conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
     {
     {
+        Owned<IPropertyTree> root = &env->getPTree();
         StringBuffer xpath;
         StringBuffer xpath;
         xpath.appendf("%s", processType ? processType : "*");
         xpath.appendf("%s", processType ? processType : "*");
         if (processName && *processName)
         if (processName && *processName)
             xpath.appendf("[@process=\"%s\"]", processName);
             xpath.appendf("[@process=\"%s\"]", processName);
-        Owned<IPropertyTreeIterator> targets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+        Owned<IPropertyTreeIterator> targets = root->getElements("Software/Topology/Cluster");
         ForEach(*targets)
         ForEach(*targets)
         {
         {
             IPropertyTree &target = targets->query();
             IPropertyTree &target = targets->query();
@@ -4627,11 +4639,14 @@ extern WORKUNIT_API bool isProcessCluster(const char *process)
 {
 {
     if (!process || !*process)
     if (!process || !*process)
         return false;
         return false;
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return false;
         return false;
+
+    Owned<IPropertyTree> root = &env->getPTree();
     VStringBuffer xpath("Software/*Cluster[@name=\"%s\"]", process);
     VStringBuffer xpath("Software/*Cluster[@name=\"%s\"]", process);
-    return conn->queryRoot()->hasProp(xpath.str());
+    return root->hasProp(xpath.str());
 }
 }
 
 
 extern WORKUNIT_API bool isProcessCluster(const char *remoteDali, const char *process)
 extern WORKUNIT_API bool isProcessCluster(const char *remoteDali, const char *process)
@@ -4644,6 +4659,7 @@ extern WORKUNIT_API bool isProcessCluster(const char *remoteDali, const char *pr
     if (!remote)
     if (!remote)
         return false;
         return false;
 
 
+    //Cannot use getEnvironmentFactory() since it is using a remotedali
     VStringBuffer xpath("Environment/Software/*Cluster[@name=\"%s\"]/@name", process);
     VStringBuffer xpath("Environment/Software/*Cluster[@name=\"%s\"]/@name", process);
     try
     try
     {
     {
@@ -4696,41 +4712,46 @@ IConstWUClusterInfo* getTargetClusterInfo(IPropertyTree *environment, IPropertyT
     return new CEnvironmentClusterInfo(clustname, prefix, agent, thors, queryRoxieProcessTree(environment, roxieName));
     return new CEnvironmentClusterInfo(clustname, prefix, agent, thors, queryRoxieProcessTree(environment, roxieName));
 }
 }
 
 
-IPropertyTree* getTopologyCluster(Owned<IRemoteConnection> &conn, const char *clustname)
+IPropertyTree* getTopologyCluster(Owned<IPropertyTree> &envRoot, const char *clustname)
 {
 {
     if (!clustname || !*clustname)
     if (!clustname || !*clustname)
         return NULL;
         return NULL;
-    conn.setown(querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT));
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return NULL;
         return NULL;
+
+    envRoot.setown(&env->getPTree());
     StringBuffer xpath;
     StringBuffer xpath;
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
-    return conn->queryRoot()->getPropTree(xpath.str());
+    return envRoot->getPropTree(xpath.str());
 }
 }
 
 
 bool validateTargetClusterName(const char *clustname)
 bool validateTargetClusterName(const char *clustname)
 {
 {
-    Owned<IRemoteConnection> conn;
-    Owned<IPropertyTree> cluster = getTopologyCluster(conn, clustname);
+    Owned<IPropertyTree> envRoot;
+    Owned<IPropertyTree> cluster = getTopologyCluster(envRoot, clustname);
     return (cluster.get()!=NULL);
     return (cluster.get()!=NULL);
 }
 }
 
 
 IConstWUClusterInfo* getTargetClusterInfo(const char *clustname)
 IConstWUClusterInfo* getTargetClusterInfo(const char *clustname)
 {
 {
-    Owned<IRemoteConnection> conn;
-    Owned<IPropertyTree> cluster = getTopologyCluster(conn, clustname);
+    Owned<IPropertyTree> envRoot;
+    Owned<IPropertyTree> cluster = getTopologyCluster(envRoot, clustname);
     if (!cluster)
     if (!cluster)
         return NULL;
         return NULL;
-    return getTargetClusterInfo(conn->queryRoot(), cluster);
+    return getTargetClusterInfo(envRoot, cluster);
 }
 }
 
 
 unsigned getEnvironmentClusterInfo(CConstWUClusterInfoArray &clusters)
 unsigned getEnvironmentClusterInfo(CConstWUClusterInfoArray &clusters)
 {
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
         return 0;
 
 
-    return getEnvironmentClusterInfo(conn->queryRoot(), clusters);
+    Owned<IPropertyTree> root = &env->getPTree();
+    return getEnvironmentClusterInfo(root, clusters);
 }
 }
 
 
 unsigned getEnvironmentClusterInfo(IPropertyTree* environmentRoot, CConstWUClusterInfoArray &clusters)
 unsigned getEnvironmentClusterInfo(IPropertyTree* environmentRoot, CConstWUClusterInfoArray &clusters)
@@ -4752,13 +4773,17 @@ const char *getTargetClusterComponentName(const char *clustname, const char *pro
 {
 {
     if (!clustname)
     if (!clustname)
         return NULL;
         return NULL;
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return NULL;
         return NULL;
+
+    Owned<IPropertyTree> root = &env->getPTree();
     StringBuffer xpath;
     StringBuffer xpath;
 
 
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
-    Owned<IPropertyTree> cluster = conn->queryRoot()->getPropTree(xpath.str());
+    Owned<IPropertyTree> cluster = root->getPropTree(xpath.str());
     if (!cluster) 
     if (!cluster) 
         return NULL;
         return NULL;
 
 
@@ -4770,10 +4795,13 @@ const char *getTargetClusterComponentName(const char *clustname, const char *pro
 
 
 unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &groupNames, StringArray &targetNames, StringArray &queueNames)
 unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &groupNames, StringArray &targetNames, StringArray &queueNames)
 {
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
         return 0;
-    Owned<IPropertyTreeIterator> allTargets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+
+    Owned<IPropertyTree> root = &env->getPTree();
+    Owned<IPropertyTreeIterator> allTargets = root->getElements("Software/Topology/Cluster");
     ForEach(*allTargets)
     ForEach(*allTargets)
     {
     {
         IPropertyTree &target = allTargets->query();
         IPropertyTree &target = allTargets->query();
@@ -4785,7 +4813,7 @@ unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &gro
             {
             {
                 const char *thorName = thorClusters->query().queryProp("@process");
                 const char *thorName = thorClusters->query().queryProp("@process");
                 VStringBuffer query("Software/ThorCluster[@name=\"%s\"]",thorName);
                 VStringBuffer query("Software/ThorCluster[@name=\"%s\"]",thorName);
-                IPropertyTree *thorCluster = conn->queryRoot()->queryPropTree(query.str());
+                IPropertyTree *thorCluster = root->queryPropTree(query.str());
                 if (thorCluster)
                 if (thorCluster)
                 {
                 {
                     const char *groupName = thorCluster->queryProp("@nodeGroup");
                     const char *groupName = thorCluster->queryProp("@nodeGroup");
@@ -4806,17 +4834,20 @@ unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &gro
 
 
 unsigned getEnvironmentHThorClusterNames(StringArray &eclAgentNames, StringArray &groupNames, StringArray &targetNames)
 unsigned getEnvironmentHThorClusterNames(StringArray &eclAgentNames, StringArray &groupNames, StringArray &targetNames)
 {
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
         return 0;
-    Owned<IPropertyTreeIterator> allEclAgents = conn->queryRoot()->getElements("Software/EclAgentProcess");
+
+    Owned<IPropertyTree> root = &env->getPTree();
+    Owned<IPropertyTreeIterator> allEclAgents = root->getElements("Software/EclAgentProcess");
     ForEach(*allEclAgents)
     ForEach(*allEclAgents)
     {
     {
         IPropertyTree &eclAgent = allEclAgents->query();
         IPropertyTree &eclAgent = allEclAgents->query();
         const char *eclAgentName = eclAgent.queryProp("@name");
         const char *eclAgentName = eclAgent.queryProp("@name");
         if (eclAgentName && *eclAgentName)
         if (eclAgentName && *eclAgentName)
         {
         {
-            Owned<IPropertyTreeIterator> allTargets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+            Owned<IPropertyTreeIterator> allTargets = root->getElements("Software/Topology/Cluster");
             ForEach(*allTargets)
             ForEach(*allTargets)
             {
             {
                 IPropertyTree &target = allTargets->query();
                 IPropertyTree &target = allTargets->query();

+ 1 - 0
dali/base/dadfs.cpp

@@ -9033,6 +9033,7 @@ class CInitGroups
 
 
     bool loadMachineMap()
     bool loadMachineMap()
     {
     {
+        //GH->JCS This can't be changed to use getEnvironmentFactory() unless that moved inside dalibase;
         Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Hardware", myProcessSession(), RTM_LOCK_READ, SDS_CONNECT_TIMEOUT);
         Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Hardware", myProcessSession(), RTM_LOCK_READ, SDS_CONNECT_TIMEOUT);
         if (!conn) {
         if (!conn) {
             WARNLOG("Cannot connect to /Environment/Hardware");
             WARNLOG("Cannot connect to /Environment/Hardware");

+ 140 - 148
dali/base/dautils.cpp

@@ -115,6 +115,7 @@ public:
                 s = lfn.str();
                 s = lfn.str();
             }
             }
             CDfsLogicalFileName lfn;
             CDfsLogicalFileName lfn;
+            lfn.setAllowWild(true);
             lfn.set(s);
             lfn.set(s);
             dlfns.push_back(lfn);
             dlfns.push_back(lfn);
             if (expanded && (strchr(s,'*') || strchr(s,'?')))
             if (expanded && (strchr(s,'*') || strchr(s,'?')))
@@ -229,6 +230,7 @@ public:
 CDfsLogicalFileName::CDfsLogicalFileName()
 CDfsLogicalFileName::CDfsLogicalFileName()
 {
 {
     allowospath = false;
     allowospath = false;
+    allowWild = false;
     multi = NULL;
     multi = NULL;
     clear();
     clear();
 }
 }
@@ -311,7 +313,7 @@ void CDfsLogicalFileName::expand(IUserDescriptor *user)
                     full.append(',');
                     full.append(',');
                 const CDfsLogicalFileName &item = multi->item(i1);
                 const CDfsLogicalFileName &item = multi->item(i1);
                 StringAttr norm;
                 StringAttr norm;
-                normalizeName(item.get(), norm);
+                normalizeName(item.get(), norm, false);
                 full.append(norm);
                 full.append(norm);
                 if (item.isExternal())
                 if (item.isExternal())
                     external = external || item.isExternal();
                     external = external || item.isExternal();
@@ -330,46 +332,81 @@ void CDfsLogicalFileName::expand(IUserDescriptor *user)
     }
     }
 }
 }
 
 
-void CDfsLogicalFileName::normalizeName(const char * name, StringAttr &res)
+inline void normalizeScope(const char *name, const char *scope, unsigned len, StringBuffer &res, bool strict)
 {
 {
+    bool scopeStarted=false;
+    bool scopeEnded=false;
+    const char *s2=scope;
+    while (len--)
+    {
+        if (isspace(*s2))
+        {
+            if (strict)
+               throw MakeStringException(-1, "Scope contains spaces in file name '%s'", name);
+            if (scopeStarted) // ignore leading spaces if !strict
+                scopeEnded = true;
+        }
+        else
+        {
+            if (scopeEnded)
+               throw MakeStringException(-1, "Scope contains spaces in file name '%s'", name);
+            scopeStarted = true;
+            res.append(*s2);
+        }
+        ++s2;
+    }
+}
+
+void CDfsLogicalFileName::normalizeName(const char *name, StringAttr &res, bool strict)
+{
+    // NB: If !strict(default) allows spaces to exist either side of scopes (no idea why would want to permit that, but preserving for bwrd compat.)
     StringBuffer str;
     StringBuffer str;
     StringBuffer nametmp;
     StringBuffer nametmp;
-    const char *s = name;
-    const char *ct = NULL;
+    const char *ct = NULL;    
     bool wilddetected = false;
     bool wilddetected = false;
-    while (*s) {
-        switch (*s) {
-        case '@': ct = s; break;
-        case ':': ct = NULL; break;
-        case '?':
-        case '*': wilddetected = true; break;
-        case '~':
-            if (s==name) { // leading ~ not allowed
-                name++;
-                skipSp(name);
-                s = name;
-                continue;
-            }
-            break;
-        }
-        s++;
+    if ('~' == *name) // allowed 1 leading ~
+    {
+        name++;
+        if (!strict)
+            skipSp(name);
     }
     }
-    if (wilddetected)
+    const char *s = name;
+    char c = *s;
+    while (c)
     {
     {
-        res.set(name);
-        return;
+        switch (c)
+        {
+            case '@': ct = s; break;
+            case ':': ct = NULL; break;
+            case '?':
+            case '*': wilddetected = true; break;
+            case '~':
+                throw MakeStringException(-1, "Unexpected character '%c' in logical name '%s' detected", *s, name);
+            case '>':
+            {
+                c = '\0'; // will cause break out of loop
+                continue; // can't validate query syntax
+            }
+            default:
+            {
+                if (!validFNameChar(c))
+                    throw MakeStringException(-1, "Unexpected character '%c' in logical name '%s' detected", *s, name);
+            }
+        }
+        c = *s++;
     }
     }
-
     bool isext = memicmp(name,EXTERNAL_SCOPE "::",sizeof(EXTERNAL_SCOPE "::")-1)==0;
     bool isext = memicmp(name,EXTERNAL_SCOPE "::",sizeof(EXTERNAL_SCOPE "::")-1)==0;
-    if (!isext&&wilddetected)
-        throw MakeStringException(-1,"Wildcards not allowed in filename (%s)",name);
+    if (!isext && !allowWild && wilddetected)
+        throw MakeStringException(-1, "Wildcards not allowed in filename (%s)", name);
     if (!isext&&ct&&(ct-name>=1)) // trailing @
     if (!isext&&ct&&(ct-name>=1)) // trailing @
     {
     {
-        if ((ct[1]=='@')||(ct[1]=='^')) { // escape
+        if ((ct[1]=='@')||(ct[1]=='^')) // escape
+        {
             nametmp.append(ct-name,name).append(ct+1);
             nametmp.append(ct-name,name).append(ct+1);
             name = nametmp.str();
             name = nametmp.str();
         }
         }
-        else {
+        else
+        {
             nametmp.append(ct+1);
             nametmp.append(ct+1);
             nametmp.trim().toLowerCase();
             nametmp.trim().toLowerCase();
             if (nametmp.length())
             if (nametmp.length())
@@ -381,95 +418,108 @@ void CDfsLogicalFileName::normalizeName(const char * name, StringAttr &res)
     if (!*name)
     if (!*name)
         name = ".::_blank_";
         name = ".::_blank_";
     s=strstr(name,"::");
     s=strstr(name,"::");
-    if (s) {
-        if (s==name)
+    if (s)
+    {
+        if (s==name) // JCS: meaning name leads with "::", would have thought should be treated as invalid
             str.append('.');
             str.append('.');
-        else {
-            str.append(s-name,name).clip();
-            if (isext) {    // normalize node
+        else
+        {
+            normalizeScope(name, name, s-name, str, strict);
+            bool isForeign = 0 == stricmp(str.str(),FOREIGN_SCOPE);
+            if (isext || isForeign) // normalize node
+            {
                 const char *s1 = s+2;
                 const char *s1 = s+2;
                 const char *ns1 = strstr(s1,"::");
                 const char *ns1 = strstr(s1,"::");
-                if (ns1) {                                          // TBD accept groupname here
-                    skipSp(s1);
+                if (ns1) // TBD accept groupname here (in the case of isext)
+                {
+                    if (!strict)
+                        skipSp(s1);
                     StringBuffer nodename;
                     StringBuffer nodename;
-                    nodename.append(ns1-s1,s1).clip();
+                    nodename.append(ns1-s1,s1);
+                    if (!strict)
+                        nodename.clip();
                     SocketEndpoint ep(nodename.str());
                     SocketEndpoint ep(nodename.str());
-                    if (!ep.isNull()) {
+                    if (!ep.isNull())
+                    {
                         ep.getUrlStr(str.append("::"));
                         ep.getUrlStr(str.append("::"));
                         s = ns1;
                         s = ns1;
-                        external = true;
-                        if (s[2]=='>') {
-                            str.append("::");
-                            tailpos = str.length();
-                            str.append(s+2);
-                            res.set(str);
-                            return;
+                        if (isext)
+                        {
+                            external = true;
+                            if (s[2]=='>')
+                            {
+                                str.append("::");
+                                tailpos = str.length();
+                                str.append(s+2);
+                                res.set(str);
+                                return;
+                            }
+                        }
+                        else
+                        {
+                            dbgassertex(isForeign);
+                            localpos = str.length()+2;
                         }
                         }
-
-                    }
-                }
-            }
-            else if (stricmp(str.str(),FOREIGN_SCOPE)==0) { // normalize node
-                const char *s1 = s+2;
-                const char *ns1 = strstr(s1,"::");
-                if (ns1) {
-                    skipSp(s1);
-                    StringBuffer nodename;
-                    nodename.append(ns1-s1,s1).clip();
-                    SocketEndpoint ep(nodename.str());
-                    if (!ep.isNull()) {
-                        ep.getUrlStr(str.append("::"));
-                        s = ns1;
-                        localpos = str.length()+2;
                     }
                     }
                 }
                 }
             }
             }
         }
         }
-        loop {
+        loop
+        {
             s+=2;
             s+=2;
             const char *ns = strstr(s,"::");
             const char *ns = strstr(s,"::");
             if (!ns)
             if (!ns)
                 break;
                 break;
-            skipSp(s);
-            str.append("::").append(ns-s,s).clip();
+            str.append("::");
+            normalizeScope(name, s, ns-s, str, strict);
             s = ns;
             s = ns;
         }
         }
     }
     }
-    else {
+    else
+    {
         s = name;
         s = name;
         str.append(".");
         str.append(".");
     }
     }
     str.append("::");
     str.append("::");
     tailpos = str.length();
     tailpos = str.length();
-    if (strstr(s,"::")!=NULL) {
+    if (strstr(s,"::")!=NULL)
         ERRLOG("Tail contains '::'!");
         ERRLOG("Tail contains '::'!");
-    }
-    skipSp(s);
-    str.append(s).clip().toLowerCase();
+    normalizeScope(name, s, strlen(name)-(s-name), str, strict);
+    str.toLowerCase();
     res.set(str);
     res.set(str);
 }
 }
 
 
 
 
-void CDfsLogicalFileName::set(const char *name)
+void CDfsLogicalFileName::set(const char *name, bool removeForeign)
 {
 {
     clear();
     clear();
-    StringBuffer str;
     if (!name)
     if (!name)
         return;
         return;
     skipSp(name);
     skipSp(name);
-    try {
+    if (allowospath&&(isAbsolutePath(name)||(stdIoHandle(name)>=0)||(strstr(name,"::")==NULL)))
+    {
+        RemoteFilename rfn;
+        rfn.setRemotePath(name);
+        setExternal(rfn);
+        return;
+    }
+    try
+    {
         multi = CMultiDLFN::create(name);
         multi = CMultiDLFN::create(name);
     }
     }
-    catch (IException *e) {
+    catch (IException *e)
+    {
         StringBuffer err;
         StringBuffer err;
         e->errorMessage(err);
         e->errorMessage(err);
         WARNLOG("CDfsLogicalFileName::set %s",err.str());
         WARNLOG("CDfsLogicalFileName::set %s",err.str());
         e->Release();
         e->Release();
     }
     }
-    if (multi) {
+    if (multi)
+    {
         StringBuffer full;
         StringBuffer full;
         full.append('{');
         full.append('{');
-        ForEachItemIn(i1,*multi) {
+        ForEachItemIn(i1,*multi)
+        {
             if (i1)
             if (i1)
                 full.append(',');
                 full.append(',');
             const CDfsLogicalFileName &item = multi->item(i1);
             const CDfsLogicalFileName &item = multi->item(i1);
@@ -481,86 +531,27 @@ void CDfsLogicalFileName::set(const char *name)
         lfn.set(full);
         lfn.set(full);
         return;
         return;
     }
     }
-    if (allowospath&&(isAbsolutePath(name)||(stdIoHandle(name)>=0)||(strstr(name,"::")==NULL))) {
-        RemoteFilename rfn;
-        rfn.setRemotePath(name);
-        setExternal(rfn);
-        return;
+    normalizeName(name, lfn, false);
+    if (removeForeign)
+    {
+        const char *_lfn = get(true);
+        lfn.clear();
+        lfn.set(_lfn);
     }
     }
-    normalizeName(name, lfn);
 }
 }
-bool CDfsLogicalFileName::setValidate(const char *lfn,bool removeforeign)
+
+bool CDfsLogicalFileName::setValidate(const char *lfn, bool removeForeign)
 {
 {
-    // NB will allows multi
-    const char *s = lfn;
-    if (!s)
-        return false;
-    skipSp(s);
-    if (*s=='~') {  // allowed 1 leading ~
-        s++;
-        skipSp(s);
-    }
-    if (*s=='~')
-        return false;
-    if (allowospath&&(isAbsolutePath(s)||(stdIoHandle(s)>=0)||(strstr(lfn,"::")==NULL))) {
-        set(lfn);
+    try
+    {
+        set(lfn, removeForeign);
         return true;
         return true;
     }
     }
-
-    const char *ns = skipScope(s,FOREIGN_SCOPE);
-    if (ns) {
-        while (*ns&&((*ns!=':')||(ns[1]!=':'))) // remove IP
-            ns++;
-        if (*ns) {
-            s = ns+2;
-            if (removeforeign) {
-                lfn = s;
-                skipSp(s);
-            }
-        }
-    }
-    const char *es = ns?NULL:skipScope(s,EXTERNAL_SCOPE);
-    if (es) { 
-        while (*es&&((*es!=':')||(es[1]!=':'))) // remove IP
-            es++;
-        if (*es) {
-            if (es[2]=='>') { // query
-                set(lfn);
-                return true;
-            }
-            s = es+2;
-        }
-    }
-    unsigned sc=0;
-    int inmulti = 0;
-    loop {
-        while(*s!=':') {
-            if (!*s) {
-                if (sc==0)
-                    return false;
-                set(lfn);
-                return true;
-            }
-            if (!validFNameChar(*s)) {
-                if (!inmulti||((*s!='?')&&(*s!='*')))
-                    return false;
-            }
-            if (*s=='{')
-                inmulti++;
-            else if (inmulti&&(*s=='}'))
-                inmulti--;
-            if (*s!=' ')
-                sc++;
-            s++;
-        }
-        if (sc==0)
-            break;
-        if (s[1]!=':')
-            break;
-        s += 2;
-        sc = 0;
+    catch (IException *e)
+    {
+        e->Release();
+        return false;
     }
     }
-    return false;
 }
 }
 
 
 
 
@@ -3087,3 +3078,4 @@ bool traceAllTransactions(bool on)
     transactionLoggingOn = on;
     transactionLoggingOn = on;
     return ret;
     return ret;
 }
 }
+

+ 5 - 3
dali/base/dautils.hpp

@@ -59,15 +59,16 @@ class da_decl CDfsLogicalFileName
     CMultiDLFN *multi;   // for temp superfile
     CMultiDLFN *multi;   // for temp superfile
     bool external;
     bool external;
     bool allowospath;
     bool allowospath;
+    bool allowWild;
 
 
 public:
 public:
     CDfsLogicalFileName();
     CDfsLogicalFileName();
     ~CDfsLogicalFileName();
     ~CDfsLogicalFileName();
 
 
     CDfsLogicalFileName & operator = (CDfsLogicalFileName const &from);
     CDfsLogicalFileName & operator = (CDfsLogicalFileName const &from);
-    void set(const char *lfn);
+    void set(const char *lfn, bool removeForeign=false); // throws an exception on invalid filenames
+    bool setValidate(const char *lfn, bool removeForeign=false); // returns false for invalid filenames
     void set(const CDfsLogicalFileName &lfn);
     void set(const CDfsLogicalFileName &lfn);
-    bool setValidate(const char *lfn,bool removeforeign=false); // checks for invalid chars
     void set(const char *scopes,const char *tail);
     void set(const char *scopes,const char *tail);
     bool setFromMask(const char *partmask,const char *rootdir=NULL);
     bool setFromMask(const char *partmask,const char *rootdir=NULL);
     void clear();
     void clear();
@@ -134,9 +135,10 @@ public:
     const void resolveWild();  // only for multi
     const void resolveWild();  // only for multi
     IPropertyTree *createSuperTree() const;
     IPropertyTree *createSuperTree() const;
     void allowOsPath(bool allow=true) { allowospath = allow; } // allow local OS path to be specified
     void allowOsPath(bool allow=true) { allowospath = allow; } // allow local OS path to be specified
+    void setAllowWild(bool b=true) { allowWild = b; } // allow wildcards
     bool isExpanded() const;
     bool isExpanded() const;
     void expand(IUserDescriptor *user);
     void expand(IUserDescriptor *user);
-    void normalizeName(const char * name, StringAttr &res);
+    void normalizeName(const char * name, StringAttr &res, bool strict);
 };
 };
 
 
 // abstract class, define getCmdText to return tracing text of commands
 // abstract class, define getCmdText to return tracing text of commands

+ 0 - 17
dali/dafilesrv/dafscontrol.cpp

@@ -85,23 +85,6 @@ bool getCluster(const char *clustername,SocketEndpointArray &eps)
     return eps.ordinality()!=0;
     return eps.ordinality()!=0;
 }
 }
 
 
-bool getAllClusters(SocketEndpointArray &eps)
-{
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Software", myProcessSession(), RTM_LOCK_READ, SDS_CONNECT_TIMEOUT);
-    if (!conn) 
-        return false;
-    IPropertyTree* root = conn->queryRoot();
-    Owned<IPropertyTreeIterator> clusters= root->getElements("ThorCluster");
-    if (clusters->first()) {
-        do {
-            IPropertyTree &cluster = clusters->query();
-            if (!getCluster(cluster.queryProp("@name"),eps))
-                ERRLOG("Cluster %s not found",cluster.queryProp("@name"));
-        } while (clusters->next());
-    }
-    return eps.ordinality()!=0;
-}
-
 unsigned applyNodes(const char *grpip, ApplyMode mode, unsigned ver, bool isdali, bool quiet)
 unsigned applyNodes(const char *grpip, ApplyMode mode, unsigned ver, bool isdali, bool quiet)
 {
 {
     SocketEndpointArray eps;
     SocketEndpointArray eps;

+ 5 - 3
dali/dfuplus/main.cpp

@@ -34,9 +34,10 @@ void handleSyntax()
     StringBuffer out;
     StringBuffer out;
 
 
     out.append("Usage:\n");
     out.append("Usage:\n");
-    out.append("    dfuplus action=[spray|replicate|despray|copy|remove|rename|list|\n");
+    out.append("    dfuplus [-v|--version] | action=[spray|replicate|despray|copy|remove|rename|list|\n");
     out.append("                    addsuper|removesuper|listsuper|copysuper|dafilesrv|\n");
     out.append("                    addsuper|removesuper|listsuper|copysuper|dafilesrv|\n");
-    out.append("                    savexml|add|status|abort|resubmit|monitor] {<options>}\n");
+    out.append("                    savexml|add|status|abort|resubmit|monitor] {<options>}\n\n");
+    out.append("        -v | --version -- display version info\n\n");
     out.append("    general options:\n");
     out.append("    general options:\n");
     out.append("        server=<esp-server-url> \n");
     out.append("        server=<esp-server-url> \n");
     out.append("        username=<user-name>\n");
     out.append("        username=<user-name>\n");
@@ -265,7 +266,8 @@ int main(int argc, const char* argv[])
 {
 {
     InitModuleObjects();
     InitModuleObjects();
 
 
-    if ((argc >= 2) && ((stricmp(argv[1], "/version") == 0) || (stricmp(argv[1], "-version") == 0))) 
+    if ((argc >= 2) && ((stricmp(argv[1], "/version") == 0) || (stricmp(argv[1], "-v") == 0)
+        || (stricmp(argv[1], "--version") == 0)))
     {
     {
         printVersion();
         printVersion();
         return 0;
         return 0;

+ 1 - 0
docs/CMakeLists.txt

@@ -56,6 +56,7 @@ add_subdirectory(HPCCCertify)
 add_subdirectory(HPCCDataHandling)
 add_subdirectory(HPCCDataHandling)
 add_subdirectory(HPCCDataTutorial)
 add_subdirectory(HPCCDataTutorial)
 add_subdirectory(HPCCMonitoring)
 add_subdirectory(HPCCMonitoring)
+add_subdirectory(HPCCSystemAdmin)
 add_subdirectory(IMDB)
 add_subdirectory(IMDB)
 add_subdirectory(InstantCloud)
 add_subdirectory(InstantCloud)
 add_subdirectory(Installing_and_RunningTheHPCCPlatform)
 add_subdirectory(Installing_and_RunningTheHPCCPlatform)

+ 10 - 1
docs/ECLLanguageReference/ECLR_mods/BltInFunc-BUILD.xml

@@ -158,7 +158,9 @@
       </indexterm>( </emphasis><emphasis>basedataset</emphasis><emphasis
       </indexterm>( </emphasis><emphasis>basedataset</emphasis><emphasis
     role="bold"> )] [, OVERWRITE<indexterm>
     role="bold"> )] [, OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
         <primary>OVERWRITE</primary>
-      </indexterm>]</emphasis><emphasis role="bold"> <emphasis
+      </indexterm>]</emphasis><emphasis role="bold"> [, UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]<emphasis
     role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     role="bold">EXPIRE<indexterm>
     role="bold">EXPIRE<indexterm>
         <primary>EXPIRE</primary>
         <primary>EXPIRE</primary>
@@ -278,6 +280,13 @@
             </row>
             </row>
 
 
             <row>
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
 
               <entry>Optional. Specifies the file is a temporary file that may
               <entry>Optional. Specifies the file is a temporary file that may

+ 34 - 5
docs/ECLLanguageReference/ECLR_mods/BltInFunc-OUTPUT.xml

@@ -312,7 +312,9 @@
       </indexterm>] [</emphasis><emphasis>,</emphasis><emphasis
       </indexterm>] [</emphasis><emphasis>,</emphasis><emphasis
     role="bold">OVERWRITE<indexterm>
     role="bold">OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
         <primary>OVERWRITE</primary>
-      </indexterm>]</emphasis><emphasis role="bold">
+      </indexterm>]<emphasis role="bold">[, UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis></emphasis><emphasis role="bold">
     [</emphasis><emphasis>,</emphasis><emphasis role="bold">EXPIRE<indexterm>
     [</emphasis><emphasis>,</emphasis><emphasis role="bold">EXPIRE<indexterm>
         <primary>EXPIRE</primary>
         <primary>EXPIRE</primary>
       </indexterm>( [</emphasis><emphasis> days </emphasis><emphasis
       </indexterm>( [</emphasis><emphasis> days </emphasis><emphasis
@@ -378,6 +380,13 @@
             </row>
             </row>
 
 
             <row>
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
 
               <entry>Optional. Specifies the file is a temporary file that may
               <entry>Optional. Specifies the file is a temporary file that may
@@ -459,8 +468,11 @@ OUTPUT(People(Attr1=FALSE));
     <para><emphasis role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     <para><emphasis role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     role="bold"> OVERWRITE<indexterm>
     role="bold"> OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
         <primary>OVERWRITE</primary>
-      </indexterm> ]</emphasis><emphasis role="bold">
-    [</emphasis><emphasis>,</emphasis><emphasis role="bold"> EXPIRE<indexterm>
+      </indexterm> ]</emphasis><emphasis role="bold"><emphasis role="bold">[,
+    UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis> [</emphasis><emphasis>,</emphasis><emphasis
+    role="bold"> EXPIRE<indexterm>
         <primary>EXPIRE</primary>
         <primary>EXPIRE</primary>
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
     role="bold">] ) ] )</emphasis></para>
     role="bold">] ) ] )</emphasis></para>
@@ -518,6 +530,13 @@ OUTPUT(People(Attr1=FALSE));
             </row>
             </row>
 
 
             <row>
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
 
               <entry>Optional. Specifies the file is a temporary file that may
               <entry>Optional. Specifies the file is a temporary file that may
@@ -704,8 +723,11 @@ OUTPUT(XMLds,,'~thor::outdata.xml',CSV(HEADING('&lt;XML&gt;','&lt;/XML&gt;')));
     role="bold">) ] [</emphasis><emphasis>,</emphasis><emphasis role="bold">
     role="bold">) ] [</emphasis><emphasis>,</emphasis><emphasis role="bold">
     OVERWRITE<indexterm>
     OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
         <primary>OVERWRITE</primary>
-      </indexterm> ]</emphasis><emphasis role="bold">
-    [</emphasis><emphasis>,</emphasis><emphasis role="bold"> EXPIRE<indexterm>
+      </indexterm> ]</emphasis><emphasis role="bold"><emphasis role="bold">[,
+    UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis> [</emphasis><emphasis>,</emphasis><emphasis
+    role="bold"> EXPIRE<indexterm>
         <primary>EXPIRE</primary>
         <primary>EXPIRE</primary>
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
     role="bold">] ) ] )</emphasis></para>
     role="bold">] ) ] )</emphasis></para>
@@ -763,6 +785,13 @@ OUTPUT(XMLds,,'~thor::outdata.xml',CSV(HEADING('&lt;XML&gt;','&lt;/XML&gt;')));
             </row>
             </row>
 
 
             <row>
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
 
               <entry>Optional. Specifies the file is a temporary file that may
               <entry>Optional. Specifies the file is a temporary file that may

+ 46 - 0
docs/ECLLanguageReference/ECLR_mods/BltInFunc-SOAPCALL.xml

@@ -248,6 +248,16 @@
           </row>
           </row>
 
 
           <row>
           <row>
+            <entry><emphasis role="bold">RESPONSE
+            </emphasis>(<emphasis>NOTRIM</emphasis>) <indexterm>
+                <primary>NOTRIM</primary>
+              </indexterm></entry>
+
+            <entry>Sets flag to prevent space stripping on the
+            response.</entry>
+          </row>
+
+          <row>
             <entry><emphasis role="bold">NAMESPACE<indexterm>
             <entry><emphasis role="bold">NAMESPACE<indexterm>
                 <primary>NAMESPACE</primary>
                 <primary>NAMESPACE</primary>
               </indexterm> </emphasis>(<emphasis>namespace</emphasis>)</entry>
               </indexterm> </emphasis>(<emphasis>namespace</emphasis>)</entry>
@@ -275,6 +285,42 @@
             containing a URN or URL that is required by the web
             containing a URN or URL that is required by the web
             <emphasis>service</emphasis> for proper interoperability.</entry>
             <emphasis>service</emphasis> for proper interoperability.</entry>
           </row>
           </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG<indexterm>
+                <primary>LOG</primary>
+              </indexterm></emphasis></entry>
+
+            <entry>If specified, writes details to the log file of the engine
+            (hThor, Thor, or Roxie) to which the SOAPCALL is
+            submitted.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG
+            </emphasis>(<emphasis>MIN</emphasis>)</entry>
+
+            <entry>Specifies to write minimal details of the SOAPCALL to a log
+            file.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG
+            </emphasis>(<emphasis>expression</emphasis>)</entry>
+
+            <entry>Specifies to add the expression to the log when performing
+            a SOAPCALL.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">ENCODING</emphasis><indexterm>
+                <primary>ENCODING</primary>
+              </indexterm></entry>
+
+            <entry>Specifies that the Web service being called requires a
+            different message format, where type information is embedded in
+            the XML.</entry>
+          </row>
         </tbody>
         </tbody>
       </tgroup>
       </tgroup>
     </informaltable></para>
     </informaltable></para>

+ 9 - 2
docs/ECLLanguageReference/ECLR_mods/ResrvdKywds-IMPORT.xml

@@ -33,7 +33,8 @@
 
 
           <entry>A comma-delimited list of folder or file names in the
           <entry>A comma-delimited list of folder or file names in the
           repository. The dollar sign ($) makes all definitions in the current
           repository. The dollar sign ($) makes all definitions in the current
-          folder available.</entry>
+          folder available. The caret symbol (^) can be used as shorthand for
+          the container of the current folder.</entry>
         </row>
         </row>
 
 
         <row>
         <row>
@@ -103,11 +104,17 @@ IMPORT $, Std;                          //makes the standard library functions a
 
 
 IMPORT MyModule;                        //makes available the definitions from MyModule folder
 IMPORT MyModule;                        //makes available the definitions from MyModule folder
 
 
+IMPORT $.^.MyOtherModule                //makes available the definitions from MyOtherModule folder,
+                                        //which is located in the same container as the current folder
+
+IMPORT $.^.^.SomeOtherModule            //makes available the definitions from SomeOtherModule folder,
+                                        //which is located in the grandparent folder of current folder
+
 IMPORT SomeFolder.SomeFile;             //make the specific file available
 IMPORT SomeFolder.SomeFile;             //make the specific file available
 
 
 IMPORT SomeReallyLongFolderName AS SN;  //alias the long name as "SN"
 IMPORT SomeReallyLongFolderName AS SN;  //alias the long name as "SN"
 
 
-IMPORT Def1,Def2 FROM Fred;             //makes Def1 and Def2 from Fred available, unqualified
+IMPORT Def1,Def2 FROM Fred;             //makes Def1 and Def2 from Fred folder available, unqualified
 
 
 IMPORT * FROM Fred;                     //makes everything from Fred available, unqualified
 IMPORT * FROM Fred;                     //makes everything from Fred available, unqualified
 
 

+ 49 - 0
docs/ECLLanguageReference/ECLR_mods/Templ-OPTION.xml

@@ -412,6 +412,55 @@
               programmer as suggestions for the use of the INDEPENDENT
               programmer as suggestions for the use of the INDEPENDENT
               Workflow Service.</entry>
               Workflow Service.</entry>
             </row>
             </row>
+
+            <row>
+              <entry><emphasis>defaultSkewError</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>A value between 0.0 and 1.0 that determines the amount of
+              skew needed to generate a skew error. This value is ignored if
+              the ECL has provided a SKEW attribute.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>defaultSkewWarning</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>A value between 0.0 and 1.0 that determines the amount of
+              skew needed to generate a skew warning. If set higher than
+              defaultSkewError, then the value is ignored.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>overrideSkewError</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>If set to a value between 0.0 and 1.0, it overrides any
+              ECL SKEW(nn) attribute values in the current job.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>defaultSkewThreshold</emphasis></entry>
+
+              <entry>Default: 1GB</entry>
+
+              <entry>The size of the dataset (in bytes) local to a single node
+              needed before Skew errors/warnings are generated if no
+              THRESHOLD(nn) was supplied in ECL.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>overrideSkewThreshold</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>The size of the dataset (in bytes) local to a single node
+              needed before Skew errors/warnings are generated. Overrides any
+              ECL THRESHOLD(nn) attribute values in the current job.</entry>
+            </row>
           </tbody>
           </tbody>
         </tgroup>
         </tgroup>
       </informaltable></para>
       </informaltable></para>

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

@@ -106,7 +106,7 @@
           <entry><emphasis>srcCSVquote</emphasis></entry>
           <entry><emphasis>srcCSVquote</emphasis></entry>
 
 
           <entry>Optional. A null-terminated string containing the CSV quoted
           <entry>Optional. A null-terminated string containing the CSV quoted
-          field delimiter. If omitted, the default is '\''</entry>
+          field delimiter. If omitted, the default is '\"'</entry>
         </row>
         </row>
 
 
         <row>
         <row>

+ 10 - 7
docs/HPCCCertify/Cert-Mods/CertPreflight.xml

@@ -8,7 +8,7 @@
   configured properly is to run a preflight check on the components. This
   configured properly is to run a preflight check on the components. This
   ensures that all machines are operating and have the proper executables
   ensures that all machines are operating and have the proper executables
   running. This also confirms there is adequate disk space, available memory,
   running. This also confirms there is adequate disk space, available memory,
-  and acceptable available CPU % values.</para>
+  and acceptable available CPU % values. </para>
 
 
   <itemizedlist mark="bullet">
   <itemizedlist mark="bullet">
     <listitem>
     <listitem>
@@ -50,8 +50,9 @@
       <listitem>
       <listitem>
         <?dbfo keep-together="always"?>
         <?dbfo keep-together="always"?>
 
 
-        <para>Click on the <emphasis role="bold">System Servers</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">System Servers</emphasis>
+        link. </para>
 
 
         <para><figure>
         <para><figure>
             <title>System Servers link</title>
             <title>System Servers link</title>
@@ -143,8 +144,9 @@
 
 
     <orderedlist>
     <orderedlist>
       <listitem>
       <listitem>
-        <para>Click on the <emphasis role="bold">Cluster Processes</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">Cluster Processes</emphasis>
+        link.</para>
 
 
         <para><figure>
         <para><figure>
             <title>Cluster Processes Link</title>
             <title>Cluster Processes Link</title>
@@ -258,8 +260,9 @@
 
 
     <orderedlist>
     <orderedlist>
       <listitem>
       <listitem>
-        <para>Click on the <emphasis role="bold">Cluster Processes</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">Cluster Processes</emphasis>
+        link.</para>
 
 
         <para><figure>
         <para><figure>
             <title>Cluster Processes Link</title>
             <title>Cluster Processes Link</title>

+ 18 - 0
docs/HPCCSystemAdmin/CMakeLists.txt

@@ -0,0 +1,18 @@
+################################################################################
+#    HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+################################################################################
+
+DOCBOOK_TO_PDF( ${FO_XSL} HPCCSystemAdministratorsGuide.xml "HPCCSystemAdministratorsGuide" "SA-Mods")
+

文件差异内容过多而无法显示
+ 1465 - 0
docs/HPCCSystemAdmin/HPCCSystemAdministratorsGuide.xml


+ 373 - 0
docs/HPCCSystemAdmin/SA-Mods/SysAdminConfigMod.xml

@@ -0,0 +1,373 @@
+<?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">
+<book xml:base="../">
+  
+  <chapter id="Usin-HPCC-ConfigMgr">
+    <title>Using Configuration Manager</title>
+
+    <para id="cfgmgr_introP0">Configuration Manager is the utility with which
+    we configure the HPCC platform. The HPCC platform's configuration is
+    stored in an XML file named <emphasis
+    role="bold">environment.xml</emphasis>. Once you generate an environment
+    (xml) file, it gets saved into a source directory (default is <emphasis
+    role="bold">/etc/HPCCSystems/source</emphasis>). You then need to stop the
+    system to copy it into the active HPCC directory, then distribute it into
+    place on to each node and restart the HPCC system. At no time during
+    configuration do you work on the live environment file.</para>
+
+    <para id="cfgmgr_introP1">When you install the HPCC system package, a
+    default single-node environment.xml file is generated. After that, you can
+    use the Configuration Manager to modify it and/or create a different
+    environment file to configure components, or add nodes. There is a
+    Configuration Manager wizard to help create an environment file. Give any
+    environment file you create a descriptive name that would indicate what it
+    is for in the source. For example, you might create an environment without
+    a Roxie, you could call that file
+    <emphasis>environmentNoRoxie.xml</emphasis>.</para>
+
+    <para id="cfgmgr_p1b">You would then copy the new configuration file you
+    generate from the source directory to the <emphasis
+    role="bold">/etc/HPCCSystems</emphasis> directory. Rename the file to
+    environment.xml, and restart the system in order to reconfigure your
+    system.</para>
+
+    <para id="cfgmgr_introP2">Configuration Manager also offers an <emphasis
+    role="bold">Advanced View</emphasis> which allows more granularity for you
+    to add instances of components or change the default settings of
+    components for more advanced users. Even if you plan to use the Advanced
+    View, it is a good idea to start with a wizard generated configuration
+    file and use Advanced View to edit it.</para>
+
+    <para id="cfgmgr_introP3">More information and specific details for each
+    Configuration Manager component and attributes of those components is
+    detailed in <emphasis>Using Configuration Manager</emphasis>.</para>
+
+    <para>The following sections will provide the details for configuring an
+    HPCC environment using the Configuration Manager.</para>
+
+    <sect1 id="configuring-a-multi-node-system">
+      <title>Running the Configuration Manager</title>
+
+      <para>This section will guide you through configuring an HPCC
+      environment using the Configuration Manager.</para>
+
+      <para>The HPCC package should already be installed on ALL nodes.</para>
+
+      <para>You can use any tool or shell script you choose.</para>
+
+      <orderedlist>
+        <listitem>
+          <para>SSH to a node in your environment and login as a user with
+          sudo privileges. We would suggest that it would be the first node,
+          and that it is a support node, however that is up to your
+          discretion.</para>
+        </listitem>
+
+        <listitem>
+          <para>Start the Configuration Manager service on the node (again we
+          would suggest that it should be on a support node, and further that
+          you use the same node to start the Configuration Manager every time,
+          but this is also entirely up to you).</para>
+
+          <programlisting>sudo /opt/HPCCSystems/sbin/configmgr</programlisting>
+
+          <para><graphic
+          fileref="../../images/gs_img_configmgrStart.jpg" /></para>
+        </listitem>
+
+        <listitem>
+          <para>Using a Web browser, go to the Configuration Manager's
+          interface:</para>
+
+          <programlisting>http://&lt;<emphasis>ip of installed system</emphasis>&gt;:8015</programlisting>
+
+          <para>The Configuration Manager startup wizard displays.</para>
+        </listitem>
+      </orderedlist>
+
+      <para>There are different ways to configure your HPCC system. You can
+      use the <emphasis role="bold">Generate environment wizard</emphasis> and
+      use that environment or experienced users can then use the <emphasis
+      role="bold">Advanced View</emphasis> for more specific customization.
+      There is also the option of using <emphasis role="bold">Create blank
+      environment</emphasis> to generate an empty environment that you could
+      then go in and add only the components you would want.</para>
+
+      <sect2 id="Env_Wizard">
+        <title>Environment Wizard</title>
+
+        <orderedlist>
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>To use the wizard select the <emphasis role="bold">Generate
+            new environment using wizard</emphasis> button.</para>
+
+            <para><graphic fileref="../../images/GS_ConfigMgrWizStart.jpg"
+            vendor="configmgrSS" /></para>
+          </listitem>
+
+          <listitem>
+            <para>Provide a name for the environment file.</para>
+
+            <para>This will then be the name of the configuration XML file.
+            For example, we will name our environment
+            <emphasis>NewEnvironment</emphasis> and this will produce a
+            configuration XML file named
+            <emphasis>NewEnvironment.xml</emphasis> that we will
+            use.<emphasis> </emphasis></para>
+          </listitem>
+
+          <listitem>
+            <para>Press the Next button.</para>
+
+            <para>Next you will need to define the IP addresses that your HPCC
+            system will be using.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Enter the IP addresses.</para>
+
+            <para>IP Addresses can be specified individually using semi-colon
+            delimiters. You can also specify a range of IPs using a hyphen
+            (for example, nnn.nnn.nnn.x-y). In the image below, we specified
+            the IP addresses 10.239.219.1 through 10.239.219.100 using the
+            range syntax, and also a single IP 10.239.219.111.</para>
+
+            <para><graphic fileref="../../images/GS_ConfigMgrWiz002.jpg"
+            vendor="configmgrSS" /></para>
+          </listitem>
+
+          <listitem>
+            <para>Press the Next button.</para>
+
+            <para>Now you will define how many nodes to use for the Roxie and
+            Thor clusters.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Enter the appropriate values as indicated.</para>
+
+            <para><graphic fileref="../../images/GS_CMWiz003.jpg"
+            vendor="configmgrSS" /></para>
+
+            <variablelist>
+              <varlistentry>
+                <term>Number of support nodes:</term>
+
+                <listitem>
+                  <para>Specify the number of nodes to use for support
+                  components. The default is 1.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of nodes for Roxie cluster:</term>
+
+                <listitem>
+                  <para>Specify the number of nodes to use for your Roxie
+                  cluster. Enter zero (0) if you do not want a Roxie
+                  cluster.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of slave nodes for Thor cluster</term>
+
+                <listitem>
+                  <para>Specify the number of slave nodes to use in your Thor
+                  cluster. A Thor master node will be added automatically.
+                  Enter zero (0) if you do not want any Thor slaves.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of Thor slaves per node (default 1)</term>
+
+                <listitem>
+                  <para>Specify the number of Thor slave processes to
+                  instantiate on each slave node. Enter zero (0) if you do not
+                  want a Thor cluster.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Enable Roxie on demand</term>
+
+                <listitem>
+                  <para>Specify whether or not to allow queries to be run
+                  immediately on Roxie. This must be enabled to run the
+                  debugger. (Default is true)</para>
+                </listitem>
+              </varlistentry>
+            </variablelist>
+          </listitem>
+
+          <listitem>
+            <para>Press the <emphasis role="bold">Next</emphasis>
+            button</para>
+
+            <para>The wizard displays the configuration parameters.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Press the <emphasis role="bold">Finish</emphasis> button to
+            accept these values or press the <emphasis role="bold">Advanced
+            View</emphasis> button to edit in advanced mode.</para>
+
+            <graphic fileref="../../images/GS_ConfigMgrWiz004.jpg" />
+          </listitem>
+        </orderedlist>
+
+        <para>You will now be notified that you have completed the
+        wizard.</para>
+
+        <para><graphic fileref="../../images/GS_ConfigMgrWiz005.jpg" /></para>
+
+        <para>At this point, you have created a file named NewEnvironment.xml
+        in the <emphasis role="bold">/etc/HPCCSystems/source</emphasis>
+        directory</para>
+
+        <informaltable colsep="1" frame="all" rowsep="1">
+          <?dbfo keep-together="always"?>
+
+          <tgroup cols="2">
+            <colspec colwidth="49.50pt" />
+
+            <colspec />
+
+            <tbody>
+              <row>
+                <entry><inlinegraphic
+                fileref="../../images/OSSgr3.png" /></entry>
+
+                <entry>Keep in mind, that your HPCC configuration may be
+                different depending on your needs. For example, you may not
+                need a Roxie or you may need several smaller Roxie clusters.
+                In addition, in a production [Thor] system, you would ensure
+                that Thor and Roxie nodes are dedicated and have no other
+                processes running on them. This document is intended to show
+                you how to use the configuration tools. Capacity planning and
+                system design is covered in a training module.</entry>
+              </row>
+            </tbody>
+          </tgroup>
+        </informaltable>
+
+        <sect3 id="Distrib_Conf" role="brk">
+          <title>Distribute the Configuration</title>
+
+          <orderedlist>
+            <listitem>
+              <?dbfo keep-together="always"?>
+
+              <para>Stop the HPCC system.</para>
+
+              <para>If it is running stop the HPCC system (on every node),
+              using a command such as this:</para>
+
+              <para><programlisting>sudo /sbin/service hpcc-init stop</programlisting></para>
+
+              <variablelist>
+                <varlistentry>
+                  <term>Note:</term>
+
+                  <listitem>
+                    <para>You may have a multi-node system and a custom script
+                    such as the one illustrated in Appendix of the <emphasis
+                    role="bluebold">Installing and Running the HPCC
+                    Platform</emphasis> document to start and stop your
+                    system. If that is the case please use the appropriate
+                    command for stopping your system on every node.</para>
+                  </listitem>
+                </varlistentry>
+              </variablelist>
+
+              <para><informaltable colsep="1" frame="all" rowsep="1">
+                  <tgroup cols="2">
+                    <colspec colwidth="49.50pt" />
+
+                    <colspec />
+
+                    <tbody>
+                      <row>
+                        <entry><inlinegraphic
+                        fileref="../../images/caution.png" /></entry>
+
+                        <entry>Be sure HPCC is stopped before attempting to
+                        copy the environment.xml file.</entry>
+                      </row>
+                    </tbody>
+                  </tgroup>
+                </informaltable></para>
+            </listitem>
+
+            <listitem>
+              <para>Back up the original environment.xml file.</para>
+
+              <programlisting># For example
+sudo -u hpcc cp /etc/HPCCSystems/environment.xml /etc/HPCCSystems/source/environment-date.xml </programlisting>
+
+              <variablelist>
+                <varlistentry>
+                  <term>Note:</term>
+
+                  <listitem>
+                    <para>The live environment.xml file is located in your
+                    <emphasis role="bold">/etc/HPCCSystems/</emphasis>
+                    directory. Configuration Manager works on files in
+                    <emphasis role="bold">/etc/HPCCSystems/source</emphasis>
+                    directory. You must copy from this location to make an
+                    environment.xml file active.</para>
+                  </listitem>
+                </varlistentry>
+              </variablelist>
+
+              <para>You can also choose to give the environment file a more
+              descriptive name, to help differentiate any differences.</para>
+
+              <para>Having environment files under source control is a good
+              way to archive your environment settings.</para>
+            </listitem>
+
+            <listitem>
+              <para>Copy the new .xml file from the source directory to the
+              /etc/HPCCSystems and rename the file to
+              <emphasis>environment.xml</emphasis></para>
+
+              <programlisting># for example
+sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml</programlisting>
+
+              <para></para>
+            </listitem>
+
+            <listitem>
+              <para>Copy the <emphasis
+              role="bold">/etc/HPCCSystems/environment.xml</emphasis> to the
+              <emphasis role="bold">/etc/HPCCSystems/</emphasis> on to
+              <emphasis>every</emphasis> node.</para>
+
+              <para>You may want to use a script to push out the XML file to
+              all nodes. See the <emphasis>Example Scripts</emphasis> section
+              in the Appendix of the <emphasis role="bluebold">Installing and
+              Running the HPCC Platform</emphasis> document. You can use the
+              scripts as a model to create your own script to copy the
+              environment.xml file out to all your nodes.</para>
+            </listitem>
+
+            <listitem>
+              <para>Restart the HPCC platform on all nodes.</para>
+            </listitem>
+          </orderedlist>
+        </sect3>
+      </sect2>
+    </sect1>
+  </chapter>
+</book>

二进制
docs/images/CS-1912.jpg


二进制
docs/images/CS-sysfail.jpg


二进制
docs/images/CSimg01.jpg


二进制
docs/images/CSimg02.jpg


二进制
docs/images/CSimg03.jpg


二进制
docs/images/CSimg04.jpg


二进制
docs/images/CSimg05.jpg


二进制
docs/images/CSimg06.jpg


二进制
docs/images/CSimg07.jpg


二进制
docs/images/CSimg08.jpg


二进制
docs/images/CSimg09.jpg


二进制
docs/images/SA002.jpg


二进制
docs/images/SA003.jpg


二进制
docs/images/SA004.jpg


二进制
docs/images/SA005.jpg


二进制
docs/images/SA006.jpg


二进制
docs/images/SA008.jpg


+ 7 - 2
ecl/hql/hqlparse.cpp

@@ -2000,7 +2000,12 @@ IXmlScope *HqlLex::ensureTopXmlScope(const YYSTYPE & errpos)
 {
 {
     IXmlScope *top = queryTopXmlScope();
     IXmlScope *top = queryTopXmlScope();
     if (!top)
     if (!top)
-        top = xmlScope = ::loadXML("<xml></xml>");
+    {
+    	reportError(errpos, ERR_XML_NOSCOPE, "No XML scope active");
+
+    	// recovery: create a default XML scope
+    	top = xmlScope = ::loadXML("<xml></xml>");
+    }
 
 
     return top;
     return top;
 }
 }
@@ -2057,7 +2062,7 @@ void HqlLex::loadXML(const YYSTYPE & errpos, const char *name, const char * chil
         return;
         return;
     }
     }
 
 
-    if (inmacro)
+    if (false && inmacro)
     {
     {
         inmacro->loadXML(errpos, name);
         inmacro->loadXML(errpos, name);
         return;
         return;

+ 2 - 2
ecl/hthor/hthor.cpp

@@ -7831,9 +7831,9 @@ void CHThorDiskReadBaseActivity::resolve()
         if (!ldFile)
         if (!ldFile)
         {
         {
             StringBuffer buff;
             StringBuffer buff;
-            buff.append("Skipping OPT disk read of nonexistent file ").append(mangledHelperFileName.str());
+            buff.appendf("Input file '%s' was missing but declared optional", mangledHelperFileName.str());
             WARNLOG("%s", buff.str());
             WARNLOG("%s", buff.str());
-            agent.addWuException(buff.str(), 0, ExceptionSeverityWarning, "hthor");
+            agent.addWuException(buff.str(), 0, ExceptionSeverityInformation, "hthor");
         }
         }
     }
     }
 }
 }

+ 1 - 1
ecl/regress/demangle.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 #DECLARE (mstg)
 #DECLARE (mstg)
 #DECLARE (dmstg)
 #DECLARE (dmstg)

+ 1 - 1
ecl/regress/err2201.ecl

@@ -15,6 +15,6 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #IF(
 #IF(

+ 1 - 1
ecl/regress/err2203.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml></xml>');
 
 
 #SET(s, 'abc')
 #SET(s, 'abc')
 
 

+ 1 - 1
ecl/regress/err2204.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml></xml>');
 
 
 #FOR(i)
 #FOR(i)
 
 

+ 1 - 1
ecl/regress/err2205.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #ELSE
 #ELSE
   #DECLARE(s)
   #DECLARE(s)

+ 1 - 1
ecl/regress/err2206.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #IF(true)
 #IF(true)
   #DECLARE(s)
   #DECLARE(s)

+ 1 - 1
ecl/regress/err2208.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #IF (true)
 #IF (true)
   #BREAK
   #BREAK

+ 1 - 1
ecl/regress/err2209.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #LOOP
 #LOOP
 #END
 #END

+ 1 - 1
ecl/regress/err2210.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml></xml>');
 
 
 #LOOP
 #LOOP
   #IF (false)
   #IF (false)

+ 1 - 1
ecl/regress/errextrabreak.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #BREAK
 #BREAK
 
 

+ 1 - 1
ecl/regress/errextraelse.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errextraend.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 ############################################################################## */
 
 
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errisvalid.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+loadxml('<xml></xml>');
 
 
 #DECLARE (flag)
 #DECLARE (flag)
 
 

+ 1 - 1
ecl/regress/errloop2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+loadxml('<xml></xml>');
 
 
 #DECLARE (s)
 #DECLARE (s)
 
 

+ 1 - 1
ecl/regress/errloop3.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 ############################################################################## */
 
 
 /* should detect */
 /* should detect */
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
   #LOOP
   #LOOP
     #BREAK
     #BREAK

+ 1 - 1
ecl/regress/errloop4.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 ############################################################################## */
 
 
 /* should detect */
 /* should detect */
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
   #DECLARE(s)
   #DECLARE(s)
    #LOOP
    #LOOP

+ 1 - 1
ecl/regress/errloop5.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
   #LOOP
   #LOOP
     #BREAK
     #BREAK

+ 1 - 1
ecl/regress/errloop6.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
   #LOOP
   #LOOP
 //  #BREAK
 //  #BREAK

+ 1 - 1
ecl/regress/errloop7.ecl

@@ -16,6 +16,6 @@
 ############################################################################## */
 ############################################################################## */
 
 
 
 
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
 #END
 #END

+ 1 - 1
ecl/regress/errloop8.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 ############################################################################## */
 
 
 /* Can not detect by just counting the #BREAK */
 /* Can not detect by just counting the #BREAK */
-
+loadxml('<xml></xml>');
 #LOOP
 #LOOP
   #IF (false)
   #IF (false)
     #BREAK
     #BREAK

+ 1 - 1
ecl/regress/errmissingend.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errmissingend1.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errmissingend2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errmissingend3.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errmissingend4.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s)
 #DECLARE(s)
 
 

+ 1 - 1
ecl/regress/errnestedhashif.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s,result)
 #DECLARE(s,result)
 
 

+ 1 - 1
ecl/regress/export2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 NamesRecord := record
 NamesRecord := record
 string10 first;
 string10 first;

+ 1 - 1
ecl/regress/export3.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 NamesRecord := record
 NamesRecord := record
 string10 first;
 string10 first;

+ 1 - 1
ecl/regress/export4.ecl

@@ -2,7 +2,7 @@ decimalRec := RECORD
 DECIMAL3 A;
 DECIMAL3 A;
 DECIMAL3_1 B;
 DECIMAL3_1 B;
 END;
 END;
- //"dummy" just to open an XML scope
+LOADXML('<xml/>'); //"dummy" just to open an XML scope
 #DECLARE(out);
 #DECLARE(out);
 #EXPORT(out, decimalRec);
 #EXPORT(out, decimalRec);
 OUTPUT(%'out'%);
 OUTPUT(%'out'%);

+ 1 - 1
ecl/regress/gch2.ecl

@@ -17,7 +17,7 @@
 
 
 export CleanFields(inputFile,outputFile) := macro
 export CleanFields(inputFile,outputFile) := macro
 
 
-
+LOADXML('<xml/>');
 
 
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 
 

+ 1 - 1
ecl/regress/hashelseif2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 
 
 value := 1;
 value := 1;

+ 1 - 1
ecl/regress/mangle.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 #declare(s1,s2)
 #declare(s1,s2)
 
 

+ 1 - 1
ecl/regress/memleak9.ecl

@@ -17,7 +17,7 @@
 
 
 import jfgao;
 import jfgao;
 
 
-
+LOADXML('<xml></xml>');
 #DECLARE(s1)
 #DECLARE(s1)
 #SET(s1, 'TMPT call external func: ' + jfgao.MyStringLib.TestExternalFunc(3))
 #SET(s1, 'TMPT call external func: ' + jfgao.MyStringLib.TestExternalFunc(3))
 %'s1'%;
 %'s1'%;

+ 1 - 1
ecl/regress/mluber36.ecl

@@ -26,7 +26,7 @@ OUTPUT('<<'+%'did'%+'>>');
 
 
 endmacro;
 endmacro;
 
 
-
+loadxml('<xml/>');
 did('<root><did>81093191</did></root>');
 did('<root><did>81093191</did></root>');
 
 
 
 

+ 1 - 1
ecl/regress/mluber63.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+loadxml('<xml/>');
 
 
 string zz := '' : stored('zz');
 string zz := '' : stored('zz');
 
 

+ 1 - 1
ecl/regress/mluber66.ecl

@@ -17,7 +17,7 @@
 
 
 export CleanFields(inputFile,outputFile) := macro
 export CleanFields(inputFile,outputFile) := macro
 
 
-
+loadxml('<xml/>');
 
 
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 
 

+ 1 - 1
ecl/regress/round.ecl

@@ -14,7 +14,7 @@
     See the License for the specific language governing permissions and
     See the License for the specific language governing permissions and
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
-
+LOADXML('<xml/>');
 
 
 show(value) := macro
 show(value) := macro
     output((string) value + ' =\n');
     output((string) value + ' =\n');

+ 1 - 1
ecl/regress/round2.ecl

@@ -14,7 +14,7 @@
     See the License for the specific language governing permissions and
     See the License for the specific language governing permissions and
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
-
+LOADXML('<xml/>');
 
 
 show(value) := macro
 show(value) := macro
     output((string) value + ' =\n');
     output((string) value + ' =\n');

+ 1 - 1
ecl/regress/rtaylor22.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
     limitations under the License.
 ############################################################################## */
 ############################################################################## */
 
 
-
+LOADXML('<xml/>');
 
 
 NamesRecord := record
 NamesRecord := record
 string10 first;
 string10 first;

+ 1 - 1
ecl/regress/textsearch.ecl

@@ -504,7 +504,7 @@ DG_MemFile := DATASET(DG_MemFileName,DG_MemFileRec,FLAT);
 
 
 INCLUDE_DEBUG_INFO := false;
 INCLUDE_DEBUG_INFO := false;
 
 
-
+LOADXML('<xml/>');
 #option ('checkAsserts',false);
 #option ('checkAsserts',false);
 import lib_stringLib;
 import lib_stringLib;
 
 

+ 1 - 1
ecl/regress/tmptcall1.ecl

@@ -19,7 +19,7 @@
 // Test calling stuff from template command
 // Test calling stuff from template command
 // Everything in default module works
 // Everything in default module works
 
 
-
+LOADXML('<xml></xml>');
 
 
 export YorN(boolean flag) := MAP(flag = true => 'Y', 'N');
 export YorN(boolean flag) := MAP(flag = true => 'Y', 'N');
 EXPORT testmacro(x) := MACRO
 EXPORT testmacro(x) := MACRO

+ 1 - 1
ecl/regress/tmptcall2.ecl

@@ -21,7 +21,7 @@
 
 
 import jfgao;
 import jfgao;
 
 
-
+LOADXML('<xml></xml>');
 
 
 s1 := 'ECL call external func: ' + jfgao.MyStringLib.TestExternalFunc(3);
 s1 := 'ECL call external func: ' + jfgao.MyStringLib.TestExternalFunc(3);
 s2 := 'ECL call ECL func: ' + jfgao.myfunc(3);
 s2 := 'ECL call ECL func: ' + jfgao.myfunc(3);

+ 1 - 1
ecl/regress/tmptcall3.ecl

@@ -56,7 +56,7 @@ s1x;
 s2x;
 s2x;
 s3x;
 s3x;
 
 
-
+LOADXML('<xml></xml>');
 
 
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 
 

+ 1 - 1
ecl/regress/tmptcall4.ecl

@@ -39,7 +39,7 @@ s1;
 s2;
 s2;
 s3;
 s3;
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 
 

+ 2 - 12
esp/build.sh

@@ -14,12 +14,6 @@ TOOLSDIR="$SRCDIR/util/buildscripts"
 # Destination directory for built code
 # Destination directory for built code
 DISTDIR=$1
 DISTDIR=$1
 
 
-# Module ID of the main application package loader configuration
-LOADERMID="eclwatch/run"
-
-# Main application package loader configuration
-LOADERCONF="$SRCDIR/$LOADERMID.js"
-
 # Main application package build configuration
 # Main application package build configuration
 PROFILE="$BASEDIR/profiles/eclwatch.profile.js"
 PROFILE="$BASEDIR/profiles/eclwatch.profile.js"
 
 
@@ -43,16 +37,14 @@ cp -r "$SRCDIR/CodeMirror2" "$DISTDIR/CodeMirror2"
 cat "$SRCDIR/stub.htm" | tr '\n' ' ' | \
 cat "$SRCDIR/stub.htm" | tr '\n' ' ' | \
 perl -pe "
 perl -pe "
   s/<\!--.*?-->//g;                          # Strip comments
   s/<\!--.*?-->//g;                          # Strip comments
-#  s/isDebug: *1/deps:['$LOADERMID']/;        # Remove isDebug, add deps
-#  s/<script src=\"$LOADERMID.*?\/script>//;  # Remove script eclwatch/run
   s/\s+/ /g;                                 # Collapse white-space" > "$DISTDIR/stub.htm"
   s/\s+/ /g;                                 # Collapse white-space" > "$DISTDIR/stub.htm"
 
 
 cd "$TOOLSDIR"
 cd "$TOOLSDIR"
 
 
 if which node >/dev/null; then
 if which node >/dev/null; then
-    node ../../dojo/dojo.js load=build --require "$LOADERCONF" --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
+    node ../../dojo/dojo.js load=build --require "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
 elif which java >/dev/null; then
 elif which java >/dev/null; then
-    java -Xms256m -Xmx256m  -cp ../shrinksafe/js.jar:../closureCompiler/compiler.jar:../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main  ../../dojo/dojo.js baseUrl=../../dojo load=build --require "$LOADERCONF" --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
+    java -Xms256m -Xmx256m  -cp ../shrinksafe/js.jar:../closureCompiler/compiler.jar:../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main  ../../dojo/dojo.js baseUrl=../../dojo load=build --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
 else
 else
     echo "Need node.js or Java to build!"
     echo "Need node.js or Java to build!"
     exit 1
     exit 1
@@ -62,8 +54,6 @@ echo "Build complete"
 
 
 cd "$BASEDIR"
 cd "$BASEDIR"
 
 
-LOADERMID=${LOADERMID//\//\\\/}
-
 for dojodir in dojo dojox dijit
 for dojodir in dojo dojox dijit
 do
 do
   for f in  $(find ${DISTDIR}/${dojo_dir} -type f -perm /a+x ! -name "*.sh" \
   for f in  $(find ${DISTDIR}/${dojo_dir} -type f -perm /a+x ! -name "*.sh" \

+ 150 - 150
esp/eclwatch/ws_XSLT/nls/bs/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
+<st id='Action'>Akcija</st>
+<st id='Available'>Dostupni</st>
+<st id='AdditionalProcessesToFilter'>Dodatni procesi za filtriranje</st>
+<st id='AutoRefreshEvery'>Automatski osvježite svakih</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Automatski ažurirajte mjere kada se fokus kolone mjenja.</st>
+<st id='AvailableNodes'>Dostupni Čvorovi (Nodes)</st>
+<st id='BrowserTimedOut'>Brauser vrijeme je isteklo zbog dugog vremenskog kašnjenja.</st>
+<st id='Busy'>Zauzet</st>
 <st id='Bytes'>bytes</st>
 <st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
-<st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
+<st id='Cancel'>Poništite</st>
+<st id='Cluster'>Klaster</st>
+<st id='ClusterProcess'>Klaster Proces</st>
+<st id='Clusters'>Klasteri</st>
+<st id='ClusterTopology'>Klaster Topologija</st>
+<st id='Component'>Komponenta</st>
+<st id='Computer'>Kompjuter</st>
+<st id='ComputerUpTime'>Vrijeme Aktivnosti Kompjutera</st>
+<st id='Condition'>Stanje</st>
+<st id='Configuration'>Konfiguracija</st>
+<st id='ConfigurationFile'>Konfiguraciona Datoteka</st>
+<st id='ConfirmSwap'>Jeste li sigurni da želite zamijeniti ove dvije mašine</st>
+<st id='CPULoad'>Opterećenje Procesora</st>
+<st id='Critical'>Kritičan</st>
 <st id='DaliServer'>Dali Server</st>
 <st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
+<st id='DaliServers'>Dali Serveri</st>
+<st id='Date'>Datum</st>
+<st id='Description'>Opis</st>
+<st id='DFUServers'>DFU Serveri</st>
+<st id='Directory'>Direktorij</st>
+<st id='Domain'>Domen</st>
+<st id='Download'>Dobavite</st>
+<st id='DropZone'>Zona Prijema</st>
+<st id='DropZones'>Zone Prijema</st>
+<st id='EarliestFirst'>Najraniji Ide Prvi</st>
+<st id='ECLAgents'>ECL Izvršitelji</st>
+<st id='ECLAgentProcess'>ECL Izvršitelj Proces</st>
+<st id='ECLCCServers'>ECL Serveri za Kompiliranje</st>
+<st id='ECLSchedulers'>ECL Organizatori Posla</st>
+<st id='ECLServers'>ECL Serveri</st>
+<st id='ESPServers'>ESP Serveri</st>
+<st id='FailedToRetrieveInformation'>Nije uspjelo dohvatanje informacija. Molimo provjerite konfiguraciju.</st>
+<st id='Fatal'>Fatalan</st>
+<st id='Fetched'>Učitan</st>
+<st id='Files'>Datoteke</st>
+<st id='FirstPage'>Prva stranica</st>
+<st id='FirstRowsNotDefined'>Polja nisu definisana u prvom rekordu</st>
 <st id='Folder'>Folder</st>
 <st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
-<st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
-<st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='FTSlaves'>FT Izvršivači</st>
+<st id='GenesisServers'>Genesis Serveri</st>
+<st id='GetProcessorInformation'>Dobavite Informacije o Procesoru</st>
+<st id='GetRoxieMetrics'>Dobavite Informacije o Roxie</st>
+<st id='GetSoftwareInformation'>Dobavite Informacije o softveru</st>
+<st id='GetStorageInformation'>Dobavite Informacije o prostoru</st>
+<st id='Home'>Polazište</st>
+<st id='Hours'>sati</st>
+<st id='Instance'>Primjer</st>
+<st id='InvalidFirstRows'>Pogrešni podaci u polju za prve redove</st>
+<st id='InvalidLastHours'>Pogrešni podaci u polju za poslijednje sate</st>
+<st id='InvalidLastRows'>Pogrešni podaci u polju za poslijednje redove</st>
+<st id='InvalidPageNumber'>Pogrešni podaci u polju za broj stranice</st>
+<st id='InvalidTime'>Pogrešni podaci u polju za Vrijeme</st>
+<st id='IPAddress'>IP Adresa</st>
+<st id='LastHoursNotDefined'>Polje za poslijednje sate nije definisano</st>
+<st id='LastRowsNotDefined'>Polje za poslijednje redove nije definisano</st>
+<st id='LatestFirst'>Najnoviji Ide Prvi</st>
+<st id='LDAPServers'>LDAP Serveri</st>
+<st id='LoadingPleaseWait'>Molimo sačekajte ...</st>
+<st id='LocalFileSystemsOnly'>Samo Lokalni Sistemi datoteka</st>
+<st id='Location'>Lokacija</st>
+<st id='LogFile'>Log datoteka</st>
+<st id='LogDirectory'>Log Direktorij</st>
+<st id='LostReferenceToParentWindow'>Izbubljna referenca na glavnu stranicu.  Molimo da ponovite put!</st>
+<st id='MachineInfo'>Informacija o Mašini</st>
+<st id='Major'>Glavni</st>
+<st id='Mean'>Srednji</st>
+<st id='Metrics'>Metrika</st>
+<st id='Minor'>Minoran</st>
 <st id='Mins'>mins</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>MySQL Serveri</st>
 <st id='NA'>N/A</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
+<st id='Name'>Ime</st>
+<st id='NetworkAddress'>Netvork Adresa</st>
+<st id='NextPage'>Slijedeća Stranica</st>
+<st id='NoClustersDefined'>Klasteri nisu definisani.</st>
+<st id='Nodes'>Čvorovi (Nodovi)</st>
+<st id='NoItems'>Nema ništa</st>
+<st id='NoMachinesSelected'>Mašine nisu odabrane!</st>
+<st id='Normal'>Normalan</st>
+<st id='NoSystemServicesDefined'>Sistem Servisi nisu definisani!</st>
+<st id='NoTargetClustersSelected'>Niste odabrali klaster za izvrsavanje!</st>
+<st id='OrFirst'>ili prvi</st>
+<st id='OrGoToPage'>ili idite na stranicu</st>
+<st id='OrLast'>ili zadnji</st>
+<st id='OrLastPage'>ili zadnja stranica</st>
+<st id='OrTimeFrom'>ili od vremena</st>
+<st id='Page'>strana</st>
+<st id='PageNumberNotDefined'>polje za broj stranice nije definisano</st>
+<st id='PhysicalMemory'>Fizička Memorija</st>
+<st id='Platform'>Platforma</st>
 <st id='Port'>Port</st>
 <st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
+<st id='PrevPage'>Prethodna Stranica</st>
+<st id='Processes'>Procesi</st>
+<st id='ProcessesDown'>Procesi su Zaustavljni</st>
+<st id='Protocol'>Protokol</st>
+<st id='Queue'>Red</st>
+<st id='Ready'>Spreman</st>
+<st id='Recycling'>Recikliranje</st>
+<st id='Refresh'>Osvježite</st>
+<st id='Rows'>redovi</st>
 <st id='RoxieServer'>Roxie Server</st>
 <st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
+<st id='SashaServers'>Sasha Serveri</st>
+<st id='SchedulerProcess'>Proces za raspoređivanje poslova</st>
+<st id='SecurityString'>Sigurnosni Tekst</st>
+<st id='Select'>Izaberite</st>
+<st id='SelectASpareNodeToSwap'>Izaberite rezervni nod za zamjenu</st>
+<st id='SelectAllOrNone'>Izaberite Sve / Ništa</st>
+<st id='SelectAllTargetClusters'>Izaberite sve klastere za izvršavanje</st>
+<st id='SelectDeselectAll'>Izaberite ili poništite sve</st>
+<st id='SelectDeselectAllMachines'>Izaberite ili poništite sve mašine</st>
+<st id='SelectThisTargetCluster'>Izaberite ovaj klaster za izvršavanje</st>
+<st id='ServerProcess'>Server Proces</st>
+<st id='ServiceName'>Ime Servisa</st>
+<st id='ServiceType'>Tip Servisa</st>
+<st id='ShowProcessesUsingFilter'>Pokažite procese pomoću filtera</st>
+<st id='Size'>Veličina</st>
+<st id='SlaveNumber'>Broj Izvršivača</st>
+<st id='Starting'>Pokretanje</st>
+<st id='State'>Stanje</st>
+<st id='Stopping'>Zaustavljanje</st>
+<st id='Submit'>Podnesite</st>
+<st id='Suspended'>Suspendovan</st>
+<st id='Swap'>Zamijenite</st>
+<st id='SwapNode'>Zamijenite Nod</st>
+<st id='SystemServers'>Sistem Serveri</st>
+<st id='SystemServiceNodes'>Sistem Servis Nodovi</st>
+<st id='TargetClusters'>Klasteri za Izvršavanje</st>
+<st id='TimeNotDefined'>Vremenski Interval nije definisan</st>
+<st id='ThisPageFromByte'>ova stranica od byte</st>
 <st id='ThorMaster'>Thor Master</st>
 <st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
+<st id='ThorSlave'>Thor Izvršavač</st>
+<st id='ThorSlaves'>Thor Izvršavači</st>
+<st id='ThorSpare'>Rezervni Thor</st>
+<st id='To'>u</st>
+<st id='ToByte'>u byte</st>
 <st id='Total'>Total</st>
 <st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='TotalFileSize'>Ukupna veličina datoteke</st>
+<st id='UpdateMetricsNow'>Ažurirajte Metriku</st>
+<st id='UpTime'>Vrijeme Aktivnog Rada</st>
+<st id='Unknown'>Nepoznat</st>
+<st id='ViewConfigurationFile'>Pogledajte Konfiguracionu Datoteku</st>
+<st id='ViewColumns'>Pogledajte Kolone</st>
+<st id='ViewDetails'>Pogledajte Detalje</st>
+<st id='ViewingPage'>Pregled stranice</st>
+<st id='ViewLogFile'>Pogledajte Log Datoteku</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Upozorite ako je raspoloživ prostor na disku ispod</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Upozorite ako je raspoloživa memorija ispod</st>
+<st id='WarnIfCPUUsageIsOver'>Upozorite ako je iskorištenost procesora iznad</st>
+<st id='Warning'>Upozorenje</st>
 </strings>
 </strings>
 </hpcc>
 </hpcc>

+ 148 - 148
esp/eclwatch/ws_XSLT/nls/hr/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
+<st id='Action'>Akcija</st>
+<st id='Available'>Dostupni</st>
+<st id='AdditionalProcessesToFilter'>Dodatni procesi za filtriranje</st>
+<st id='AutoRefreshEvery'>Automatski osvježite svakih</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Automatski ažurirajte mjere prilikom promjene fokusa kolone.</st>
+<st id='AvailableNodes'>Dostupni Čvorovi (Nodes)</st>
+<st id='BrowserTimedOut'>Browser vrijeme je isteklo zbog dugog vremenskog kašnjenja.</st>
+<st id='Busy'>Zauzet</st>
 <st id='Bytes'>bytes</st>
 <st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
-<st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
+<st id='Cancel'>Poništite</st>
+<st id='Cluster'>Klaster</st>
+<st id='ClusterProcess'>Klaster Proces</st>
+<st id='Clusters'>Klasteri</st>
+<st id='ClusterTopology'>Klaster Topologija</st>
+<st id='Component'>Komponenta</st>
+<st id='Computer'>Računalo</st>
+<st id='ComputerUpTime'>Vrijeme Aktivnosti Računala</st>
+<st id='Condition'>Stanje</st>
+<st id='Configuration'>Konfiguracija</st>
+<st id='ConfigurationFile'>Konfiguraciona Datoteka</st>
+<st id='ConfirmSwap'>Jeste li sigurni da želite zamijeniti ove dvije mašine</st>
+<st id='CPULoad'>Opterećenje Procesora</st>
+<st id='Critical'>Kritičan</st>
 <st id='DaliServer'>Dali Server</st>
 <st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
+<st id='DaliServers'>Dali Serveri</st>
+<st id='Date'>Datum</st>
+<st id='Description'>Opis</st>
+<st id='DFUServers'>DFU Serveri</st>
+<st id='Directory'>Direktorij</st>
+<st id='Domain'>Domen</st>
+<st id='Download'>Dobavite</st>
+<st id='DropZone'>Zona Prijema</st>
+<st id='DropZones'>Zone Prijema</st>
+<st id='EarliestFirst'>Najraniji Ide Prvi</st>
+<st id='ECLAgents'>ECL Izvršitelji</st>
+<st id='ECLAgentProcess'>ECL Izvršitelj Proces</st>
+<st id='ECLCCServers'>ECL Serveri za Kompiliranje</st>
+<st id='ECLSchedulers'>ECL Organizatori Posla</st>
+<st id='ECLServers'>ECL Serveri</st>
+<st id='ESPServers'>ESP Serveri</st>
+<st id='FailedToRetrieveInformation'>Nije uspjelo dohvatanje informacija. Molimo provjerite konfiguraciju.</st>
+<st id='Fatal'>Fatalan</st>
+<st id='Fetched'>Učitan</st>
+<st id='Files'>Datoteke</st>
+<st id='FirstPage'>Prva stranica</st>
+<st id='FirstRowsNotDefined'>Polja nisu definisana u prvom rekordu</st>
 <st id='Folder'>Folder</st>
 <st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
+<st id='FTSlaves'>FT Izvršivači</st>
+<st id='GenesisServers'>Genesis Serveri</st>
+<st id='GetProcessorInformation'>Dobavite Informacije o Procesoru</st>
+<st id='GetRoxieMetrics'>Dobavite Informacije o Roxie</st>
+<st id='GetSoftwareInformation'>Dobavite Informacije o software</st>
+<st id='GetStorageInformation'>Dobavite Informacije o prostoru</st>
+<st id='Home'>Polazište</st>
+<st id='Hours'>sati</st>
+<st id='Instance'>Primjer</st>
+<st id='InvalidFirstRows'>Pogrešni podaci u polju za prve redove</st>
+<st id='InvalidLastHours'>Pogrešni podaci u polju za poslijednje sate</st>
+<st id='InvalidLastRows'>Pogrešni podaci u polju za poslijednje redove</st>
+<st id='InvalidPageNumber'>Pogrešni podaci u polju za broj stranice</st>
+<st id='InvalidTime'>Pogrešni podaci u polju za Vrijeme</st>
 <st id='IPAddress'>IP Address</st>
 <st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
+<st id='LastHoursNotDefined'>Polje za poslijednje sate nije definisano</st>
+<st id='LastRowsNotDefined'>Polje za poslijednje redove nije definisano</st>
+<st id='LatestFirst'>Najnoviji Ide Prvi</st>
+<st id='LDAPServers'>LDAP Serveri</st>
+<st id='LoadingPleaseWait'>Molimo sačekajte ...</st>
+<st id='LocalFileSystemsOnly'>Samo Lokalni Sistemi datoteka</st>
+<st id='Location'>Lokacija</st>
+<st id='LogFile'>Log Direktorij</st>
 <st id='LogDirectory'>Log Directory</st>
 <st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='LostReferenceToParentWindow'>Izbubljna referenca na glavnu stranicu.  Molimo da ponovite put!</st>
+<st id='MachineInfo'>Informacija o Mašini</st>
+<st id='Major'>Glavni</st>
+<st id='Mean'>Srednji</st>
+<st id='Metrics'>Metrika</st>
+<st id='Minor'>Minoran</st>
 <st id='Mins'>mins</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>MySQL Serveri</st>
 <st id='NA'>N/A</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
+<st id='Name'>Ime</st>
+<st id='NetworkAddress'>Netvork Adresa</st>
+<st id='NextPage'>Slijedeća Stranica</st>
+<st id='NoClustersDefined'>Klasteri nisu definisani.</st>
+<st id='Nodes'>Čvorovi (Nodovi)</st>
+<st id='NoItems'>Nema ništa</st>
+<st id='NoMachinesSelected'>Mašine nisu odabrane!</st>
+<st id='Normal'>Normalan</st>
+<st id='NoSystemServicesDefined'>Sistem Servisi nisu definisani!</st>
+<st id='NoTargetClustersSelected'>Niste odabrali klaster za izvrsavanje!</st>
+<st id='OrFirst'>ili prvi</st>
+<st id='OrGoToPage'>ili idite na stranicu</st>
+<st id='OrLast'>ili zadnji</st>
+<st id='OrLastPage'>ili zadnja stranica</st>
+<st id='OrTimeFrom'>ili od vremena</st>
+<st id='Page'>strana</st>
+<st id='PageNumberNotDefined'>polje za broj stranice nije definisano</st>
+<st id='PhysicalMemory'>Fizička Memorija</st>
+<st id='Platform'>Platforma</st>
 <st id='Port'>Port</st>
 <st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
+<st id='PrevPage'>Prethodna Stranica</st>
+<st id='Processes'>Procesi</st>
+<st id='ProcessesDown'>Procesi su Zaustavljni</st>
+<st id='Protocol'>Protokol</st>
+<st id='Queue'>Red</st>
+<st id='Ready'>Spreman</st>
+<st id='Recycling'>Recikliranje</st>
+<st id='Refresh'>Osvježite</st>
+<st id='Rows'>redovi</st>
 <st id='RoxieServer'>Roxie Server</st>
 <st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
+<st id='SashaServers'>Sasha Serveri</st>
+<st id='SchedulerProcess'>Proces za raspoređivanje poslova</st>
+<st id='SecurityString'>Sigurnosni Tekst</st>
+<st id='Select'>Izaberite</st>
+<st id='SelectASpareNodeToSwap'>Izaberite rezervni nod za zamjenu</st>
+<st id='SelectAllOrNone'>Izaberite Sve / Ništa</st>
+<st id='SelectAllTargetClusters'>Izaberite sve klastere za izvršavanje</st>
+<st id='SelectDeselectAll'>Izaberite ili poništite sve</st>
+<st id='SelectDeselectAllMachines'>Izaberite ili poništite sve mašine</st>
+<st id='SelectThisTargetCluster'>Izaberite ovaj klaster za izvršavanje</st>
+<st id='ServerProcess'>Server Proces</st>
+<st id='ServiceName'>Ime Servisa</st>
+<st id='ServiceType'>Tip Servisa</st>
+<st id='ShowProcessesUsingFilter'>Pokažite procese pomoću filtera</st>
+<st id='Size'>Veličina</st>
+<st id='SlaveNumber'>Broj Izvršivača</st>
+<st id='Starting'>Pokretanje</st>
+<st id='State'>Stanje</st>
+<st id='Stopping'>Zaustavljanje</st>
+<st id='Submit'>Podnesite</st>
+<st id='Suspended'>Suspendovan</st>
+<st id='Swap'>Zamijenite</st>
+<st id='SwapNode'>Zamijenite Nod</st>
+<st id='SystemServers'>Sistem Serveri</st>
+<st id='SystemServiceNodes'>Sistem Servis Nodovi</st>
+<st id='TargetClusters'>Klasteri za Izvršavanje</st>
+<st id='TimeNotDefined'>Vremenski Interval nije definisan</st>
+<st id='ThisPageFromByte'>ova stranica od byte</st>
 <st id='ThorMaster'>Thor Master</st>
 <st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
+<st id='ThorSlave'>Thor Izvršavač</st>
+<st id='ThorSlaves'>Thor Izvršavači</st>
+<st id='ThorSpare'>Rezervni Thor</st>
+<st id='To'>u</st>
+<st id='ToByte'>u byte</st>
 <st id='Total'>Total</st>
 <st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='TotalFileSize'>Ukupna veličina datoteke</st>
+<st id='UpdateMetricsNow'>Ažurirajte Metriku</st>
+<st id='UpTime'>Vrijeme Aktivnog Rada</st>
+<st id='Unknown'>Nepoznat</st>
+<st id='ViewConfigurationFile'>Pogledajte Konfiguracionu Datoteku</st>
+<st id='ViewColumns'>Pogledajte Kolone</st>
+<st id='ViewDetails'>Pogledajte Detalje</st>
+<st id='ViewingPage'>Pregled stranice</st>
+<st id='ViewLogFile'>Pogledajte Log Datoteku</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Upozorite ako je raspoloživ prostor na disku ispod</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Upozorite ako je raspoloživa memorija ispod</st>
+<st id='WarnIfCPUUsageIsOver'>Upozorite ako je iskorištenost procesora iznad</st>
+<st id='Warning'>Upozorenje</st>
 </strings>
 </strings>
 </hpcc>
 </hpcc>

+ 155 - 155
esp/eclwatch/ws_XSLT/nls/sr/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
-<st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
+<st id='Action'>Акција</st>
+<st id='Available'>Доступни</st>
+<st id='AdditionalProcessesToFilter'>Додатни процеси за филтрирање</st>
+<st id='AutoRefreshEvery'>Аутоматски освежите сваких</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Аутоматски ажурирајте мере када се фокус колоне мења.</st>
+<st id='AvailableNodes'>Доступни Чворови (Нодес)</st>
+<st id='BrowserTimedOut'>Браусер време је истекло због дугог временског кашњења.</st>
+<st id='Busy'>Заузет</st>
+<st id='Bytes'>Бyтес</st>
+<st id='Cancel'>Поништите</st>
+<st id='Cluster'>Кластер</st>
+<st id='ClusterProcess'>Кластер Процес</st>
+<st id='Clusters'>Кластери</st>
+<st id='ClusterTopology'>Кластер Топологија</st>
+<st id='Component'>Компонента</st>
+<st id='Computer'>Компјутер</st>
+<st id='ComputerUpTime'>Време Активности Компјутера</st>
+<st id='Condition'>Стање</st>
 <st id='Configuration'>Configuration</st>
 <st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
-<st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
-<st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
+<st id='ConfigurationFile'>Конфигурациона Датотека</st>
+<st id='ConfirmSwap'>Јесте ли сигурни да желите заменити ове две машине</st>
+<st id='CPULoad'>Оптерећење Процесора</st>
+<st id='Critical'>Критичан</st>
+<st id='DaliServer'>Дали Сервер</st>
+<st id='DaliServers'>Дали Сервери</st>
+<st id='Date'>Датум</st>
+<st id='Description'>Опис</st>
+<st id='DFUServers'>ДФУ Сервери</st>
+<st id='Directory'>Директориј</st>
+<st id='Domain'>Домен</st>
+<st id='Download'>Добавите</st>
+<st id='DropZone'>Зона Пријема</st>
+<st id='DropZones'>Зонe Пријема</st>
+<st id='EarliestFirst'>Најранији Иде Први</st>
+<st id='ECLAgents'>ЕЦЛ Извршитељи</st>
+<st id='ECLAgentProcess'>ЕЦЛ Извршитељ Процес</st>
+<st id='ECLCCServers'>ЕЦЛ Сервери за Компилирање</st>
+<st id='ECLSchedulers'>ЕЦЛ Организатори Посла</st>
+<st id='ECLServers'>ЕЦЛ Сервери</st>
+<st id='ESPServers'>ЕСП Сервери</st>
+<st id='FailedToRetrieveInformation'>Није успјело дохватање информација. Молимо провјерите конфигурацију.</st>
+<st id='Fatal'>Фаталан</st>
+<st id='Fetched'>Учитан</st>
+<st id='Files'>Датотеке</st>
+<st id='FirstPage'>Прва страница</st>
+<st id='FirstRowsNotDefined'>Поља нису дефинисана у првом рекорду</st>
+<st id='Folder'>Фасциклa</st>
+<st id='FTSlaves'>ФТ Извршивачи</st>
+<st id='GenesisServers'>Генесис Сервери</st>
+<st id='GetProcessorInformation'>Добавите Информације о Процесору</st>
+<st id='GetRoxieMetrics'>Добавите Информације о Роxие</st>
+<st id='GetSoftwareInformation'>Добавите Информације о софтверу</st>
+<st id='GetStorageInformation'>Добавите Информације о простору</st>
+<st id='Home'>Полазиште</st>
+<st id='Hours'>сати</st>
+<st id='Instance'>пример</st>
+<st id='InvalidFirstRows'>Погрешни подаци у пољу за прве редове</st>
+<st id='InvalidLastHours'>Погрешни подаци у пољу за последње сате</st>
+<st id='InvalidLastRows'>Погрешни подаци у пољу за последње редове</st>
+<st id='InvalidPageNumber'>Погрешни подаци у пољу за број странице</st>
+<st id='InvalidTime'>Погрешни подаци у пољу за Време</st>
 <st id='IPAddress'>IP Address</st>
 <st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
-<st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='LastHoursNotDefined'>Поље за последње сате није дефинисано</st>
+<st id='LastRowsNotDefined'>Поље за последње редове није дефинисано</st>
+<st id='LatestFirst'>Најновији Иде Први</st>
+<st id='LDAPServers'>ЛДАП Сервери</st>
+<st id='LoadingPleaseWait'>Молимо сачекајте ...</st>
+<st id='LocalFileSystemsOnly'>Само Локални Системи датотека</st>
+<st id='Location'>Локација</st>
+<st id='LogFile'>Лог датотека</st>
+<st id='LogDirectory'>Лог Директориј</st>
+<st id='LostReferenceToParentWindow'>Избубљна референца на главну страницу.  Молимо да поновите пут!</st>
+<st id='MachineInfo'>Информација о Машини</st>
+<st id='Major'>Главни</st>
+<st id='Mean'>Средњи</st>
+<st id='Metrics'>Метрика</st>
+<st id='Minor'>Миноран</st>
 <st id='Mins'>mins</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>МyСQЛ Сервери</st>
 <st id='NA'>N/A</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
-<st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
-<st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
-<st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
-<st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='Name'>Име</st>
+<st id='NetworkAddress'>Нетворк Адреса</st>
+<st id='NextPage'>Следећа Страница</st>
+<st id='NoClustersDefined'>Кластери нису дефинисани.</st>
+<st id='Nodes'>Чворови (Нодови)</st>
+<st id='NoItems'>Нема ништа</st>
+<st id='NoMachinesSelected'>Машине нису одабране!</st>
+<st id='Normal'>Нормалан</st>
+<st id='NoSystemServicesDefined'>Систем Сервиси нису дефинисани!</st>
+<st id='NoTargetClustersSelected'>Нисте одабрали кластер за изврсавање!</st>
+<st id='OrFirst'>или први</st>
+<st id='OrGoToPage'>или идите на страницу</st>
+<st id='OrLast'>или задња</st>
+<st id='OrLastPage'>или задња страница</st>
+<st id='OrTimeFrom'>или од времена</st>
+<st id='Page'>страна</st>
+<st id='PageNumberNotDefined'>поље за број странице није дефинисано</st>
+<st id='PhysicalMemory'>Физичка Меморија</st>
+<st id='Platform'>Платформа</st>
+<st id='Port'>Порт</st>
+<st id='PrevPage'>Претходна Страница</st>
+<st id='Processes'>Процеси</st>
+<st id='ProcessesDown'>Процеси су Заустављни</st>
+<st id='Protocol'>Протокол</st>
+<st id='Queue'>Ред</st>
+<st id='Ready'>Спреман</st>
+<st id='Recycling'>Рециклирање</st>
+<st id='Refresh'>Освежите</st>
+<st id='Rows'>редови</st>
+<st id='RoxieServer'>Роxие Сервер</st>
+<st id='SashaServers'>Саша Сервери</st>
+<st id='SchedulerProcess'>Процес за распоређивање послова</st>
+<st id='SecurityString'>Сигурносни Текст</st>
+<st id='Select'>Изаберите</st>
+<st id='SelectASpareNodeToSwap'>Изаберите резервни нод за замену</st>
+<st id='SelectAllOrNone'>Изаберите Све / Ништа</st>
+<st id='SelectAllTargetClusters'>Изаберите све кластере за извршавање</st>
+<st id='SelectDeselectAll'>Изаберите или поништите све</st>
+<st id='SelectDeselectAllMachines'>Изаберите или поништите све машине</st>
+<st id='SelectThisTargetCluster'>Изаберите овај кластер за извршавање</st>
+<st id='ServerProcess'>Сервер Процес</st>
+<st id='ServiceName'>Име Сервиса Name</st>
+<st id='ServiceType'>Тип Сервиса</st>
+<st id='ShowProcessesUsingFilter'>Покажите процесе помоћу филтера</st>
+<st id='Size'> Величина</st>
+<st id='SlaveNumber'>Број Извршивача</st>
+<st id='Starting'>Покретање</st>
+<st id='State'>Стање</st>
+<st id='Stopping'>Заустављање</st>
+<st id='Submit'>Поднесите</st>
+<st id='Suspended'>Суспендован</st>
+<st id='Swap'>Замените</st>
+<st id='SwapNode'>Замените Нод</st>
+<st id='SystemServers'>Систем Сервери</st>
+<st id='SystemServiceNodes'>Систем Сервис Нодови</st>
+<st id='TargetClusters'>Кластери за Извршавање</st>
+<st id='TimeNotDefined'>Временски Интервал није дефинисан</st>
+<st id='ThisPageFromByte'>ова страница од бyте</st>
+<st id='ThorMaster'>Тхор Мастер</st>
+<st id='ThorSlave'>Тхор Извршавач</st>
+<st id='ThorSlaves'>Тхор Извршавачи</st>
+<st id='ThorSpare'>Резервни Тхор</st>
+<st id='To'>у</st>
+<st id='ToByte'>у бyте</st>
+<st id='Total'>Тотал</st>
+<st id='TotalFileSize'>Укупна величина датотеке</st>
+<st id='UpdateMetricsNow'>Ажурирајте Метрику</st>
+<st id='UpTime'>Време Активног Рада</st>
+<st id='Unknown'>Непознат</st>
+<st id='ViewConfigurationFile'>Погледајте Конфигурациону Датотеку</st>
+<st id='ViewColumns'>Погледајте Колоне</st>
+<st id='ViewDetails'>Погледајте Детаље</st>
+<st id='ViewingPage'>Преглед странице</st>
+<st id='ViewLogFile'>Погледајте Лог Датотеку</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Упозорите ако је расположив простор на диску испод</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Упозорите ако је расположива меморија испод</st>
+<st id='WarnIfCPUUsageIsOver'>Упозорите ако је искориштеност процесора изнад</st>
+<st id='Warning'>Упозорење</st>
 </strings>
 </strings>
 </hpcc>
 </hpcc>

+ 0 - 30
esp/platform/espcfg.cpp

@@ -138,36 +138,6 @@ CEspConfig::CEspConfig(IProperties* inputs, IPropertyTree* envpt, IPropertyTree*
     m_options.frameTitle.set(m_cfg->queryProp("@name"));
     m_options.frameTitle.set(m_cfg->queryProp("@name"));
     m_options.slowProcessingTime = m_cfg->getPropInt("@slowProcessingTime", 30) * 1000; //in msec
     m_options.slowProcessingTime = m_cfg->getPropInt("@slowProcessingTime", 30) * 1000; //in msec
 
 
-#ifdef USE_ENV_CONF_FILE
-    // load environment parameters
-    StringBuffer envConfFile, envXMLFile;
-    const char* configFile = m_cfg->queryProp("EnvironmentConfFile");
-    if (configFile && *configFile)
-    {
-        envConfFile.append(configFile);
-    }
-    else
-    {
-        envConfFile.append("/etc/LexisNexis/environment.conf");
-    }
-    const char* envFromDali = m_cfg->queryProp("@environmentNotFromDali");
-    if (envFromDali && !stricmp(envFromDali, "true"))
-    {
-        const char* envXML = m_cfg->queryProp("EnvironmentXMLFile");
-        if (envXML && *envXML)
-        {
-            envXMLFile.append(envXML);
-        }
-        else
-        {
-            envXMLFile.append("environment.xml");
-        }
-    }
-
-    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
-    factory->createEnvironmentByFile(envConfFile.str(), envXMLFile.str());
-#endif
-
     if (!m_cfg->getProp("@name", m_process))
     if (!m_cfg->getProp("@name", m_process))
     {
     {
         ERRLOG("EspProcess name not found");
         ERRLOG("EspProcess name not found");

+ 90 - 99
esp/profiles/eclwatch.profile.js

@@ -1,107 +1,98 @@
-/**
- * This is the default application build profile used by the boilerplate. While it looks similar, this build profile
- * is different from the package build profile at `app/package.js` in the following ways:
- *
- * 1. you can have multiple application build profiles (e.g. one for desktop, one for tablet, etc.), but only one
- *    package build profile;
- * 2. the package build profile only configures the `resourceTags` for the files in the package, whereas the
- *    application build profile tells the build system how to build the entire application.
- *
- * Look to `util/build/buildControlDefault.js` for more information on available options and their default values.
- */
-
 var profile = {
 var profile = {
-    // `basePath` is relative to the directory containing this profile file; in this case, it is being set to the
-    // src/ directory, which is the same place as the `baseUrl` directory in the loader configuration. (If you change
-    // this, you will also need to update run.js.)
-    basePath: '../src/',
-
-    // This is the directory within the release directory where built packages will be placed. The release directory
-    // itself is defined by `build.sh`. You should probably not use this; it is a legacy option dating back to Dojo
-    // 0.4.
-    // If you do use this, you will need to update build.sh, too.
-    // releaseName: '',
-
-    // Builds a new release.
-    action: 'release',
-
-    // Strips all comments and whitespace from CSS files and inlines @imports where possible.
-    cssOptimize: 'comments',
-
-    // Excludes tests, demos, and original template files from being included in the built version.
+    basePath: "../src/",
+    action: "release",
+    layerOptimize: "closure",
+    optimize: "closure",
+    cssOptimize: "comments",
     mini: true,
     mini: true,
-
-    // Uses Closure Compiler as the JavaScript minifier. This can also be set to "shrinksafe" to use ShrinkSafe,
-    // though ShrinkSafe is deprecated and not recommended.
-    // This option defaults to "" (no compression) if not provided.
-    optimize: 'closure',
-
-    // We're building layers, so we need to set the minifier to use for those, too.
-    // This defaults to "shrinksafe" if not provided.
-    layerOptimize: 'closure',
-
-    // Strips all calls to console functions within the code. You can also set this to "warn" to strip everything
-    // but console.error, and any other truthy value to strip everything but console.warn and console.error.
-    // This defaults to "normal" (strip all but warn and error) if not provided.
-    stripConsole: 'all',
-
-    // The default selector engine is not included by default in a dojo.js build in order to make mobile builds
-    // smaller. We add it back here to avoid that extra HTTP request. There is also a "lite" selector available; if
-    // you use that, you will need to set the `selectorEngine` property in `app/run.js`, too. (The "lite" engine is
-    // only suitable if you are not supporting IE7 and earlier.)
-    selectorEngine: 'acme',
-
-    // Builds can be split into multiple different JavaScript files called "layers". This allows applications to
-    // defer loading large sections of code until they are actually required while still allowing multiple modules to
-    // be compiled into a single file.
-    layers: {
-        // This is the main loader module. It is a little special because it is treated like an AMD module even though
-        // it is actually just plain JavaScript. There is some extra magic in the build system specifically for this
-        // module ID.
-        'dojo/dojo': {
-            // In addition to the loader `dojo/dojo` and the loader configuration file `app/run`, we are also including
-            // the main application `app/main` and the `dojo/i18n` and `dojo/domReady` modules because, while they are
-            // all conditional dependencies in `app/main`, we do not want to have to make extra HTTP requests for such
-            // tiny files.
-            include: [ 'dojo/i18n', 'dojo/domReady', 'hpcc/stub' ],
-
-            // By default, the build system will try to include `dojo/main` in the built `dojo/dojo` layer, which adds
-            // a bunch of stuff we do not want or need. We want the initial script load to be as small and quick to
-            // load as possible, so we configure it as a custom, bootable base.
-            boot: true,
-            customBase: true
-        }//,
-
-        // In the demo application, we conditionally require `app/Dialog` on the client-side, so here we build a
-        // separate layer containing just that client-side code. (Practically speaking, you would probably just want
-        // to roll everything into a single layer, but this helps provide a basic illustration of multi-layer builds.)
-        // Note that when you create a new layer, the module referenced by the layer is always included in the layer
-        // (in this case, `app/Dialog`), so it does not need to be explicitly defined in the `include` array.
-        //'hpcc/Dialog': {}
+    stripConsole: "all",
+    selectorEngine: "lite",
+    
+    defaultConfig: {
+        hasCache: {
+            "dojo-built": 1,
+            "dojo-loader": 1,
+            "dom": 1,
+            "host-browser": 1,
+            "config-selectorEngine": "lite"
+        },
+        async: 1
     },
     },
 
 
-    // Providing hints to the build system allows code to be conditionally removed on a more granular level than
-    // simple module dependencies can allow. This is especially useful for creating tiny mobile builds.
-    // Keep in mind that dead code removal only happens in minifiers that support it! Currently, only Closure Compiler
-    // to the Dojo build system with dead code removal.
-    // A documented list of has-flags in use within the toolkit can be found at
-    // <http://dojotoolkit.org/reference-guide/dojo/has.html>.
     staticHasFeatures: {
     staticHasFeatures: {
-        // The trace & log APIs are used for debugging the loader, so we do not need them in the build.
-        'dojo-trace-api': 0,
-        'dojo-log-api': 0,
-
-        // This causes normally private loader data to be exposed for debugging. In a release build, we do not need
-        // that either.
-        'dojo-publish-privates': 0,
-
-        // This application is pure AMD, so get rid of the legacy loader.
-        'dojo-sync-loader': 0,
-
-        // `dojo-xhr-factory` relies on `dojo-sync-loader`, which we have removed.
-        'dojo-xhr-factory': 0,
+        "config-deferredInstrumentation": 0,
+        "config-dojo-loader-catches": 0,
+        "config-tlmSiblingOfDojo": 0,
+        "dojo-amd-factory-scan": 0,
+        "dojo-combo-api": 0,
+        "dojo-config-api": 1,
+        "dojo-config-require": 0,
+        "dojo-debug-messages": 0,
+        "dojo-dom-ready-api": 1,
+        "dojo-firebug": 0,
+        "dojo-guarantee-console": 1,
+        "dojo-has-api": 1,
+        "dojo-inject-api": 1,
+        "dojo-loader": 1,
+        "dojo-log-api": 0,
+        "dojo-modulePaths": 0,
+        "dojo-moduleUrl": 0,
+        "dojo-publish-privates": 0,
+        "dojo-requirejs-api": 0,
+        "dojo-sniff": 1,
+        "dojo-sync-loader": 0,
+        "dojo-test-sniff": 0,
+        "dojo-timeout-api": 0,
+        "dojo-trace-api": 0,
+        "dojo-undef-api": 0,
+        "dojo-v1x-i18n-Api": 1,
+        "dom": 1,
+        "host-browser": 1,
+        "extend-dojo": 1
+    },
 
 
-        // We are not loading tests in production, so we can get rid of some test sniffing code.
-        'dojo-test-sniff': 0
+    packages: [
+        'dojo',
+        'dijit',
+        'dojox',
+        'dgrid',
+        'put-selector',
+        'xstyle',
+        {
+            name: "d3",
+            location: "./d3",
+            trees: [
+                [".", ".", /(\/\.)|(~$)|(^((?!d3\.js).)*$)|(test|src|lib|bin)/]
+            ]
+        },
+        {
+            name: "topojson",
+            location: "./topojson",
+            trees: [
+                [".", ".", /(\/\.)|(~$)|(^((?!topojson\.js).)*$)|(test|examples|lib|bin)/]
+            ]
+        },
+        {
+            name: "hpcc",
+            location: "./eclwatch"
+        },
+        {
+            name: "templates",
+            location: "eclwatch/templates"
+        }
+    ],
+        
+    layers: {
+        "hpcc/hpcc": {
+            include: [ 
+                "hpcc/stub",
+                "hpcc/HPCCPlatformWidget",
+                "hpcc/ActivityWidget",
+                "hpcc/HPCCPlatformECLWidget",
+                "hpcc/WUQueryWidget"
+            ],
+            customBase: true,
+            boot: true
+        }
     }
     }
 };
 };

+ 11 - 2
esp/scm/ws_dfu.ecm

@@ -133,6 +133,14 @@ ESPStruct DFUSpaceItem
     string SmallestSize;
     string SmallestSize;
 };
 };
 
 
+ESPStruct DFUActionInfo
+{
+    string FileName;
+    string NodeGroup;
+    string ActionResult;
+    bool   Failed;
+};
+
 ESPrequest [nil_remove] DFUQueryRequest
 ESPrequest [nil_remove] DFUQueryRequest
 {
 {
     string Prefix;
     string Prefix;
@@ -236,7 +244,8 @@ DFUArrayActionResponse
 {
 {
     [min_ver("1.04")] string BackToPage;
     [min_ver("1.04")] string BackToPage;
     [min_ver("1.18")] string RedirectTo;
     [min_ver("1.18")] string RedirectTo;
-    string DFUArrayActionResult;
+    string DFUArrayActionResult; //used by legacy eclwatch
+    [min_ver("1.27")] ESParray<ESPstruct DFUActionInfo> ActionResults;
 };
 };
 
 
 ESPrequest 
 ESPrequest 
@@ -641,7 +650,7 @@ ESPresponse [exceptions_inline, nil_remove, http_encode(0)] DFUSearchDataRespons
 
 
 //  ===========================================================================
 //  ===========================================================================
 ESPservice [
 ESPservice [
-    version("1.26"), default_client_version("1.26"),
+    version("1.27"), default_client_version("1.27"),
     noforms, 
     noforms, 
     exceptions_inline("./smc_xslt/exceptions.xslt")] WsDfu
     exceptions_inline("./smc_xslt/exceptions.xslt")] WsDfu
 {
 {

+ 7 - 1
esp/scm/ws_workunits.ecm

@@ -985,6 +985,7 @@ ESPrequest [nil_remove] WUShowScheduledRequest
     string EventName("");
     string EventName("");
     string PushEventName("");
     string PushEventName("");
     string PushEventText("");
     string PushEventText("");
+    [min_ver("1.51")] string State("");
 };
 };
 
 
 ESPStruct [nil_remove] ScheduledWU
 ESPStruct [nil_remove] ScheduledWU
@@ -994,6 +995,9 @@ ESPStruct [nil_remove] ScheduledWU
     string EventName("");
     string EventName("");
     string EventText("");
     string EventText("");
     string JobName("");
     string JobName("");
+    [min_ver("1.51")] int StateID;
+    [min_ver("1.51")] string State("");
+    [min_ver("1.51")] string Owner("");
 };
 };
 
 
 ESPStruct [nil_remove] ServerInfo
 ESPStruct [nil_remove] ServerInfo
@@ -1259,6 +1263,8 @@ ESPrequest [nil_remove] WUListQueriesRequest
     [min_ver("1.48")] bool Activated;
     [min_ver("1.48")] bool Activated;
     [min_ver("1.48")] bool SuspendedByUser;
     [min_ver("1.48")] bool SuspendedByUser;
     [min_ver("1.50")] string WUID;
     [min_ver("1.50")] string WUID;
+    [min_ver("1.51")] string QueryID;
+    [min_ver("1.51")] string QueryName;
 
 
     nonNegativeInteger PageSize(0);
     nonNegativeInteger PageSize(0);
     nonNegativeInteger PageStartFrom(0);
     nonNegativeInteger PageStartFrom(0);
@@ -1555,7 +1561,7 @@ ESPresponse [exceptions_inline] WUCheckFeaturesResponse
 };
 };
 
 
 ESPservice [
 ESPservice [
-    version("1.50"), default_client_version("1.50"),
+    version("1.51"), default_client_version("1.51"),
     noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
     noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
 {
 {
     ESPmethod [resp_xsl_default("/esp/xslt/workunits.xslt")]     WUQuery(WUQueryRequest, WUQueryResponse);
     ESPmethod [resp_xsl_default("/esp/xslt/workunits.xslt")]     WUQuery(WUQueryRequest, WUQueryResponse);

+ 68 - 14
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1134,8 +1134,28 @@ bool CWsDfuEx::onAddtoSuperfile(IEspContext &context, IEspAddtoSuperfileRequest
     return true;
     return true;
 }
 }
 
 
+void CWsDfuEx::setDeleteFileResults(const char* fileName, const char* nodeGroup, bool failed, const char* actionResult, StringBuffer& resultString,
+    IArrayOf<IEspDFUActionInfo>& actionResults)
+{
+    if (!fileName || !*fileName)
+        return;
+    Owned<IEspDFUActionInfo> resultObj = createDFUActionInfo("", "");
+    resultObj->setFileName(fileName);
+    resultObj->setFailed(failed);
+    if (nodeGroup && *nodeGroup)
+        resultObj->setNodeGroup(nodeGroup);
+    if (actionResult && *actionResult)
+    {
+        resultObj->setActionResult(actionResult);
+        resultString.appendf("<Message><Value>%s</Value></Message>", actionResult);
+    }
+    actionResults.append(*resultObj.getClear());
+    return;
+}
+
 bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &req, IEspDFUArrayActionResponse &resp)
 bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &req, IEspDFUArrayActionResponse &resp)
 {
 {
+    double version = context.getClientVersion();
     StringBuffer username;
     StringBuffer username;
     context.getUserID(username);
     context.getUserID(username);
 
 
@@ -1149,17 +1169,29 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
     StringBuffer returnStr;
     StringBuffer returnStr;
 
 
     StringArray superFileNames, filesCannotBeDeleted;
     StringArray superFileNames, filesCannotBeDeleted;
+    IArrayOf<IEspDFUActionInfo> actionResults;
     for(int j = 0; j < 2; j++) //j=0: delete superfiles first
     for(int j = 0; j < 2; j++) //j=0: delete superfiles first
     {
     {
         for(unsigned i = 0; i < req.getLogicalFiles().length(); i++)
         for(unsigned i = 0; i < req.getLogicalFiles().length(); i++)
         {
         {
-            const char* filename = req.getLogicalFiles().item(i);
-            if(!filename || !*filename)
+            const char* fileNameAndNodeGroup = req.getLogicalFiles().item(i);
+            if(!fileNameAndNodeGroup || !*fileNameAndNodeGroup)
                 continue;
                 continue;
 
 
+            const char* fileName = NULL;
+            const char* nodeGroup = NULL;
+            StringArray fileNameOrNodeGroup;
+            fileNameOrNodeGroup.appendListUniq(fileNameAndNodeGroup, "@");
+            fileName = fileNameOrNodeGroup.item(0);
+            if (fileNameOrNodeGroup.length() > 1)
+            {
+                nodeGroup = fileNameOrNodeGroup.item(1);
+                if (!*nodeGroup || strieq(nodeGroup, "null")) //null is used by new ECLWatch for a superfile
+                    nodeGroup = NULL;
+            }
             if (j>0)
             if (j>0)
             { // 2nd pass, now we want to skip superfiles and the files which cannot do the lookup.
             { // 2nd pass, now we want to skip superfiles and the files which cannot do the lookup.
-                if (superFileNames.contains(filename) || filesCannotBeDeleted.contains(filename))
+                if (superFileNames.contains(fileNameAndNodeGroup) || filesCannotBeDeleted.contains(fileNameAndNodeGroup))
                     continue;
                     continue;
             }
             }
 
 
@@ -1167,11 +1199,17 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
             {
             {
                 IDistributedFileDirectory &fdir = queryDistributedFileDirectory();
                 IDistributedFileDirectory &fdir = queryDistributedFileDirectory();
                 {
                 {
-                    Owned<IDistributedFile> df = fdir.lookup(filename, userdesc, true);
+                    Owned<IDistributedFile> df = fdir.lookup(fileNameAndNodeGroup, userdesc, true);
                     if(!df)
                     if(!df)
                     {
                     {
-                        returnStr.appendf("<Message><Value>Cannot delete %s: file not found</Value></Message>", filename);
-                        filesCannotBeDeleted.append(filename);
+                        StringBuffer message;
+                        if (!nodeGroup || !*nodeGroup)
+                            message.appendf("Cannot delete %s: file not found", fileName);
+                        else
+                            message.appendf("Cannot delete %s on %s: file not found", fileName, nodeGroup);
+                        setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
+                        PROGLOG("Deleted Logical File: %s by: %s\n",fileNameAndNodeGroup, username.str());
+                        filesCannotBeDeleted.append(fileNameAndNodeGroup);
                         continue;
                         continue;
                     }
                     }
                     if (0==j) // skip non-super files on 1st pass
                     if (0==j) // skip non-super files on 1st pass
@@ -1179,33 +1217,49 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
                         if(!df->querySuperFile())
                         if(!df->querySuperFile())
                             continue;
                             continue;
 
 
-                        superFileNames.append(filename);
+                        superFileNames.append(fileNameAndNodeGroup);
                     }
                     }
                 }
                 }
-                fdir.removeEntry(filename, userdesc, NULL, REMOVE_FILE_SDS_CONNECT_TIMEOUT, true);
-                PROGLOG("Deleted Logical File: %s by: %s\n",filename, username.str());
-                returnStr.appendf("<Message><Value>Deleted File %s</Value></Message>", filename);
+                fdir.removeEntry(fileNameAndNodeGroup, userdesc, NULL, REMOVE_FILE_SDS_CONNECT_TIMEOUT, true);
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("File %s deleted", fileName);
+                else
+                    message.appendf("File %s deleted on %s", fileName, nodeGroup);
+                setDeleteFileResults(fileName, nodeGroup, false, message, returnStr, actionResults);
             }
             }
             catch(IException* e)
             catch(IException* e)
             {
             {
-                filesCannotBeDeleted.append(filename);
+                filesCannotBeDeleted.append(fileNameAndNodeGroup);
 
 
                 StringBuffer emsg;
                 StringBuffer emsg;
                 e->errorMessage(emsg);
                 e->errorMessage(emsg);
                 if((e->errorCode() == DFSERR_CreateAccessDenied) && (req.getType() != NULL))
                 if((e->errorCode() == DFSERR_CreateAccessDenied) && (req.getType() != NULL))
                     emsg.replaceString("Create ", "Delete ");
                     emsg.replaceString("Create ", "Delete ");
 
 
-                returnStr.appendf("<Message><Value>Cannot delete %s: %s</Value></Message>", filename, emsg.str());
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("Cannot delete %s: %s", fileName, emsg.str());
+                else
+                    message.appendf("Cannot delete %s on %s: %s", fileName, nodeGroup, emsg.str());
+                setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
                 e->Release();
                 e->Release();
             }
             }
             catch(...)
             catch(...)
             {
             {
-                returnStr.appendf("<Message><Value>Cannot delete %s: unknown exception.</Value></Message>", filename);
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("Cannot delete %s: unknown exception.", fileName);
+                else
+                    message.appendf("Cannot delete %s on %s: unknown exception.", fileName, nodeGroup);
+                setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
             }
             }
         }
         }
     }
     }
 
 
-    resp.setDFUArrayActionResult(returnStr.str());
+    if (version >= 1.27)
+        resp.setActionResults(actionResults);
+    resp.setDFUArrayActionResult(returnStr.str());//Used by legacy
     return true;
     return true;
 }
 }
 
 

+ 2 - 0
esp/services/ws_dfu/ws_dfuService.hpp

@@ -134,6 +134,8 @@ private:
         const char* beforeSubFile, bool existingSuperfile, bool autocreatesuper, bool deleteFile, bool removeSuperfile =  true);
         const char* beforeSubFile, bool existingSuperfile, bool autocreatesuper, bool deleteFile, bool removeSuperfile =  true);
     void getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
     void getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
         offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count);
         offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count);
+    void setDeleteFileResults(const char* fileName, const char* nodeGroup, bool failed, const char* message, StringBuffer& resultString,
+        IArrayOf<IEspDFUActionInfo>& actionResults);
 private:
 private:
     bool         m_disableUppercaseTranslation;
     bool         m_disableUppercaseTranslation;
     StringBuffer m_clusterName;
     StringBuffer m_clusterName;

+ 1 - 1
esp/services/ws_ecl/ws_ecl_service.cpp

@@ -302,7 +302,7 @@ bool CWsEclService::init(const char * name, const char * type, IPropertyTree * c
     }
     }
 
 
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
-    Owned<IConstEnvironment> environment = factory->openEnvironmentByFile();
+    Owned<IConstEnvironment> environment = factory->openEnvironment();
     Owned<IPropertyTree> pRoot = &environment->getPTree();
     Owned<IPropertyTree> pRoot = &environment->getPTree();
 
 
     xpath.clear().appendf("EspService[@name='%s']", name);
     xpath.clear().appendf("EspService[@name='%s']", name);

+ 0 - 4
esp/services/ws_fileio/ws_fileioservice.cpp

@@ -39,11 +39,7 @@ bool CWsFileIOEx::CheckServerAccess(const char* server, const char* relPath, Str
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
 
 
     Owned<IConstEnvironment> env;
     Owned<IConstEnvironment> env;
-#if 0
     env.setown(factory->openEnvironment());
     env.setown(factory->openEnvironment());
-#else
-    env.setown(factory->openEnvironmentByFile());
-#endif
 
 
     Owned<IPropertyTree> pEnvRoot = &env->getPTree();
     Owned<IPropertyTree> pEnvRoot = &env->getPTree();
     IPropertyTree* pEnvSoftware = pEnvRoot->queryPropTree("Software");
     IPropertyTree* pEnvSoftware = pEnvRoot->queryPropTree("Software");

+ 0 - 0
esp/services/ws_fs/ws_fsBinding.cpp


部分文件因为文件数量过多而无法显示