From 5c080a64f9d47ca7e1b1c8a2a0e10bab54665ccf Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Wed, 21 Mar 2018 11:04:15 +0100 Subject: [PATCH] bind info to reacord instead of alias --- src/dbStatic/dbBase.h | 1 + src/dbStatic/dbStaticLib.c | 47 +++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/dbStatic/dbBase.h b/src/dbStatic/dbBase.h index 80779ca68..db6947f22 100644 --- a/src/dbStatic/dbBase.h +++ b/src/dbStatic/dbBase.h @@ -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 */ diff --git a/src/dbStatic/dbStaticLib.c b/src/dbStatic/dbStaticLib.c index 6e6c944f8..5099b4624 100644 --- a/src/dbStatic/dbStaticLib.c +++ b/src/dbStatic/dbStaticLib.c @@ -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; }