diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index ef27afafb..5c1e1d0a6 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -675,6 +675,8 @@ long epicsShareAPI dbNameToAddr(const char *pname, DBADDR *paddr) status = dbFindFieldPart(&dbEntry, &pname); if (status == S_dbLib_fieldNotFound) status = dbGetAttributePart(&dbEntry, &pname); + if (status == S_dbLib_fieldNotFound) + status = dbFindInfoPart(&dbEntry, &pname); if (status) goto finish; paddr->precord = dbEntry.precnode->precord; diff --git a/src/dbStatic/dbBase.h b/src/dbStatic/dbBase.h index 2d021df58..80779ca68 100644 --- a/src/dbStatic/dbBase.h +++ b/src/dbStatic/dbBase.h @@ -94,6 +94,7 @@ typedef struct dbInfoNode { /*non-field per-record information*/ char *name; char *string; void *pointer; + dbFldDes *pdbFldDes; }dbInfoNode; #define DBRN_FLAGS_VISIBLE 1 diff --git a/src/dbStatic/dbStaticLib.c b/src/dbStatic/dbStaticLib.c index c601a4733..6e6c944f8 100644 --- a/src/dbStatic/dbStaticLib.c +++ b/src/dbStatic/dbStaticLib.c @@ -2808,6 +2808,30 @@ long epicsShareAPI dbFindInfo(DBENTRY *pdbentry,const char *name) return (S_dbLib_infoNotFound); } +long dbFindInfoPart(DBENTRY *pdbentry, const char **ppname) +{ + dbRecordNode *precnode = pdbentry->precnode; + dbInfoNode *pinfo; + const char *pname = *ppname; + size_t len; + + pinfo = (dbInfoNode *)ellFirst(&precnode->infoList); + while (pinfo) { + len = strlen(pinfo->name); + if (!strncmp(pinfo->name, pname, len) && + (pname[len] == 0 || pname[len] == '$' || pname[len] == '{' || pname[len] == '[')) + { + pdbentry->pinfonode = pinfo; + pdbentry->pflddes = pinfo->pdbFldDes; + pdbentry->pfield = pinfo->string; + *ppname = &pname[len]; + return (0); + } + pinfo = (dbInfoNode *)ellNext(&pinfo->node); + } + return S_dbLib_fieldNotFound; +} + long epicsShareAPI dbDeleteInfo(DBENTRY *pdbentry) { dbRecordNode *precnode = pdbentry->precnode; @@ -2846,6 +2870,7 @@ long epicsShareAPI dbPutInfoString(DBENTRY *pdbentry,const char *string) if (!newstring) return (S_dbLib_outMem); strcpy(newstring, string); pinfo->string = newstring; + pinfo->pdbFldDes->size = strlen(newstring)+1; return (0); } @@ -2872,6 +2897,7 @@ const char * epicsShareAPI dbGetInfo(DBENTRY *pdbentry,const char *name) long epicsShareAPI dbPutInfo(DBENTRY *pdbentry,const char *name,const char *string) { + dbFldDes *pdbFldDes; dbInfoNode *pinfo; dbRecordNode *precnode = pdbentry->precnode; if (!precnode) return (S_dbLib_recNotFound); @@ -2896,6 +2922,20 @@ long epicsShareAPI dbPutInfo(DBENTRY *pdbentry,const char *name,const char *stri return (S_dbLib_outMem); } strcpy(pinfo->string, string); + pdbFldDes = calloc(1,sizeof(dbFldDes)); + if (!pdbFldDes) { + free(pinfo->string); + free(pinfo->name); + free(pinfo); + return (S_dbLib_outMem); + } + pdbFldDes->name = pinfo->name; + pdbFldDes->pdbRecordType = pdbentry->precordType; + pdbFldDes->special = SPC_ATTRIBUTE; + pdbFldDes->field_type = DBF_STRING; + pdbFldDes->as_level = ASL1; + pdbFldDes->size = strlen(string)+1; + pinfo->pdbFldDes = pdbFldDes; ellAdd(&precnode->infoList,&pinfo->node); pdbentry->pinfonode = pinfo; return (0); diff --git a/src/dbStatic/dbStaticLib.h b/src/dbStatic/dbStaticLib.h index 018fb373f..632ebc48a 100644 --- a/src/dbStatic/dbStaticLib.h +++ b/src/dbStatic/dbStaticLib.h @@ -170,6 +170,8 @@ epicsShareFunc char * epicsShareAPI dbVerify(DBENTRY *pdbentry, epicsShareFunc char * epicsShareAPI dbGetRange(DBENTRY *pdbentry); epicsShareFunc int epicsShareAPI dbIsDefaultValue(DBENTRY *pdbentry); +epicsShareFunc long dbFindInfoPart(DBENTRY *pdbentry, + const char **ppname); epicsShareFunc long epicsShareAPI dbFirstInfo(DBENTRY *pdbentry); epicsShareFunc long epicsShareAPI dbNextInfo(DBENTRY *pdbentry); epicsShareFunc long epicsShareAPI dbFindInfo(DBENTRY *pdbentry,