long dbPut(DBADDR *paddr, short dbrType, const void *pbuffer, long nRequest) { dbCommon *precord = paddr->precord; short field_type = paddr->field_type; long no_elements = paddr->no_elements; long special = paddr->special; void *pfieldsave = paddr->pfield; struct rset *prset = dbGetRset(paddr); long status = 0; long offset; dbFldDes *pfldDes; int isValueField; if (special == SPC_ATTRIBUTE) return S_db_noMod; if (dbrType == DBR_PUT_ACKT && field_type <= DBF_DEVICE) { return putAckt(paddr, pbuffer, 1, 1, 0); } else if (dbrType == DBR_PUT_ACKS && field_type <= DBF_DEVICE) { return putAcks(paddr, pbuffer, 1, 1, 0); } else if (INVALID_DB_REQ(dbrType) || field_type > DBF_DEVICE) { char message[80]; sprintf(message, "dbPut: Request type is %d", dbrType); recGblDbaddrError(S_db_badDbrtype, paddr, message); return S_db_badDbrtype; } if (special) { status = dbPutSpecial(paddr, 0); if (status) return status; } if (paddr->pfldDes->special == SPC_DBADDR && prset && prset->get_array_info) { long dummy; status = prset->get_array_info(paddr, &dummy, &offset); /* paddr->pfield may be modified */ if (status) goto done; } else offset = 0; if (no_elements <= 1) { status = dbFastPutConvertRoutine[dbrType][field_type](pbuffer, paddr->pfield, paddr); nRequest = 1; } else { if (no_elements < nRequest) nRequest = no_elements; status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer, nRequest, no_elements, offset); } /* update array info */ if (!status && paddr->pfldDes->special == SPC_DBADDR && prset && prset->put_array_info) { status = prset->put_array_info(paddr, nRequest); } /* Always do special processing if needed */ if (special) { long status2 = dbPutSpecial(paddr, 1); if (status2) goto done; } if (status) goto done; /* Propagate monitor events for this field, */ /* unless the field is VAL and PP is true. */ pfldDes = paddr->pfldDes; isValueField = dbIsValueField(pfldDes); if (isValueField) precord->udf = FALSE; if (precord->mlis.count && !(isValueField && pfldDes->process_passive)) db_post_events(precord, pfieldsave, DBE_VALUE | DBE_LOG); /* If this field is a property (metadata) field, * then post a property change event (even if the field * didn't change). */ if (precord->mlis.count && pfldDes->prop) db_post_events(precord, NULL, DBE_PROPERTY); done: paddr->pfield = pfieldsave; return status; }
long epicsShareAPI dbPut(DBADDR *paddr, short dbrType, const void *pbuffer, long nRequest) { dbCommon *precord = paddr->precord; short field_type = paddr->field_type; long no_elements = paddr->no_elements; long special = paddr->special; long offset; long status = 0; dbFldDes *pfldDes; int isValueField; if (special == SPC_ATTRIBUTE) return S_db_noMod; if (dbrType == DBR_PUT_ACKT && field_type <= DBF_DEVICE) { return putAckt(paddr, (unsigned short *)pbuffer, 1, 1, 0); } else if (dbrType == DBR_PUT_ACKS && field_type <= DBF_DEVICE) { return putAcks(paddr, (unsigned short *)pbuffer, 1, 1, 0); } else if (INVALID_DB_REQ(dbrType) || field_type > DBF_DEVICE) { char message[80]; sprintf(message, "dbPut: Request type is %d", dbrType); recGblDbaddrError(S_db_badDbrtype, paddr, message); return S_db_badDbrtype; } if (special) { status = dbPutSpecial(paddr, 0); if (status) return status; } if (no_elements <= 1) { status = dbFastPutConvertRoutine[dbrType][field_type](pbuffer, paddr->pfield, paddr); } else { struct rset *prset = dbGetRset(paddr); if (paddr->special == SPC_DBADDR && prset && prset->get_array_info) { long dummy; status = prset->get_array_info(paddr, &dummy, &offset); } else offset = 0; if (no_elements < nRequest) nRequest = no_elements; if (!status) status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer, nRequest, no_elements, offset); /* update array info */ if (!status && paddr->special == SPC_DBADDR && prset && prset->put_array_info) { status = prset->put_array_info(paddr, nRequest); } } if (status) return status; /* check if special processing is required */ if (special) { status = dbPutSpecial(paddr,1); if (status) return status; } /* Propagate monitor events for this field, */ /* unless the field field is VAL and PP is true. */ pfldDes = paddr->pfldDes; isValueField = dbIsValueField(pfldDes); if (isValueField) precord->udf = FALSE; if (precord->mlis.count && !(isValueField && pfldDes->process_passive)) db_post_events(precord, paddr->pfield, DBE_VALUE | DBE_LOG); return status; }