bind info to reacord instead of alias

This commit is contained in:
2018-03-21 11:04:15 +01:00
parent 3f1a366291
commit 5c080a64f9
2 changed files with 29 additions and 19 deletions

View File

@@ -107,6 +107,7 @@ typedef struct dbRecordNode {
char *recordname;
ELLLIST infoList; /*LIST head of info nodes*/
int flags;
struct dbRecordNode *aliasedRecnode; /* NULL unless flags|DBRN_FLAGS_ISALIAS */
}dbRecordNode;
/*dbRecordAttribute is for "psuedo" fields */

View File

@@ -1548,7 +1548,7 @@ long epicsShareAPI dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
if((status = dbAllocRecord(pdbentry,precordName))) return(status);
pNewRecNode->recordname = dbRecordName(pdbentry);
ellInit(&pNewRecNode->infoList);
/* install record node in list in sorted postion */
/* install record node in list in sorted position */
status = dbFirstRecord(pdbentry);
while(status==0) {
if(strcmp(precordName,dbGetRecordName(pdbentry)) < 0) break;
@@ -1816,37 +1816,44 @@ long epicsShareAPI dbCreateAlias(DBENTRY *pdbentry, const char *alias)
dbRecordNode *pnewnode;
PVDENTRY *ppvd;
ELLLIST *preclist = NULL;
DBENTRY dbEntry;
long status;
if (!precordType) return S_dbLib_recordTypeNotFound;
/* alias of alias still references actual record */
while(precnode && (precnode->flags&DBRN_FLAGS_ISALIAS))
precnode = precnode->aliasedRecnode;
if (!precnode) return S_dbLib_recNotFound;
zeroDbentry(pdbentry);
if (!dbFindRecord(pdbentry, alias)) return S_dbLib_recExists;
zeroDbentry(pdbentry);
pdbentry->precordType = precordType;
/* use copy to avoid later info fields being bound to the alias */
dbCopyEntryContents(pdbentry, &dbEntry);
zeroDbentry(&dbEntry);
if (!dbFindRecord(&dbEntry, alias)) return S_dbLib_recExists;
zeroDbentry(&dbEntry);
dbEntry.precordType = precordType;
preclist = &precordType->recList;
pnewnode = dbCalloc(1, sizeof(dbRecordNode));
pnewnode->recordname = epicsStrDup(alias);
pnewnode->precord = precnode->precord;
pnewnode->aliasedRecnode = precnode;
pnewnode->flags = DBRN_FLAGS_ISALIAS;
if (!(precnode->flags & DBRN_FLAGS_ISALIAS))
precnode->flags |= DBRN_FLAGS_HASALIAS;
precnode->flags |= DBRN_FLAGS_HASALIAS;
ellInit(&pnewnode->infoList);
/* install record node in list in sorted postion */
status = dbFirstRecord(pdbentry);
/* install alias node in list in sorted position */
status = dbFirstRecord(&dbEntry);
while (!status) {
if (strcmp(alias, dbGetRecordName(pdbentry)) < 0) break;
status = dbNextRecord(pdbentry);
if (strcmp(alias, dbGetRecordName(&dbEntry)) < 0) break;
status = dbNextRecord(&dbEntry);
}
if (!status) {
precnode = pdbentry->precnode;
precnode = dbEntry.precnode;
ellInsert(preclist, ellPrevious(&precnode->node), &pnewnode->node);
} else {
ellAdd(preclist, &pnewnode->node);
}
precordType->no_aliases++;
pdbentry->precnode = pnewnode;
ppvd = dbPvdAdd(pdbentry->pdbbase, precordType, pnewnode);
dbEntry.precnode = pnewnode;
ppvd = dbPvdAdd(dbEntry.pdbbase, precordType, pnewnode);
dbFinishEntry(&dbEntry);
if (!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);}
return 0;
}
@@ -2815,19 +2822,21 @@ long dbFindInfoPart(DBENTRY *pdbentry, const char **ppname)
const char *pname = *ppname;
size_t len;
if (precnode->aliasedRecnode)
precnode=precnode->aliasedRecnode;
pinfo = (dbInfoNode *)ellFirst(&precnode->infoList);
while (pinfo) {
len = strlen(pinfo->name);
if (!strncmp(pinfo->name, pname, len) &&
if (!strncmp(pinfo->name, pname, len) &&
(pname[len] == 0 || pname[len] == '$' || pname[len] == '{' || pname[len] == '['))
{
pdbentry->pinfonode = pinfo;
pdbentry->pinfonode = pinfo;
pdbentry->pflddes = pinfo->pdbFldDes;
pdbentry->pfield = pinfo->string;
*ppname = &pname[len];
return (0);
}
pinfo = (dbInfoNode *)ellNext(&pinfo->node);
return (0);
}
pinfo = (dbInfoNode *)ellNext(&pinfo->node);
}
return S_dbLib_fieldNotFound;
}