From 4f6040d35b936c60e4e4f35f0d07307251490941 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 23 Jan 2013 10:38:30 -0500 Subject: [PATCH] get_array_info() can modifiy DBADDR::pfield Allow the record support function get_array_info() to modify its first argument to provide a different pointer from which values should be read. Remember the original and restore it afterwards. --- src/ioc/db/dbAccess.c | 13 ++++++++++++- src/std/filters/arr.c | 5 ++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ioc/db/dbAccess.c b/src/ioc/db/dbAccess.c index 82aa18c11..c4661d9e1 100644 --- a/src/ioc/db/dbAccess.c +++ b/src/ioc/db/dbAccess.c @@ -780,6 +780,7 @@ long dbGet(DBADDR *paddr, short dbrType, void *pbuffer, long *options, long *nRequest, void *pflin) { char *pbuf = pbuffer; + void *pfieldsave; db_field_log *pfl = (db_field_log *)pflin; short field_type; long no_elements; @@ -815,6 +816,13 @@ long dbGet(DBADDR *paddr, short dbrType, return S_db_badDbrtype; } + /* For array field, the rset function + * get_array_info() is allowed to modify + * paddr->pfield. So we store the original + * value and restore it later. + */ + pfieldsave = paddr->pfield; + /* check for array */ if ((!pfl || pfl->type == dbfl_type_rec) && paddr->special == SPC_DBADDR && @@ -860,7 +868,8 @@ long dbGet(DBADDR *paddr, short dbrType, sprintf(message, "dbGet: Missing conversion for [%d][%d]\n", field_type, dbrType); recGblDbaddrError(S_db_badDbrtype, paddr, message); - return S_db_badDbrtype; + status = S_db_badDbrtype; + goto done; } /* convert database field and place it in the buffer */ if (n <= 0) { @@ -880,6 +889,8 @@ long dbGet(DBADDR *paddr, short dbrType, status = convert(&localAddr, pbuf, n, no_elements, offset); } } +done: + paddr->pfield = pfieldsave; return status; } diff --git a/src/std/filters/arr.c b/src/std/filters/arr.c index 201118d24..f2f5f82f1 100644 --- a/src/std/filters/arr.c +++ b/src/std/filters/arr.c @@ -104,7 +104,9 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) { if (chan->addr.special == SPC_DBADDR && nSource > 1 && (prset = dbGetRset(&chan->addr)) && - prset->get_array_info) { + prset->get_array_info) + { + void *pfieldsave = chan->addr.pfield; prec = dbChannelRecord(chan); dbScanLock(prec); prset->get_array_info(&chan->addr, &nSource, &offset); @@ -126,6 +128,7 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) { pfl->u.r.field = pdst; } dbScanUnlock(prec); + chan->addr.pfield = pfieldsave; } /* Extract from buffer */