osaf/services/saf/immsv/immnd/ImmModel.cc |  101 +++++++++++++++++++++++++++++-
 osaf/services/saf/immsv/immnd/ImmModel.hh |    4 +
 2 files changed, 103 insertions(+), 2 deletions(-)


diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -9209,6 +9209,34 @@ ImmModel::filterMatch(ObjectInfo* obj, I
     return j->second->hasMatchingValue(tmpos);
 }
 
+bool
+ImmModel::noDanglingRefExist(ObjectInfo *obj, const char *noDanglingRef)
+{
+    ImmAttrValueMap::iterator avmi;
+    ImmAttrValue *av;
+    AttrMap::iterator ami = obj->mClassInfo->mAttrMap.begin();
+    for(; ami != obj->mClassInfo->mAttrMap.end(); ++ami) {
+        if(ami->second->mFlags & SA_IMM_ATTR_NO_DANGLING) {
+            avmi = obj->mAttrValueMap.find(ami->first);
+            osafassert(avmi != obj->mAttrValueMap.end());
+            av = avmi->second;
+            while(av) {
+                if(av->getValueC_str() && !strcmp(av->getValueC_str(), 
noDanglingRef)) {
+                    return true;
+                }
+
+                if(av->isMultiValued()) {
+                    av = ((ImmAttrMultiValue *)av)->getNextAttrValue();
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
 SaAisErrorT
 ImmModel::searchInitialize(ImmsvOmSearchInit* req, ImmSearchOp& op)
 {
@@ -9224,9 +9252,19 @@ ImmModel::searchInitialize(ImmsvOmSearch
     ObjectInfo* obj = NULL;
     ObjectMap::iterator omi;
     ObjectSet::iterator osi;
+    bool noDanglingSearch = req->searchOptions & 
SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS;
+    ObjectInfo* refObj = NULL;
+    ObjectMMap::iterator ommi = sReverseRefsNoDanglingMMap.end();
+    std::string refObjectName;
     SaUint32T childCount=0;
     
     if(scope == SA_IMM_ONE) {
+        if(noDanglingSearch) {
+             LOG_NO("ERR_INVALID_PARAM: SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS "
+                     "flag cannot be used with SA_IMM_ONE scope");
+             return SA_AIS_ERR_INVALID_PARAM;
+        }
+
         return this->accessorGet(req, op);
     }
     
@@ -9245,7 +9283,8 @@ ImmModel::searchInitialize(ImmsvOmSearch
           SA_IMM_SEARCH_GET_SOME_ATTR |
           SA_IMM_SEARCH_GET_CONFIG_ATTR |
           SA_IMM_SEARCH_PERSISTENT_ATTRS |
-          SA_IMM_SEARCH_SYNC_CACHED_ATTRS);
+          SA_IMM_SEARCH_SYNC_CACHED_ATTRS |
+          SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS);
 
     if(unknownOptions) {
         LOG_NO("ERR_INVALID_PARAM: invalid search option 0x%llx",
@@ -9372,6 +9411,51 @@ ImmModel::searchInitialize(ImmsvOmSearch
             */
             osafassert(nameToInternal(objectName));
         }
+    } else if(noDanglingSearch) {
+        // Validate parameters for searching no dangling references
+        if(req->searchParam.choice.oneAttrParam.attrName.size != 0) {
+            LOG_NO("ERR_INVALID_PARAM: attrName must be NULL "
+                    "when SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS flag is set");
+            err = SA_AIS_ERR_INVALID_PARAM;
+            goto searchInitializeExit;
+        }
+        if(req->searchParam.choice.oneAttrParam.attrValueType != 
SA_IMM_ATTR_SANAMET &&
+                req->searchParam.choice.oneAttrParam.attrValueType != 
SA_IMM_ATTR_SASTRINGT) {
+            LOG_NO("ERR_INVALID_PARAM: attrValueType must be type of SaNameT 
or SaStringT "
+                   "when SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS flag is set");
+            err = SA_AIS_ERR_INVALID_PARAM;
+            goto searchInitializeExit;
+        }
+
+        refObjectName = 
std::string(req->searchParam.choice.oneAttrParam.attrValue.val.x.buf,
+                
strnlen(req->searchParam.choice.oneAttrParam.attrValue.val.x.buf,
+                        
req->searchParam.choice.oneAttrParam.attrValue.val.x.size));
+
+        omi = sObjectMap.find(refObjectName);
+        if(omi == sObjectMap.end() || (omi->second->mObjFlags & 
IMM_CREATE_LOCK)) {
+            LOG_NO("ERR_INVALID_PARAM: attrValue contains a DN of non-existing 
object %s",
+                       refObjectName.c_str());
+            err = SA_AIS_ERR_INVALID_PARAM;
+            goto searchInitializeExit;
+        }
+
+        // Set initialize variables
+        refObj = omi->second;
+        omi = sObjectMap.end();
+
+        ommi = sReverseRefsNoDanglingMMap.find(refObj);
+        while(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == 
refObj &&
+                !noDanglingRefExist(ommi->second, refObjectName.c_str())) {
+            ++ommi;
+        }
+
+        if(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == refObj) {
+            obj = ommi->second;
+            getObjectName(obj, objectName);
+        } else {
+            // There is no any match
+            goto searchInitializeExit;
+        }
     } else {
         if(childCount > 1) {
             /* A root was provided and it has children => Initialize */
@@ -9392,8 +9476,10 @@ ImmModel::searchInitialize(ImmsvOmSearch
     
     // Find root object and all sub objects to the root object.
     // Source set is either (a) entire object-map or (b) class extent set
+    // or (c) set of no-dangling dependents on refObj
     while(err==SA_AIS_OK && (omi != sObjectMap.end() || 
-            (classInfo && osi != classInfo->mExtent.end()))) {
+            (classInfo && osi != classInfo->mExtent.end()) ||
+            (ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == 
refObj))) {
 
         /*Skip pending creates.*/
         if(obj->mObjFlags & IMM_CREATE_LOCK) {goto continue_while_loop;}
@@ -9572,6 +9658,17 @@ ImmModel::searchInitialize(ImmsvOmSearch
                     osafassert(nameToInternal(objectName));
                 }
             }
+        } else if(noDanglingSearch) {
+            ++ommi;
+            while(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == 
refObj) {
+                if(noDanglingRefExist(ommi->second, refObjectName.c_str())) {
+                    obj = ommi->second;
+                    objectName.clear();
+                    getObjectName(obj, objectName);
+                    break;
+                }
+                ++ommi;
+            }
         } else {
             ++omi;
             if(omi!= sObjectMap.end()) {
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh 
b/osaf/services/saf/immsv/immnd/ImmModel.hh
--- a/osaf/services/saf/immsv/immnd/ImmModel.hh
+++ b/osaf/services/saf/immsv/immnd/ImmModel.hh
@@ -666,6 +666,10 @@ private:
                                        const char *targetObjectName,
                                        SaUint32T ccbId);
 
+    bool noDanglingRefExist(
+                            ObjectInfo *obj,
+                            const char *noDanglingRef);
+
 };
 
 #endif

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to