From e155dd411eab3630a803ba46bc9636bdea2887ad Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 16 Jan 2009 20:50:40 +0000 Subject: [PATCH] Added dynamic parts of record alias implementation. --- src/db/dbIocRegister.c | 9 +++- src/db/dbLock.c | 10 +++- src/db/dbNotify.c | 3 ++ src/db/dbScan.c | 4 +- src/db/dbTest.c | 29 +++++++++++ src/dbStatic/dbBase.h | 4 +- src/dbStatic/dbStaticLib.c | 50 ++++++++++++++++--- src/dbStatic/dbStaticLib.h | 3 +- .../top/exampleApp/Db/dbExample2.db | 2 + src/misc/iocInit.c | 24 ++++++--- 10 files changed, 119 insertions(+), 19 deletions(-) diff --git a/src/db/dbIocRegister.c b/src/db/dbIocRegister.c index 68379fea0..a82337f03 100644 --- a/src/db/dbIocRegister.c +++ b/src/db/dbIocRegister.c @@ -131,8 +131,14 @@ static const iocshArg * const dbnrArgs[1] = {&dbnrArg0}; static const iocshFuncDef dbnrFuncDef = {"dbnr",1,dbnrArgs}; static void dbnrCallFunc(const iocshArgBuf *args) { dbnr(args[0].ival);} +/* dbla */ +static const iocshArg dblaArg0 = { "pattern",iocshArgString}; +static const iocshArg * const dblaArgs[1] = {&dblaArg0}; +static const iocshFuncDef dblaFuncDef = {"dbla",1,dblaArgs}; +static void dblaCallFunc(const iocshArgBuf *args) { dbla(args[0].sval);} + /* dbgrep */ -static const iocshArg dbgrepArg0 = { "record name",iocshArgString}; +static const iocshArg dbgrepArg0 = { "pattern",iocshArgString}; static const iocshArg * const dbgrepArgs[1] = {&dbgrepArg0}; static const iocshFuncDef dbgrepFuncDef = {"dbgrep",1,dbgrepArgs}; static void dbgrepCallFunc(const iocshArgBuf *args) { dbgrep(args[0].sval);} @@ -301,6 +307,7 @@ void epicsShareAPI dbIocRegister(void) iocshRegister(&dbaFuncDef,dbaCallFunc); iocshRegister(&dblFuncDef,dblCallFunc); iocshRegister(&dbnrFuncDef,dbnrCallFunc); + iocshRegister(&dblaFuncDef,dblaCallFunc); iocshRegister(&dbgrepFuncDef,dbgrepCallFunc); iocshRegister(&dbgfFuncDef,dbgfCallFunc); iocshRegister(&dbpfFuncDef,dbpfCallFunc); diff --git a/src/db/dbLock.c b/src/db/dbLock.c index b35977b53..4d10d6694 100644 --- a/src/db/dbLock.c +++ b/src/db/dbLock.c @@ -327,7 +327,8 @@ void epicsShareAPI dbLockInitRecords(dbBase *pdbbase) for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); pdbRecordType; pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { - nrecords += ellCount(&pdbRecordType->recList); + nrecords += ellCount(&pdbRecordType->recList) + - pdbRecordType->no_aliases; } /*Allocate all of them at once */ plockRecord = dbCalloc(nrecords,sizeof(lockRecord)); @@ -338,6 +339,9 @@ void epicsShareAPI dbLockInitRecords(dbBase *pdbbase) pdbRecordNode; pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { precord = pdbRecordNode->precord; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; plockRecord->precord = precord; precord->lset = plockRecord; plockRecord++; @@ -350,7 +354,9 @@ void epicsShareAPI dbLockInitRecords(dbBase *pdbbase) pdbRecordNode; pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { precord = pdbRecordNode->precord; - if(!(precord->name[0])) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; plockRecord = precord->lset; if(!plockRecord->plockSet) allocLockSet(plockRecord,listTypeScanLock,lockSetStateFree,0); diff --git a/src/db/dbNotify.c b/src/db/dbNotify.c index 662e5601d..621b7f448 100644 --- a/src/db/dbNotify.c +++ b/src/db/dbNotify.c @@ -546,6 +546,9 @@ int epicsShareAPI dbNotifyDump(void) pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { putNotifyPvt *pputNotifyPvt; precord = pdbRecordNode->precord; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; if(!precord->ppn) continue; if(!precord->ppnr) continue; if(precord->ppn->paddr->precord != precord) continue; diff --git a/src/db/dbScan.c b/src/db/dbScan.c index 87250ebc2..def5f1995 100644 --- a/src/db/dbScan.c +++ b/src/db/dbScan.c @@ -705,7 +705,9 @@ static void buildScanLists(void) pdbRecordNode; pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { dbCommon *precord = pdbRecordNode->precord; - if (precord->name[0] == 0) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; scanAdd(precord); } } diff --git a/src/db/dbTest.c b/src/db/dbTest.c index b50541944..e7fa25420 100644 --- a/src/db/dbTest.c +++ b/src/db/dbTest.c @@ -204,6 +204,35 @@ long epicsShareAPI dbnr(int verbose) return 0; } +long epicsShareAPI dbla(const char *pmask) +{ + DBENTRY dbentry; + DBENTRY *pdbentry = &dbentry; + long status; + + if (!pdbbase) { + printf("No database loaded\n"); + return 0; + } + dbInitEntry(pdbbase, pdbentry); + status = dbFirstRecordType(pdbentry); + while (!status) { + for (status = dbFirstRecord(pdbentry); !status; + status = dbNextRecord(pdbentry)) { + char *palias; + + if (!dbIsAlias(pdbentry)) continue; + palias = dbGetRecordName(pdbentry); + if (pmask && *pmask && !epicsStrGlobMatch(palias, pmask)) continue; + dbFindField(pdbentry, "NAME"); + printf("%s -> %s\n", palias, dbGetString(pdbentry)); + } + status = dbNextRecordType(pdbentry); + } + dbFinishEntry(pdbentry); + return 0; +} + long epicsShareAPI dbgrep(const char *pmask) { DBENTRY dbentry; diff --git a/src/dbStatic/dbBase.h b/src/dbStatic/dbBase.h index 88e8240b7..1bf619bf8 100644 --- a/src/dbStatic/dbBase.h +++ b/src/dbStatic/dbBase.h @@ -97,7 +97,8 @@ typedef struct dbInfoNode { /*non-field per-record information*/ }dbInfoNode; #define DBRN_FLAGS_VISIBLE 1 -#define DBRN_FLAGS_ALIAS 2 +#define DBRN_FLAGS_ISALIAS 2 +#define DBRN_FLAGS_HASALIAS 4 typedef struct dbRecordNode { ELLNODE node; @@ -139,6 +140,7 @@ typedef struct dbRecordType { short no_fields; /* number of fields defined */ short no_prompt; /* number of fields to configure*/ short no_links; /* number of links */ + short no_aliases; short *link_ind; /* addr of array of ind in papFldDes*/ char **papsortFldName;/* ptr to array of ptr to fld names*/ short *sortFldInd; /* addr of array of ind in papFldDes*/ diff --git a/src/dbStatic/dbStaticLib.c b/src/dbStatic/dbStaticLib.c index 07294b88d..e944e7508 100644 --- a/src/dbStatic/dbStaticLib.c +++ b/src/dbStatic/dbStaticLib.c @@ -1527,6 +1527,35 @@ long epicsShareAPI dbCreateRecord(DBENTRY *pdbentry,const char *precordName) return(0); } +long epicsShareAPI dbDeleteAliases(DBENTRY *pdbentry) +{ + dbBase *pdbbase = pdbentry->pdbbase; + dbRecordType *precordType = pdbentry->precordType; + dbRecordNode *precnode = pdbentry->precnode; + ELLLIST *preclist = &precordType->recList; + dbRecordNode *pAliasNode, *pAliasNodeNext; + DBENTRY dbentry; + void *precord; + + if (!precnode) return S_dbLib_recNotFound; + if (precnode->flags & DBRN_FLAGS_ISALIAS) return S_dbLib_recExists; + precord = precnode->precord; + + dbInitEntry(pdbbase, &dbentry); + pAliasNode = (dbRecordNode *)ellFirst(preclist); + while (pAliasNode) { + pAliasNodeNext = (dbRecordNode *)ellNext(&pAliasNode->node); + if (pAliasNode->flags & DBRN_FLAGS_ISALIAS && + pAliasNode->precord == precord && + !dbFindRecord(&dbentry, pAliasNode->recordname)) { + dbDeleteRecord(&dbentry); + } + pAliasNode = pAliasNodeNext; + } + precnode->flags &= ~DBRN_FLAGS_HASALIAS; + return 0; +} + long epicsShareAPI dbDeleteRecord(DBENTRY *pdbentry) { dbBase *pdbbase = pdbentry->pdbbase; @@ -1536,15 +1565,19 @@ long epicsShareAPI dbDeleteRecord(DBENTRY *pdbentry) long status; if (!precnode) return S_dbLib_recNotFound; + if (precnode->flags & DBRN_FLAGS_HASALIAS) + dbDeleteAliases(pdbentry); + preclist = &precordType->recList; ellDelete(preclist, &precnode->node); dbPvdDelete(pdbbase, precnode); - if (dbIsAlias(pdbentry)) { + while (!dbFirstInfo(pdbentry)) { + dbDeleteInfo(pdbentry); + } + if (precnode->flags & DBRN_FLAGS_ISALIAS) { free(precnode->recordname); + precordType->no_aliases--; } else { - while (!dbFirstInfo(pdbentry)) { - dbDeleteInfo(pdbentry); - } status = dbFreeRecord(pdbentry); if (status) return status; } @@ -1717,7 +1750,7 @@ int epicsShareAPI dbIsVisibleRecord(DBENTRY *pdbentry) return precnode->flags & DBRN_FLAGS_VISIBLE ? 1 : 0; } -int epicsShareAPI dbCreateAlias(DBENTRY *pdbentry, const char *alias) +long epicsShareAPI dbCreateAlias(DBENTRY *pdbentry, const char *alias) { dbRecordType *precordType = pdbentry->precordType; dbRecordNode *precnode = pdbentry->precnode; @@ -1736,7 +1769,9 @@ int epicsShareAPI dbCreateAlias(DBENTRY *pdbentry, const char *alias) pnewnode = dbCalloc(1, sizeof(dbRecordNode)); pnewnode->recordname = epicsStrDup(alias); pnewnode->precord = precnode->precord; - pnewnode->flags = DBRN_FLAGS_ALIAS; + pnewnode->flags = DBRN_FLAGS_ISALIAS; + if (!(precnode->flags & DBRN_FLAGS_ISALIAS)) + precnode->flags |= DBRN_FLAGS_HASALIAS; ellInit(&pnewnode->infoList); /* install record node in list in sorted postion */ status = dbFirstRecord(pdbentry); @@ -1750,6 +1785,7 @@ int epicsShareAPI dbCreateAlias(DBENTRY *pdbentry, const char *alias) } else { ellAdd(preclist, &pnewnode->node); } + precordType->no_aliases++; pdbentry->precnode = pnewnode; ppvd = dbPvdAdd(pdbentry->pdbbase, precordType, pnewnode); if (!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);} @@ -1761,7 +1797,7 @@ int epicsShareAPI dbIsAlias(DBENTRY *pdbentry) dbRecordNode *precnode = pdbentry->precnode; if(!precnode) return 0; - return precnode->flags & DBRN_FLAGS_ALIAS ? 1 : 0; + return precnode->flags & DBRN_FLAGS_ISALIAS ? 1 : 0; } long epicsShareAPI dbCopyRecord(DBENTRY *pdbentry,const char *newRecordName,int overWriteOK) diff --git a/src/dbStatic/dbStaticLib.h b/src/dbStatic/dbStaticLib.h index 7b8349dae..14ae926c2 100644 --- a/src/dbStatic/dbStaticLib.h +++ b/src/dbStatic/dbStaticLib.h @@ -145,9 +145,10 @@ epicsShareFunc long epicsShareAPI dbVisibleRecord(DBENTRY *pdbentry); epicsShareFunc long epicsShareAPI dbInvisibleRecord(DBENTRY *pdbentry); epicsShareFunc int epicsShareAPI dbIsVisibleRecord(DBENTRY *pdbentry); -epicsShareFunc int epicsShareAPI dbCreateAlias( +epicsShareFunc long epicsShareAPI dbCreateAlias( DBENTRY *pdbentry, const char *paliasName); epicsShareFunc int epicsShareAPI dbIsAlias(DBENTRY *pdbentry); +epicsShareFunc long epicsShareAPI dbDeleteAliases(DBENTRY *pdbentry); epicsShareFunc long epicsShareAPI dbFindField( DBENTRY *pdbentry,const char *pfieldName); diff --git a/src/makeBaseApp/top/exampleApp/Db/dbExample2.db b/src/makeBaseApp/top/exampleApp/Db/dbExample2.db index 836c53d08..f4cf061fa 100644 --- a/src/makeBaseApp/top/exampleApp/Db/dbExample2.db +++ b/src/makeBaseApp/top/exampleApp/Db/dbExample2.db @@ -1,5 +1,6 @@ record(calc, "$(user):calcExample$(no)") { + alias("$(user):calc$(no)") field(DESC, "Counter No. $(no)") field(SCAN,"$(scan)") field(FLNK, "$(user):aiExample$(no)") @@ -36,3 +37,4 @@ record(ai, "$(user):aiExample$(no)") field(LSV, "MINOR") field(LLSV, "MAJOR") } +alias("$(user):aiExample$(no)","$(user):ai$(no)") diff --git a/src/misc/iocInit.c b/src/misc/iocInit.c index 9c3ffe5a0..d7b88c11a 100644 --- a/src/misc/iocInit.c +++ b/src/misc/iocInit.c @@ -322,7 +322,9 @@ static void initDatabase(void) devSup *pdevSup; struct dset *pdset; - if (!precord->name[0]) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; precord->rset = prset; precord->rdes = pdbRecordType; @@ -355,7 +357,10 @@ static void initDatabase(void) int j; devSup *pdevSup; - if (!precord->name[0]) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; + /* Convert all PV_LINKs to DB_LINKs or CA_LINKs */ /* For all the links in the record type... */ for (j = 0; j < pdbRecordType->no_links; j++) { @@ -420,8 +425,10 @@ static void initDatabase(void) pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { dbCommon *precord = pdbRecordNode->precord; - /* Find pointer to record instance */ - if (!precord->name[0]) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; + precord->rset = prset; if (prset->init_record) { prset->init_record(precord, 1); @@ -450,7 +457,10 @@ static void initialProcess(void) pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { dbCommon *precord = pdbRecordNode->precord; - if (!precord->name[0]) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; + if (precord->pini) { dbProcess(precord); } @@ -477,7 +487,9 @@ static void exitDatabase(void *dummy) devSup *pdevSup; struct dsxt *pdsxt; - if (!precord->name[0]) continue; + if (!precord->name[0] || + pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) + continue; /* For all the links in the record type... */ for (j = 0; j < pdbRecordType->no_links; j++) {