ioc/db: Call rset::cvt_dbaddr() before processing field modifiers

The channel filters and field modifiers should apply to the
field *after* the record type has made any SPC_DBADDR changes.
This commit is contained in:
Andrew Johnson
2012-09-26 14:41:52 -05:00
parent 12909bfb1d
commit ea725ad1a2

View File

@@ -496,12 +496,24 @@ dbChannel * dbChannelCreate(const char *name)
paddr->special = pflddes->special;
paddr->dbr_field_type = mapDBFToDBR[dbfType];
if (paddr->special == SPC_DBADDR) {
struct rset *prset = dbGetRset(paddr);
/* Let record type modify paddr */
if (prset && prset->cvt_dbaddr) {
status = prset->cvt_dbaddr(paddr);
if (status)
goto finish;
dbfType = paddr->field_type;
}
}
/* Handle field modifiers */
if (*pname) {
if (*pname == '$') {
/* Some field types can be accessed as char arrays */
if (dbfType == DBF_STRING) {
paddr->no_elements = pflddes->size;
paddr->no_elements = paddr->field_size;
paddr->field_type = DBF_CHAR;
paddr->field_size = 1;
paddr->dbr_field_type = DBR_CHAR;
@@ -535,16 +547,6 @@ dbChannel * dbChannelCreate(const char *name)
}
}
if (paddr->special == SPC_DBADDR) {
struct rset *prset = dbGetRset(paddr);
/* Let record type modify the dbAddr */
if (prset && prset->cvt_dbaddr) {
status = prset->cvt_dbaddr(paddr);
if (status) goto finish;
}
}
finish:
if (status && chan) {
dbChannelDelete(chan);