Added dynamic parts of record alias implementation.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)")
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user