Export (0) Print
Expand All

4.1.10.6.4 AdjustInstanceTypeAttrVal

procedure AdjustInstanceTypeAttrVal(
  ncReplicated: DSName,
  writableReplica: DSName,
  var replEntinfList: REPLENTINFLIST,
  prefixTable: PrefixTable) : boolean

Informative summary of behavior: The AdjustInstanceTypeAttrVal procedure adjusts the attribute value of instanceType attribute in replEntinfList parameter to an appropriate value that suits the NC replica on the client. The procedure returns true if further processing of replicated update in replEntinfList must be performed. Otherwise, it returns false.

instanceTypeAttrVal: ATTRVAL
instanceTypeAdjustedAttrVal: ATTRVAL
instanceTypeVal: ULONG
instanceTypeAdjustedVal: ULONG
ncSubRef: DSName

instanceTypeAttrVal := ENTINF_GetValue(replEntinfList.Entinf,
    instanceType, prefixTable)
if (instanceTypeAttrVal = null) then
  /* If instanceType attribute is not present in Entinf
   * then there is no value to adjust. */
  return true
endif

instanceTypeVal :=  ValueFromATTRVAL(
    instanceTypeAttrVal, Syntax(instanceType), prefixTable)

if (IT_NC_HEAD in instanceTypeVal) and 
   (not ncReplicated = replEntinfList.Entinf.pName^)
  /* If IT_NC_HEAD is set in instanceTypeVal and 
   * replEntinfList.Entinf.pName is not the DSName of the root of the
   * NC replica that the client is replicating, then this object is 
   * a subordinate reference. Take this opportunity
   * to ensure that ncReplicated!subRefs has an entry for this
   * sub-ref object.
   */
  ncSubRef := replEntinfList.Entinf.pName^
  if (not ncSubRef in ncReplicated!subRefs) then
    ncReplicated!subRefs := ncReplicated!subRefs + {ncSubRef}
  endif
  if ObjExists(ncSubRef)
    /* Ensure that all sub-ref objects have the flag IT_NC_ABOVE set. */
    if not IT_NC_ABOVE in ncSubRef!instanceType then 
      ncSubRef!instanceType := ncSubRef!instanceType + {IT_NC_ABOVE}     
    endif

    /* If the sub-ref object corresponds to a locally instantiated
     * child NC, then skip this update as the sub-ref object
     * will be updated when the child NC replicates in.
     */
    if PartialGCReplicaExists(ncSubRef) then
      return false /* Skip processing this entry. */
    endif
  endif

  /* If sub-ref object does not exist or exists but the child NC is not 
   * locally instantiated, then continue processing this entry to 
   * add or update the sub-ref object.
   */
  instanceTypeAdjustedVal := instanceTypeVal + {IT_NC_ABOVE,
        IT_UNINSTANT, IT_NC_HEAD}  

else
  if (not writableReplica) and 
     (IT_WRITE in instanceTypeVal) then
    /* If the client NC replica is a partial replica then remove the
     * IT_WRITE flag from the instanceTypeVal to mark the object as
     * read-only.
     */
    instanceTypeAdjustedVal := instanceTypeVal - {IT_WRITE}
  else
    instanceTypeAdjustedVal := instanceTypeVal
  endif
endif

/* Set or reset instance type bits other than IT_WRITE and
 * IT_NC_HEAD. */
instanceTypeAdjustedVal :=
    SetResetInstanceTypeBits(instanceTypeAdjustedVal)

instanceTypeAdjustedAttrVal := ATTRVALFromValue(
  instanceTypeAdjusted, Syntax(instanceType), prefixTable)

ENTINF_SetValue(replEntinfList.Entinf, instanceType, 
    instanceTypeAdjustedAttrVal, prefixTable)

return true
 
Show:
© 2014 Microsoft