osaf/services/saf/immsv/immnd/ImmModel.cc | 66 +++++++++++++++++++++++++++++++
1 files changed, 66 insertions(+), 0 deletions(-)
When all data is synced, NO_DANGLING references are created and are added to
sReverseRefsNoDanglingMMap.
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
@@ -17217,6 +17217,72 @@ ImmModel::finalizeSync(ImmsvOmFinalizeSy
ol = ol->next;
}
+ // Create NO_DANGLING references
+ ClassInfo* ci;
+ ObjectSet os;
+ ImmAttrValue *av;
+ ObjectSet::iterator osi;
+ ObjectSet::iterator aosi;
+ ImmAttrValueMap::iterator avmi;
+ AttrMap::iterator ami;
+ ClassMap::iterator cmi;
+ ObjectMap::iterator omi;
+ for(cmi=sClassMap.begin(); cmi!=sClassMap.end(); ++cmi) {
+ ci = cmi->second;
+ // Check if the class has at least one attribute with
NO_DANGLING flag;
+ for(ami=ci->mAttrMap.begin();
+ ami!=ci->mAttrMap.end() && !(ami->second->mFlags &
SA_IMM_ATTR_NO_DANGLING);
+ ++ami);
+ if(ami == ci->mAttrMap.end()) {
+ continue;
+ }
+
+ // Iterate through all objects of the class
+ for(osi=ci->mExtent.begin(); osi!=ci->mExtent.end(); ++osi) {
+ os.clear();
+ for(ami = ci->mAttrMap.begin(); ami!=ci->mAttrMap.end();
++ami) {
+ // Assemble NO_DANGLING references
+ if(ami->second->mFlags & SA_IMM_ATTR_NO_DANGLING) {
+ avmi =
(*osi)->mAttrValueMap.find(ami->first.c_str());
+ // Attribute must exist
+ osafassert(avmi != (*osi)->mAttrValueMap.end());
+ av = avmi->second;
+ if(!av->empty()) {
+ omi = sObjectMap.find(av->getValueC_str());
+ if(omi == sObjectMap.end()) {
+ std::string objName;
+ getObjectName(*osi, objName);
+ LOG_ER("Object '%s' is missing. Reference
from '%s'",
+ av->getValueC_str(),
objName.c_str());
+ abort();
+ }
+ os.insert(omi->second);
+ }
+ if(av->isMultiValued()) {
+ while((av = ((ImmAttrMultiValue
*)av)->getNextAttrValue())) {
+ if(!av->empty()) {
+ omi =
sObjectMap.find(av->getValueC_str());
+ if(omi == sObjectMap.end()) {
+ std::string objName;
+ getObjectName(*osi, objName);
+ LOG_ER("Object '%s' is missing.
Reference from '%s'",
+ av->getValueC_str(),
objName.c_str());
+ abort();
+ }
+ os.insert(omi->second);
+ }
+ }
+ }
+ }
+ }
+
+ // Add NO_DANGLING references
+ for(aosi=os.begin(); aosi!=os.end(); ++aosi) {
+ sReverseRefsNoDanglingMMap.insert(std::pair<ObjectInfo
*, ObjectInfo *>(*aosi, *osi));
+ }
+ }
+ }
+
TRACE_5("Synced %u CCB-outcomes",(unsigned int) sCcbVector.size());
this->setLoader(0);
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel