From 905c5e632b442368d13347189b2a517e2872d855 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 30 Mar 2020 09:40:51 -0700 Subject: [PATCH] dbAddr::compare --- modules/database/src/ioc/db/dbAccess.c | 12 +++++------- modules/database/src/ioc/db/dbAddr.h | 1 + modules/database/src/ioc/db/dbEvent.c | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/database/src/ioc/db/dbAccess.c b/modules/database/src/ioc/db/dbAccess.c index 91093b546a..edae97e045 100644 --- a/modules/database/src/ioc/db/dbAccess.c +++ b/modules/database/src/ioc/db/dbAccess.c @@ -623,6 +623,7 @@ long dbProcess(dbCommon *precord) long dbEntryToAddr(const DBENTRY *pdbentry, DBADDR *paddr) { + long ret = 0; dbFldDes *pflddes = pdbentry->pflddes; short dbfType = pflddes->field_type; @@ -640,10 +641,11 @@ long dbEntryToAddr(const DBENTRY *pdbentry, DBADDR *paddr) /* Let record type modify paddr */ if (prset && prset->cvt_dbaddr) { - return prset->cvt_dbaddr(paddr); + ret = prset->cvt_dbaddr(paddr); } } - return 0; + paddr->compare = paddr->pfield; + return ret; } /* @@ -911,7 +913,6 @@ long dbGet(DBADDR *paddr, short dbrType, void *pbuffer, long *options, long *nRequest, void *pflin) { char *pbuf = pbuffer; - void *pfieldsave = paddr->pfield; db_field_log *pfl = (db_field_log *)pflin; short field_type; long capacity, no_elements, offset; @@ -1044,7 +1045,6 @@ long dbGet(DBADDR *paddr, short dbrType, } } done: - paddr->pfield = pfieldsave; return status; } @@ -1322,7 +1322,6 @@ long dbPut(DBADDR *paddr, short dbrType, short field_type = paddr->field_type; long no_elements = paddr->no_elements; long special = paddr->special; - void *pfieldsave = paddr->pfield; rset *prset = dbGetRset(paddr); long status = 0; long offset; @@ -1387,7 +1386,7 @@ long dbPut(DBADDR *paddr, short dbrType, if (isValueField) precord->udf = FALSE; if (precord->mlis.count && !(isValueField && pfldDes->process_passive)) - db_post_events(precord, pfieldsave, DBE_VALUE | DBE_LOG); + db_post_events(precord, paddr->compare, 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). @@ -1395,6 +1394,5 @@ long dbPut(DBADDR *paddr, short dbrType, if (precord->mlis.count && pfldDes->prop) db_post_events(precord, NULL, DBE_PROPERTY); done: - paddr->pfield = pfieldsave; return status; } diff --git a/modules/database/src/ioc/db/dbAddr.h b/modules/database/src/ioc/db/dbAddr.h index 3c37ab68c2..58231710a3 100644 --- a/modules/database/src/ioc/db/dbAddr.h +++ b/modules/database/src/ioc/db/dbAddr.h @@ -17,6 +17,7 @@ struct dbFldDes; typedef struct dbAddr { struct dbCommon *precord; /* address of record */ void *pfield; /* address of field */ + void *compare; /* use only for equality/order test between instances */ struct dbFldDes *pfldDes; /* address of struct fldDes */ long no_elements; /* number of elements (arrays) */ short field_type; /* type of database field */ diff --git a/modules/database/src/ioc/db/dbEvent.c b/modules/database/src/ioc/db/dbEvent.c index 7342a0852d..1ca411949a 100644 --- a/modules/database/src/ioc/db/dbEvent.c +++ b/modules/database/src/ioc/db/dbEvent.c @@ -851,7 +851,7 @@ unsigned int caEventMask * Only send event msg if they are waiting on the field which * changed or pval==NULL, and are waiting on matching event */ - if ( (dbChannelField(pevent->chan) == (void *)pField || pField==NULL) && + if ( (pevent->chan->addr.compare == (void *)pField || pField==NULL) && (caEventMask & pevent->select)) { db_field_log *pLog = db_create_event_log(pevent); pLog = dbChannelRunPreChain(pevent->chan, pLog);