Added dynamic parts of record alias implementation.

This commit is contained in:
Andrew Johnson
2009-01-16 20:50:40 +00:00
parent dd7cb80555
commit e155dd411e
10 changed files with 119 additions and 19 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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++) {