Jelajahi Sumber

Merge remote-tracking branch 'origin/candidate-3.10.x'

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 12 tahun lalu
induk
melakukan
332b56c543

+ 11 - 2
common/workunit/workunit.cpp

@@ -4240,11 +4240,20 @@ unsigned getEnvironmentClusterInfo(CConstWUClusterInfoArray &clusters)
     Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
     if (!conn)
         return 0;
-    Owned<IPropertyTreeIterator> clusterIter = conn->queryRoot()->getElements("Software/Topology/Cluster");
+
+    return getEnvironmentClusterInfo(conn->queryRoot(), clusters);
+}
+
+unsigned getEnvironmentClusterInfo(IPropertyTree* environmentRoot, CConstWUClusterInfoArray &clusters)
+{
+    if (!environmentRoot)
+        return 0;
+
+    Owned<IPropertyTreeIterator> clusterIter = environmentRoot->getElements("Software/Topology/Cluster");
     ForEach(*clusterIter)
     {
         IPropertyTree &node = clusterIter->query();
-        Owned<IConstWUClusterInfo> cluster = getTargetClusterInfo(conn->queryRoot(), &node);
+        Owned<IConstWUClusterInfo> cluster = getTargetClusterInfo(environmentRoot, &node);
         clusters.append(*cluster.getClear());
     }
     return clusters.ordinality();

+ 1 - 0
common/workunit/workunit.hpp

@@ -1150,6 +1150,7 @@ extern WORKUNIT_API bool validateTargetClusterName(const char *clustname);
 extern WORKUNIT_API IConstWUClusterInfo* getTargetClusterInfo(const char *clustname);
 typedef IArrayOf<IConstWUClusterInfo> CConstWUClusterInfoArray;
 extern WORKUNIT_API unsigned getEnvironmentClusterInfo(CConstWUClusterInfoArray &clusters);
+extern WORKUNIT_API unsigned getEnvironmentClusterInfo(IPropertyTree* environmentRoot, CConstWUClusterInfoArray &clusters);
 extern WORKUNIT_API void getRoxieProcessServers(const char *process, SocketEndpointArray &servers);
 
 

+ 1 - 0
ecl/eclcmd/eclcmd_common.hpp

@@ -66,6 +66,7 @@ typedef IEclCommand *(*EclCommandFactory)(const char *cmdname);
 
 #define ECLOPT_DONT_COPY_FILES "--no-files"
 
+#define ECLOPT_INACTIVE "--inactive"
 #define ECLOPT_NO_ACTIVATE "--no-activate"
 #define ECLOPT_ACTIVATE "--activate"
 #define ECLOPT_ACTIVATE_S "-A"

+ 16 - 1
ecl/eclcmd/queries/ecl-queries.cpp

@@ -84,11 +84,12 @@ private:
 #define QUERYLIST_SHOW_ACTIVE               0x02
 #define QUERYLIST_SHOW_SUSPENDED            0x04
 #define QUERYLIST_SHOW_CLUSTER_SUSPENDED    0x08
+#define QUERYLIST_SHOW_INACTIVE             (QUERYLIST_SHOW_UNFLAGGED | QUERYLIST_SHOW_SUSPENDED | QUERYLIST_SHOW_CLUSTER_SUSPENDED)
 
 class EclCmdQueriesList : public EclCmdCommon
 {
 public:
-    EclCmdQueriesList() : flags(0)
+    EclCmdQueriesList() : flags(0), optInactive(false)
     {
     }
     virtual bool parseCommandLineOptions(ArgvIterator &iter)
@@ -111,6 +112,8 @@ public:
                 continue;
             if (iter.matchOption(optTargetCluster, ECLOPT_TARGET)||iter.matchOption(optTargetCluster, ECLOPT_TARGET_S))
                 continue;
+            if (iter.matchFlag(optInactive, ECLOPT_INACTIVE))
+                continue;
             StringAttr temp;
             if (iter.matchOption(temp, ECLOPT_SHOW))
             {
@@ -144,6 +147,16 @@ public:
     }
     virtual bool finalizeOptions(IProperties *globals)
     {
+        if (optInactive)
+        {
+            if (flags)
+            {
+                fputs("--show and --inactive should not be used together.\n\n", stderr);
+                return false;
+            }
+
+            flags = QUERYLIST_SHOW_INACTIVE;
+        }
         if (!EclCmdCommon::finalizeOptions(globals))
             return false;
         return true;
@@ -261,6 +274,7 @@ public:
             "   <queryset>             name of queryset to get list of queries for\n"
             "   -t, --target=<val>     target cluster to get list of published queries for\n"
             "   --show=<flags>         show only queries with matching flags\n"
+            "   --inactive             show only queries that do not have an active alias\n"
             " Flags:\n"
             "   A                      query is active\n"
             "   S                      query is suspended in queryset\n"
@@ -274,6 +288,7 @@ private:
     StringAttr optTargetCluster;
     StringAttr optQuerySet;
     unsigned flags;
+    bool optInactive;
 };
 
 class EclCmdQueriesCopy : public EclCmdCommon

+ 146 - 122
ecl/hql/hqlutil.cpp

@@ -7358,6 +7358,7 @@ protected:
     bool expandAssignElement(IHqlExpression * expr);
 
     bool processElement(IHqlExpression * expr, IHqlExpression * parentSelector);
+    bool processFieldValue(IHqlExpression * optField, ITypeInfo * lhsType, IHqlExpression * rhs);
     bool processRecord(IHqlExpression * record, IHqlExpression * parentSelector);
 
     IHqlExpression * queryMatchingAssign(IHqlExpression * self, IHqlExpression * search);
@@ -7428,6 +7429,150 @@ IHqlExpression * ConstantRowCreator::queryMatchingAssign(IHqlExpression * self,
     throwUnexpected();
 }
 
+bool ConstantRowCreator::processFieldValue(IHqlExpression * optLhs, ITypeInfo * lhsType, IHqlExpression * rhs)
+{
+    size32_t lenLhs = lhsType->getStringLen();
+    size32_t sizeLhs  = lhsType->getSize();
+    node_operator rhsOp = rhs->getOperator();
+
+    switch (lhsType->getTypeCode())
+    {
+    case type_packedint:
+        if (!rhs->queryValue())
+            return false;
+        //MORE: Could handle this...
+        return false;
+    case type_set:
+        if (isNullList(rhs))
+        {
+            out.append(false);
+            rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
+            return true;
+        }
+        if (rhsOp == no_all)
+        {
+            out.append(true);
+            rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
+            return true;
+        }
+        if (rhsOp == no_list)
+        {
+            ITypeInfo * elemType = lhsType->queryChildType();
+            out.append(false);
+            unsigned patchOffset = out.length();
+            out.reserve(sizeof(size32_t));
+            const size_t startOffset = out.length();
+            ForEachChild(i, rhs)
+            {
+                if (!processFieldValue(NULL, elemType, rhs->queryChild(i)))
+                    return false;
+            }
+            const size_t setLength = out.length() - startOffset;
+            out.writeDirect(patchOffset, sizeof(size32_t), &setLength);
+            byte * patchPos = (byte *)out.bufferBase() + patchOffset;
+            rtlWriteSize32t(patchPos, setLength);
+            return true;
+        }
+        return false;
+    case type_row:
+        if (rhsOp == no_null)
+            return createConstantNullRow(out, queryOriginalRecord(lhsType));
+        if (rhsOp == no_createrow)
+            return createConstantRow(out, rhs->queryChild(0));
+        return false;
+    case type_dictionary:
+    case type_table:
+    case type_groupedtable:
+        {
+            assertex(optLhs);
+            IHqlExpression * field = optLhs->queryChild(1);
+            if (!field->hasProperty(countAtom) && !field->hasProperty(sizeofAtom))
+            {
+                if (rhsOp == no_null)
+                {
+                    if (field->hasProperty(_linkCounted_Atom))
+                    {
+                        rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
+                        memset(out.reserve(sizeof(byte * *)), 0, sizeof(byte * *));
+                    }
+                    else
+                        rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
+                    return true;
+                }
+                //MORE: Could expand if doesn't have linkcounted, but less likely these days.
+            }
+            return false;
+        }
+    }
+
+    if ((lenLhs != UNKNOWN_LENGTH) && (lenLhs > maxSensibleInlineElementSize))
+        return false;
+
+    OwnedHqlExpr castRhs = ensureExprType(rhs, lhsType);
+    IValue * castValue = castRhs->queryValue();
+    if (!castValue)
+        return false;
+    
+    if (optLhs && mapper)
+        mapper->setMapping(optLhs, castRhs);
+
+    ITypeInfo * castValueType = castValue->queryType();
+    size32_t lenValue = castValueType->getStringLen();
+    assertex(lenLhs == UNKNOWN_LENGTH || lenLhs == lenValue);
+
+    switch (lhsType->getTypeCode())
+    {
+    case type_boolean:
+    case type_int:
+    case type_swapint:
+    case type_real:
+    case type_decimal:
+        {
+            void * temp = out.reserve(sizeLhs);
+            castValue->toMem(temp);
+            return true;
+        }
+    case type_data:
+    case type_string:
+        {
+            if (lenLhs == UNKNOWN_LENGTH)
+                rtlWriteInt4(out.reserve(sizeof(size32_t)), lenValue);
+            castValue->toMem(out.reserve(lenValue));
+            return true;
+        }
+    case type_varstring:
+        {
+            //Move to else
+            if (sizeLhs == UNKNOWN_LENGTH)
+            {
+                void * target = out.reserve(lenValue+1);
+                castValue->toMem(target);
+            }
+            else
+            {
+                //Disabled for the moment to prevent the size of generated expressions getting too big.
+                if (sizeLhs > 40)
+                    return false;
+                void * target = out.reserve(sizeLhs);
+                memset(target, ' ', sizeLhs);   // spaces expand better in the c++
+                castValue->toMem(target);
+            }
+            return true;
+        }
+    case type_unicode:
+    case type_qstring:
+        {
+            if (lenLhs == UNKNOWN_LENGTH)
+                rtlWriteInt4(out.reserve(sizeof(size32_t)), lenValue);
+            castValue->toMem(out.reserve(castValueType->getSize()));
+            return true;
+        }
+    //MORE:
+    //type_varunicode
+    //type_packedint
+    }
+    return false;
+}
 
 bool ConstantRowCreator::processElement(IHqlExpression * expr, IHqlExpression * parentSelector)
 {
@@ -7457,128 +7602,7 @@ bool ConstantRowCreator::processElement(IHqlExpression * expr, IHqlExpression *
             if (!match || (match->getOperator() != no_assign))
                 return false;
 
-            ITypeInfo * lhsType = expr->queryType();
-            size32_t lenLhs = lhsType->getStringLen();
-            size32_t sizeLhs  = lhsType->getSize();
-            IHqlExpression * rhs = match->queryChild(1);
-            node_operator rhsOp = rhs->getOperator();
-
-            switch (lhsType->getTypeCode())
-            {
-            case type_packedint:
-                if (!rhs->queryValue())
-                    return false;
-                //MORE: Could handle this...
-                return false;
-            case type_set:
-                if (isNullList(rhs))
-                {
-                    out.append(false);
-                    rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
-                    return true;
-                }
-                if (rhsOp == no_all)
-                {
-                    out.append(true);
-                    rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
-                    return true;
-                }
-                return false;
-            case type_row:
-                if (rhsOp == no_null)
-                    return createConstantNullRow(out, queryOriginalRecord(lhsType));
-                if (rhsOp == no_createrow)
-                    return createConstantRow(out, rhs->queryChild(0));
-                return false;
-            case type_dictionary:
-            case type_table:
-            case type_groupedtable:
-                if (!expr->hasProperty(countAtom) && !expr->hasProperty(sizeofAtom))
-                {
-                    if (rhsOp == no_null)
-                    {
-                        if (expr->hasProperty(_linkCounted_Atom))
-                        {
-                            rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
-                            memset(out.reserve(sizeof(byte * *)), 0, sizeof(byte * *));
-                        }
-                        else
-                            rtlWriteSize32t(out.reserve(sizeof(size32_t)), 0);
-                        return true;
-                    }
-                    //MORE: Could expand if doesn't have linkcounted, but less likely these days.
-                }
-                return false;
-            }
-
-            if ((lenLhs != UNKNOWN_LENGTH) && (lenLhs > maxSensibleInlineElementSize))
-                return false;
-
-            OwnedHqlExpr castRhs = ensureExprType(rhs, lhsType);
-            IValue * castValue = castRhs->queryValue();
-            if (!castValue)
-                return false;
-            
-            IHqlExpression * lhs = match->queryChild(0);
-            if (mapper)
-                mapper->setMapping(lhs, castRhs);
-
-            ITypeInfo * castValueType = castValue->queryType();
-            size32_t lenValue = castValueType->getStringLen();
-            assertex(lenLhs == UNKNOWN_LENGTH || lenLhs == lenValue);
-
-            switch (lhsType->getTypeCode())
-            {
-            case type_boolean:
-            case type_int:
-            case type_swapint:
-            case type_real:
-            case type_decimal:
-                {
-                    void * temp = out.reserve(sizeLhs);
-                    castValue->toMem(temp);
-                    return true;
-                }
-            case type_data:
-            case type_string:
-                {
-                    if (lenLhs == UNKNOWN_LENGTH)
-                        rtlWriteInt4(out.reserve(sizeof(size32_t)), lenValue);
-                    castValue->toMem(out.reserve(lenValue));
-                    return true;
-                }
-            case type_varstring:
-                {
-                    //Move to else
-                    if (sizeLhs == UNKNOWN_LENGTH)
-                    {
-                        void * target = out.reserve(lenValue+1);
-                        castValue->toMem(target);
-                    }
-                    else
-                    {
-                        //Disabled for the moment to prevent the size of generated expressions getting too big.
-                        if (sizeLhs > 40)
-                            return false;
-                        void * target = out.reserve(sizeLhs);
-                        memset(target, ' ', sizeLhs);   // spaces expand better in the c++
-                        castValue->toMem(target);
-                    }
-                    return true;
-                }
-            case type_unicode:
-            case type_qstring:
-                {
-                    if (lenLhs == UNKNOWN_LENGTH)
-                        rtlWriteInt4(out.reserve(sizeof(size32_t)), lenValue);
-                    castValue->toMem(out.reserve(castValueType->getSize()));
-                    return true;
-                }
-            //MORE:
-            //type_varunicode
-            //type_packedint
-            }
-            return false;
+            return processFieldValue(match->queryChild(0), expr->queryType(), match->queryChild(1));
         }
     default:
         return true;

+ 1 - 6
esp/files/scripts/configmgr/configmgr.js

@@ -938,14 +938,9 @@ function handleConfigCellClickEvent(oArgs, caller, isComplex) {
 
     if ((record.getData('compType') == 'EspProcess' || record.getData('compType') == "DaliServerProcess") && (record.getData('params').indexOf('subType=EspBinding') != -1 || record.getData('_key') == "ldapServer") && (typeof(column.field) !== 'undefined' && (column.field == 'service' || column.field == 'value')))
     {
-      bUpdateFilesBasedn = confirm("If available, proceed with update of filesBasedn value?\n\n(If you are unsure select 'Ok')");
       if (column.field == 'service')
         refreshConfirm = false;
     }
-    else if (record.getData('compType') == 'LDAPServerProcess' && record.getData('name') == 'filesBasedn')
-      bUpdateFilesBasedn = confirm("If available, proceed with update of filesBasedn value in dependent components?\n\n(If you are unsure select 'Ok')");
-    else
-      bUpdateFilesBasedn = false;
 
     var xmlArgs = argsToXml(category, params, attrName, oldValue, newValue, recordIndex + 1, record.getData(column.key + '_onChange'));
     YAHOO.util.Connect.asyncRequest('POST', '/WsDeploy/SaveSetting', {
@@ -1067,7 +1062,7 @@ function handleConfigCellClickEvent(oArgs, caller, isComplex) {
       },
       scope: this
     },
-    top.document.navDT.getFileName(true) + 'XmlArgs=' + xmlArgs + '&bUpdateFilesBasedn='  + bUpdateFilesBasedn);
+    top.document.navDT.getFileName(true) + 'XmlArgs=' + xmlArgs);
   };
 
   if (typeof (caller.editors) === 'undefined') {

+ 0 - 1
esp/scm/WsDeploy.ecm

@@ -137,7 +137,6 @@ ESPresponse [exceptions_inline, encode(0)] DisplaySettingsResponse
 ESPrequest SaveSettingRequest
 {
     string XmlArgs;
-    bool bUpdateFilesBasedn;
     ESPstruct WsDeployReqInfo ReqInfo;
 };
 

+ 0 - 124
esp/services/WsDeploy/WsDeployService.cpp

@@ -993,7 +993,6 @@ bool CWsDeployFileInfo::saveSetting(IEspContext &context, IEspSaveSettingRequest
   checkForRefresh(context, &req.getReqInfo(), true);
 
   const char* xmlArg = req.getXmlArgs();
-  bool bUpdateFilesBasedn = req.getBUpdateFilesBasedn();
   Owned<IPropertyTree> pEnvRoot = &m_Environment->getPTree();
   IPropertyTree* pEnvSoftware = pEnvRoot->queryPropTree(XML_TAG_SOFTWARE);
   IPropertyTree* pEnvHardware = pEnvRoot->queryPropTree(XML_TAG_HARDWARE);
@@ -1273,129 +1272,6 @@ bool CWsDeployFileInfo::saveSetting(IEspContext &context, IEspSaveSettingRequest
         }
       }
 
-      if (bUpdateFilesBasedn == true && strcmp(pszAttrName, TAG_LDAPSERVER) == 0 && strcmp(pszCompType, XML_TAG_DALISERVERPROCESS) == 0 && pComp != NULL)
-      {
-        Owned<IPropertyTree> pActiveEnvRoot = getEnvTree(context, &req.getReqInfo());
-
-        StringBuffer ldapXPath;
-        StringBuffer strFilesBasedn;
-
-        if (pszNewValue && *pszNewValue)
-        {
-          ldapXPath.appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_LDAPSERVERPROCESS, XML_ATTR_NAME, pszNewValue);
-          strFilesBasedn.appendf("%s",pActiveEnvRoot->queryPropTree(ldapXPath.str())->queryProp(XML_ATTR_FILESBASEDN));
-        }
-
-        pComp->setProp(XML_ATTR_FILESBASEDN,strFilesBasedn);
-      }
-      else if (bUpdateFilesBasedn == true && pComp != NULL && strcmp(pszCompType, XML_TAG_ESPPROCESS) == 0 && strcmp(pszAttrName, TAG_SERVICE) == 0 && pszNewValue && *pszNewValue)
-      {
-        Owned<IPropertyTree> pActiveEnvRoot = getEnvTree(context, &req.getReqInfo());
-
-        StringBuffer ldapXPath;
-        StringBuffer espServiceXPath;
-        StringBuffer espProcessXPath;
-        StringBuffer strFilesBasedn;
-
-        espServiceXPath.appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, pszNewValue);
-        espProcessXPath.appendf("./%s/%s/[%s=\"%s\"]/%s", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_ATTR_NAME, pszCompName, XML_TAG_AUTHENTICATION);
-
-        StringBuffer strLDAPName(pActiveEnvRoot->queryPropTree(espProcessXPath.str())->queryProp(XML_ATTR_LDAPSERVER));
-
-        if (strLDAPName.length() > 0)
-        {
-          ldapXPath.appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_LDAPSERVERPROCESS, XML_ATTR_NAME, strLDAPName.str());
-          strFilesBasedn.appendf("%s", pActiveEnvRoot->queryPropTree(ldapXPath.str())->queryProp(XML_ATTR_FILESBASEDN));
-        }
-        pActiveEnvRoot->queryPropTree(espServiceXPath.str())->setProp(XML_ATTR_FILESBASEDN, strFilesBasedn);
-      }
-      else if (bUpdateFilesBasedn == true && strcmp(pszAttrName, TAG_LDAPSERVER) == 0 && strcmp(pszCompType, XML_TAG_ESPPROCESS) == 0 && pComp != NULL)
-      {
-        Owned<IPropertyTree> pActiveEnvRoot = getEnvTree(context, &req.getReqInfo());
-
-        StringBuffer ldapXPath;
-        StringBuffer espBindingXPath;
-        StringBuffer espProcessXPath;
-        StringBuffer strFilesBasedn;
-
-        if (pszNewValue != NULL && *pszNewValue != 0)
-        {
-          ldapXPath.appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_LDAPSERVERPROCESS, XML_ATTR_NAME, pszNewValue);
-          strFilesBasedn.appendf("%s",pActiveEnvRoot->queryPropTree(ldapXPath.str())->queryProp(XML_ATTR_FILESBASEDN));
-        }
-
-        espBindingXPath.appendf("./%s/%s[%s=\"%s\"]/%s", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS, XML_ATTR_NAME, pszCompName, XML_TAG_ESPBINDING);
-
-        Owned<IPropertyTreeIterator> iterItems = pActiveEnvRoot->getElements(espBindingXPath.str());
-
-        ForEach(*iterItems)
-        {
-          IPropertyTree *pItem = &iterItems->query();
-          const char* service_name = pItem->queryProp(XML_ATTR_SERVICE);
-
-          espProcessXPath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, service_name);
-
-          const char* service_type = pActiveEnvRoot->queryPropTree(espProcessXPath.str())->queryProp(XML_ATTR_BUILDSET);
-
-          if (service_type && *service_type && !strcmp(service_type, "espsmc"))
-            pActiveEnvRoot->queryPropTree(espProcessXPath.str())->setProp(XML_ATTR_FILESBASEDN, strFilesBasedn);
-        }
-      }
-      // Update of LDAP component filesBasedn
-      else if (bUpdateFilesBasedn == true && strcmp(pszAttrName, TAG_FILESBASEDN) == 0 && strcmp(pszCompType, XML_TAG_LDAPSERVERPROCESS) == 0 && pszCompName != NULL && pszNewValue != NULL)
-      {
-        // update dali
-        StringBuffer daliProcessXPath;
-        daliProcessXPath.appendf("./%s/%s", XML_TAG_SOFTWARE, XML_TAG_DALISERVERPROCESS);
-
-        Owned<IPropertyTree> pActiveEnvRoot = getEnvTree(context, &req.getReqInfo());
-        Owned<IPropertyTreeIterator> iterItems = pActiveEnvRoot->getElements(daliProcessXPath.str());
-
-        ForEach(*iterItems)
-        {
-          IPropertyTree *pItem = &iterItems->query();
-          const char* ldap_server = pItem->queryProp(XML_ATTR_LDAPSERVER);
-
-          // check if dali has this ldap server assigned before changing filesBasedn
-          if (ldap_server != NULL && strcmp(ldap_server, pszCompName) == 0)
-            pItem->setProp(XML_ATTR_FILESBASEDN, pszNewValue);
-        }
-
-        //update esp services
-        StringBuffer espProcessXPath;
-        StringBuffer espBindingXPath;
-        StringBuffer espServiceXPath;
-
-        espProcessXPath.appendf("./%s/%s", XML_TAG_SOFTWARE, XML_TAG_ESPPROCESS);
-        Owned<IPropertyTreeIterator> iterItems2 = pActiveEnvRoot->getElements(espProcessXPath.str());
-
-        ForEach(*iterItems2)
-        {
-          IPropertyTree *pItem = &iterItems2->query();
-          const char* ldap_server = pItem->queryPropTree(XML_TAG_AUTHENTICATION)->queryProp(XML_ATTR_LDAPSERVER);
-
-          if (ldap_server != NULL && strcmp(ldap_server, pszCompName) == 0)
-          {
-            espBindingXPath.clear().appendf("%s[%s=\"%s\"]/%s", espProcessXPath.str(), XML_ATTR_NAME, pItem->queryProp(XML_ATTR_NAME), XML_TAG_ESPBINDING);
-
-            Owned<IPropertyTreeIterator> iterItems3 = pActiveEnvRoot->getElements(espBindingXPath.str());
-
-            ForEach(*iterItems3)
-            {
-              IPropertyTree *pItem = &iterItems3->query();
-              const char* service_name = pItem->queryProp(XML_ATTR_SERVICE);
-
-              espServiceXPath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, service_name);
-
-              const char* service_type = pActiveEnvRoot->queryPropTree(espServiceXPath.str())->queryProp(XML_ATTR_BUILDSET);
-
-              if (service_type && *service_type && !strcmp(service_type, "espsmc"))
-                pActiveEnvRoot->queryPropTree(espServiceXPath.str())->setProp(XML_ATTR_FILESBASEDN, pszNewValue);
-            }
-          }
-        }
-      }
-
       if (!pComp)
         throw MakeStringException(-1, "No such component in environment: '%s' named '%s'.", pszCompType, pszCompName);
       else

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

@@ -493,12 +493,17 @@ bool CWsSMCEx::onActivity(IEspContext &context, IEspActivityRequest &req, IEspAc
         SecAccessFlags access;
         bool fullAccess=(context.authorizeFeature(THORQUEUE_FEATURE, access) && access>=SecAccess_Full);
 
+        Owned<IRemoteConnection> connEnv = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
+        IPropertyTree* envRoot = connEnv->queryRoot();
+        if (!envRoot)
+            throw MakeStringException(ECLWATCH_CANNOT_GET_ENV_INFO,"Failed to get environment information.");
+
         IArrayOf<IEspThorCluster> ThorClusters;
         IArrayOf<IEspHThorCluster> HThorClusters;
         IArrayOf<IEspRoxieCluster> RoxieClusters;
 
         CConstWUClusterInfoArray clusters;
-        getEnvironmentClusterInfo(clusters);
+        getEnvironmentClusterInfo(envRoot, clusters);
         ForEachItemIn(c, clusters)
         {
             IConstWUClusterInfo &cluster = clusters.item(c);
@@ -593,7 +598,7 @@ bool CWsSMCEx::onActivity(IEspContext &context, IEspActivityRequest &req, IEspAc
         IArrayOf<IEspServerJobQueue> serverJobQueues;
         IArrayOf<IConstTpEclServer> eclccservers;
         CTpWrapper dummy;
-        dummy.getTpEclCCServers(eclccservers);
+        dummy.getTpEclCCServers(envRoot->queryBranch("Software"), eclccservers);
         ForEachItemIn(x1, eclccservers)
         {
             IConstTpEclServer& eclccserver = eclccservers.item(x1);
@@ -634,13 +639,9 @@ bool CWsSMCEx::onActivity(IEspContext &context, IEspActivityRequest &req, IEspAc
             }
         }
 
-        Owned<IPropertyTree> pEnvRoot = dummy.getEnvironment("");
-        if (!pEnvRoot)
-            throw MakeStringException(ECLWATCH_CANNOT_GET_ENV_INFO,"Failed to get environment information.");
-
         StringBuffer dirxpath;
-        dirxpath.append("Software/DfuServerProcess");
-        Owned<IPropertyTreeIterator> services = pEnvRoot->getElements(dirxpath);
+        dirxpath.appendf("Software/%s", eqDfu);
+        Owned<IPropertyTreeIterator> services = envRoot->getElements(dirxpath);
 
         if (services->first())
         {

+ 11 - 11
esp/smc/SMCLib/TpWrapper.cpp

@@ -288,20 +288,20 @@ void CTpWrapper::getTpEclServers(IArrayOf<IConstTpEclServer>& list)
 
 void CTpWrapper::getTpEclCCServers(IArrayOf<IConstTpEclServer>& list, const char* serverName)
 {
-    DBGLOG("CTpWrapper::getTpEclServers()");
-#if 0
-    Owned<IRemoteConnection> conn = querySDS().connect( "/Environment/Software", myProcessSession(), 
-                                                        RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
-        throw MakeStringException(0,"Failed to get environment information.");
-    IPropertyTree* root = conn->queryRoot();
-#else
     Owned<IPropertyTree> root = getEnvironment("Software");
-#endif
     if (!root)
         throw MakeStringExceptionDirect(ECLWATCH_CANNOT_GET_ENV_INFO, MSG_FAILED_GET_ENVIRONMENT_INFO);
 
-    Owned<IPropertyTreeIterator> services= root->getElements(eqEclCCServer);
+    getTpEclCCServers(root, list, serverName);
+    return;
+}
+
+void CTpWrapper::getTpEclCCServers(IPropertyTree* environmentSoftware, IArrayOf<IConstTpEclServer>& list, const char* serverName)
+{
+    if (!environmentSoftware)
+        return;
+
+    Owned<IPropertyTreeIterator> services= environmentSoftware->getElements(eqEclCCServer);
     ForEach(*services)
     {
         IPropertyTree& serviceTree = services->query();
@@ -317,7 +317,7 @@ void CTpWrapper::getTpEclCCServers(IArrayOf<IConstTpEclServer>& list, const char
         pService->setBuild(serviceTree.queryProp("@build"));
 
         StringBuffer tmpDir;
-        if (getConfigurationDirectory(root->queryPropTree("Directories"), "log", "eclccserver", name, tmpDir))
+        if (getConfigurationDirectory(environmentSoftware->queryPropTree("Directories"), "log", "eclccserver", name, tmpDir))
         {
             pService->setLogDirectory( tmpDir.str() );
         }

+ 1 - 0
esp/smc/SMCLib/TpWrapper.hpp

@@ -166,6 +166,7 @@ public:
     void getTpDaliServers(IArrayOf<IConstTpDali>& list);
     void getTpEclServers(IArrayOf<IConstTpEclServer>& ServiceList);
     void getTpEclCCServers(IArrayOf<IConstTpEclServer>& ServiceList, const char* name = NULL);
+    void getTpEclCCServers(IPropertyTree* environmentSoftware, IArrayOf<IConstTpEclServer>& ServiceList, const char* name = NULL);
     void getTpEclAgents(IArrayOf<IConstTpEclAgent>& list, const char* name = NULL);
     void getTpEclSchedulers(IArrayOf<IConstTpEclScheduler>& ServiceList, const char* name = NULL);
     void getTpEspServers(IArrayOf<IConstTpEspServer>& list);

+ 3 - 5
initfiles/componentfiles/configxml/@temp/esp_service_WsSMC.xsl

@@ -561,12 +561,10 @@ This is required by its binding with ESP service '<xsl:value-of select="$espServ
         <EspService name="{$serviceName}" type="{$serviceType}" plugin="{$servicePlugin}">
             <xsl:variable name="ldapservername" select="$bindingNode/../Authentication/@ldapServer"/>
             <xsl:choose>
-                <xsl:when test="string(@filesBasedn) != ''">
-                    <Files basedn="{@filesBasedn}"/>
+                <xsl:when test="$ldapservername != ''">
+                <xsl:variable name="filesbasedn" select="/Environment/Software/LDAPServerProcess[@name=$ldapservername]/@filesBasedn"/>
+                <Files basedn="{$filesbasedn}"/>
                 </xsl:when>
-                <xsl:otherwise>
-                    <Files basedn="ou=Files,ou=ecl"/>
-                </xsl:otherwise>
             </xsl:choose>
             <Resources>
                 <xsl:for-each select="../EspProcess[Authentication/@ldapServer=$ldapservername]/EspBinding">

+ 0 - 7
initfiles/componentfiles/configxml/dali.xsd

@@ -327,13 +327,6 @@
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
-    <xs:attribute name="filesBasedn" type="xs:string" use="required" default="ou=Files,ou=ecl">
-      <xs:annotation>
-        <xs:appinfo>
-          <tooltip>base location for ldap file scopes</tooltip>
-        </xs:appinfo>
-      </xs:annotation>
-    </xs:attribute>
     <xs:attribute name="filesDefaultUser" use="optional" type="xs:string">
       <xs:annotation>
         <xs:appinfo>

+ 4 - 1
initfiles/componentfiles/configxml/dali.xsl

@@ -259,8 +259,11 @@
         </xsl:element>
         <xsl:if test="string(@ldapServer) != ''">
           <xsl:element name="ldapSecurity">
-            <xsl:copy-of select="@ldapProtocol | @authMethod | @maxConnections | @workunitsBasedn | @filesBasedn | @filesDefaultUser | @filesDefaultPassword"/>
+            <xsl:copy-of select="@ldapProtocol | @authMethod | @maxConnections | @workunitsBasedn | @filesDefaultUser | @filesDefaultPassword"/>
             <xsl:variable name="ldapServerName" select="@ldapServer"/>
+            <xsl:attribute name="filesBasedn">
+                <xsl:value-of select="/Environment/Software/LDAPServerProcess[@name=$ldapServerName]/@filesBasedn"/>
+            </xsl:attribute>
             <xsl:variable name="ldapServerNode" select="/Environment/Software/LDAPServerProcess[@name=$ldapServerName]"/>
             <xsl:if test="not($ldapServerNode)">
               <xsl:message terminate="yes">

+ 0 - 7
initfiles/componentfiles/configxml/espsmcservice.xsd.in

@@ -62,13 +62,6 @@
                     </xs:appinfo>
                 </xs:annotation>
             </xs:attribute>
-            <xs:attribute name="filesBasedn" type="xs:string" use="optional" default="ou=Files,ou=ecl">
-                <xs:annotation>
-                    <xs:appinfo>
-                        <tooltip>base location for ldap file scopes</tooltip>
-                    </xs:appinfo>
-                </xs:annotation>
-            </xs:attribute>
             <xs:attribute name="pluginsPath" type="relativePath" use="optional" default="${PLUGINS_PATH}">
                 <xs:annotation>
                     <xs:appinfo>

+ 0 - 2
initfiles/etc/DIR_NAME/environment.xml.in

@@ -320,7 +320,6 @@
   <DaliServerProcess build="${projname}_${version}-${stagever}"
                      buildSet="dali"
                      environment="${CONFIG_DIR}/${ENV_XML_FILE}"
-                     filesBasedn="ou=Files,ou=ecl"
                      name="mydali"
                      recoverFromIncErrors="true">
    <Instance computer="localhost"
@@ -596,7 +595,6 @@
               name="EclWatch"
               pluginsPath="${PLUGINS_PATH}"
               syntaxCheckQueue=""
-              filesBasedn="ou=Files,ou=ecl"
               viewTimeout="1000"
               warnIfCpuLoadOver="95"
               warnIfFreeMemoryUnder="5"

+ 2 - 2
system/jlib/javahash.tpp

@@ -33,7 +33,7 @@ void JavaHashTableOf<ELEMENT>::onRemove(void * et)
 template <class ELEMENT>
 bool JavaHashTableOf<ELEMENT>::addOwn(ELEMENT & donor)
 {
-    if(add(donor))
+    if(this->add(donor))
     {
         donor.Release();
         return true;
@@ -44,7 +44,7 @@ bool JavaHashTableOf<ELEMENT>::addOwn(ELEMENT & donor)
 template <class ELEMENT>
 bool JavaHashTableOf<ELEMENT>::replaceOwn(ELEMENT & donor)
 {
-    if(replace(donor))
+    if(this->replace(donor))
     {
         donor.Release();
         return true;

+ 32 - 0
testing/ecl/bug8688.ecl

@@ -0,0 +1,32 @@
+/*##############################################################################
+
+    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.
+############################################################################## */
+
+idRecord :=
+            RECORD
+unsigned        id;
+set of string   names;
+set of string2  codes;
+set of integer3 values;
+    END;
+    
+idDs := dataset([
+        {1,['Gavin'],['AZ','ZZ'],[1,2,3]},
+        {2,[],ALL,ALL},
+        {3,['Gavin','Jim','John'],['AAA','BBB'],[256*256*256-1,256*256*256,256*256*256+1]}, // test truncation
+        {0,[],[],[]}], idRecord);
+
+output(idDs);

+ 6 - 0
testing/ecl/key/bug8688.xml

@@ -0,0 +1,6 @@
+<Dataset name='Result 1'>
+ <Row><id>1</id><names><Item>Gavin</Item></names><codes><Item>AZ</Item><Item>ZZ</Item></codes><values><Item>1</Item><Item>2</Item><Item>3</Item></values></Row>
+ <Row><id>2</id><names></names><codes><All/></codes><values><All/></values></Row>
+ <Row><id>3</id><names><Item>Gavin</Item><Item>Jim</Item><Item>John</Item></names><codes><Item>AA</Item><Item>BB</Item></codes><values><Item>-1</Item><Item>0</Item><Item>1</Item></values></Row>
+ <Row><id>0</id><names></names><codes></codes><values></values></Row>
+</Dataset>