channel access to info fields

This commit is contained in:
2018-03-02 13:31:18 +01:00
parent c1447d9cb4
commit 0d332dbb41
4 changed files with 45 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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,