Merged changes from 3.15 branch, to revno 12807
This commit is contained in:
+19
-19
@@ -133,25 +133,25 @@ typedef struct dbVariableDef {
|
||||
}dbVariableDef;
|
||||
|
||||
typedef struct dbRecordType {
|
||||
ELLNODE node;
|
||||
ELLLIST attributeList; /*LIST head of attributes*/
|
||||
ELLLIST recList; /*LIST head of sorted dbRecordNodes*/
|
||||
ELLLIST devList; /*List of associated device support*/
|
||||
ELLLIST cdefList; /*LIST of Cdef text items*/
|
||||
char *name;
|
||||
short no_fields; /* number of fields defined */
|
||||
short no_prompt; /* number of fields to configure*/
|
||||
short no_links; /* number of links */
|
||||
short no_aliases; /* number of aliases in recList */
|
||||
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*/
|
||||
dbFldDes *pvalFldDes; /*pointer dbFldDes for VAL field*/
|
||||
short indvalFlddes; /*ind in papFldDes*/
|
||||
dbFldDes **papFldDes; /* ptr to array of ptr to fldDes*/
|
||||
/*The following are only available on run time system*/
|
||||
struct rset *prset;
|
||||
int rec_size; /*record size in bytes */
|
||||
ELLNODE node;
|
||||
ELLLIST attributeList; /*LIST head of attributes*/
|
||||
ELLLIST recList; /*LIST head of sorted dbRecordNodes*/
|
||||
ELLLIST devList; /*List of associated device support*/
|
||||
ELLLIST cdefList; /*LIST of Cdef text items*/
|
||||
char *name;
|
||||
short no_fields; /* number of fields defined */
|
||||
short no_prompt; /* number of fields to configure*/
|
||||
short no_links; /* number of links */
|
||||
short no_aliases; /* number of aliases in recList */
|
||||
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*/
|
||||
dbFldDes *pvalFldDes; /*pointer dbFldDes for VAL field*/
|
||||
short indvalFlddes; /*ind in papFldDes*/
|
||||
dbFldDes **papFldDes; /* ptr to array of ptr to fldDes*/
|
||||
/*The following are only available on run time system*/
|
||||
struct rset *prset;
|
||||
int rec_size; /*record size in bytes */
|
||||
}dbRecordType;
|
||||
|
||||
struct dbPvd; /* Contents private to dbPvdLib code */
|
||||
|
||||
@@ -50,6 +50,9 @@ epicsExportAddress(int,dbBptNotMonotonic);
|
||||
epicsShareDef int dbQuietMacroWarnings=0;
|
||||
epicsExportAddress(int,dbQuietMacroWarnings);
|
||||
|
||||
epicsShareDef int dbRecordsAbcSorted=0;
|
||||
epicsExportAddress(int,dbRecordsAbcSorted);
|
||||
|
||||
/*private routines */
|
||||
static void yyerrorAbort(char *str);
|
||||
static void allocTemp(void *pvoid);
|
||||
@@ -194,7 +197,16 @@ static void freeInputFileList(void)
|
||||
free((void *)pinputFileNow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
int cmp_dbRecordNode(const ELLNODE *lhs, const ELLNODE *rhs)
|
||||
{
|
||||
dbRecordNode *LHS = (dbRecordNode*)lhs,
|
||||
*RHS = (dbRecordNode*)rhs;
|
||||
|
||||
return strcmp(LHS->recordname, RHS->recordname);
|
||||
}
|
||||
|
||||
static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
|
||||
const char *path,const char *substitutions)
|
||||
{
|
||||
@@ -239,24 +251,25 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
|
||||
macSuppressWarning(macHandle,dbQuietMacroWarnings);
|
||||
}
|
||||
pinputFile = dbCalloc(1,sizeof(inputFile));
|
||||
if(filename) {
|
||||
pinputFile->filename = macEnvExpand(filename);
|
||||
if (filename) {
|
||||
pinputFile->filename = macEnvExpand(filename);
|
||||
}
|
||||
if(!fp) {
|
||||
FILE *fp1;
|
||||
if (!fp) {
|
||||
FILE *fp1 = 0;
|
||||
|
||||
if(pinputFile->filename) pinputFile->path = dbOpenFile(pdbbase,pinputFile->filename,&fp1);
|
||||
if(!pinputFile->filename || !fp1) {
|
||||
errPrintf(0,__FILE__, __LINE__,
|
||||
"dbRead opening file %s",pinputFile->filename);
|
||||
free((void *)pinputFile->filename);
|
||||
free((void *)pinputFile);
|
||||
if (pinputFile->filename)
|
||||
pinputFile->path = dbOpenFile(pdbbase, pinputFile->filename, &fp1);
|
||||
if (!pinputFile->filename || !fp1) {
|
||||
errPrintf(0, __FILE__, __LINE__,
|
||||
"dbRead opening file %s",pinputFile->filename);
|
||||
free(pinputFile->filename);
|
||||
free(pinputFile);
|
||||
status = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
pinputFile->fp = fp1;
|
||||
}
|
||||
pinputFile->fp = fp1;
|
||||
} else {
|
||||
pinputFile->fp = fp;
|
||||
pinputFile->fp = fp;
|
||||
}
|
||||
pinputFile->line_num = 0;
|
||||
pinputFileNow = pinputFile;
|
||||
@@ -294,6 +307,15 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
|
||||
dbFinishEntry(pdbEntry);
|
||||
}
|
||||
cleanup:
|
||||
if(dbRecordsAbcSorted) {
|
||||
ELLNODE *cur;
|
||||
for(cur = ellFirst(&pdbbase->recordTypeList); cur; cur=ellNext(cur))
|
||||
{
|
||||
dbRecordType *rtype = CONTAINER(cur, dbRecordType, node);
|
||||
|
||||
ellSortStable(&rtype->recList, &cmp_dbRecordNode);
|
||||
}
|
||||
}
|
||||
if(macHandle) macDeleteHandle(macHandle);
|
||||
macHandle = NULL;
|
||||
if(mac_input_buffer) free((void *)mac_input_buffer);
|
||||
|
||||
@@ -1418,7 +1418,6 @@ long dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
|
||||
dbFldDes *pdbFldDes;
|
||||
PVDENTRY *ppvd;
|
||||
ELLLIST *preclist = NULL;
|
||||
dbRecordNode *precnode = NULL;
|
||||
dbRecordNode *pNewRecNode = NULL;
|
||||
long status = 0;
|
||||
|
||||
@@ -1426,7 +1425,7 @@ long dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
|
||||
/*Get size of NAME field*/
|
||||
pdbFldDes = precordType->papFldDes[0];
|
||||
if(!pdbFldDes || (strcmp(pdbFldDes->name,"NAME")!=0))
|
||||
return(S_dbLib_nameLength);
|
||||
return(S_dbLib_nameLength);
|
||||
if((int)strlen(precordName)>=pdbFldDes->size) return(S_dbLib_nameLength);
|
||||
/* clear callers entry */
|
||||
zeroDbentry(pdbentry);
|
||||
@@ -1441,18 +1440,7 @@ long 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 */
|
||||
status = dbFirstRecord(pdbentry);
|
||||
while(status==0) {
|
||||
if(strcmp(precordName,dbGetRecordName(pdbentry)) < 0) break;
|
||||
status = dbNextRecord(pdbentry);
|
||||
}
|
||||
if(status==0) {
|
||||
precnode = pdbentry->precnode;
|
||||
ellInsert(preclist,ellPrevious(&precnode->node),&pNewRecNode->node);
|
||||
} else {
|
||||
ellAdd(preclist,&pNewRecNode->node);
|
||||
}
|
||||
ellAdd(preclist, &pNewRecNode->node);
|
||||
pdbentry->precnode = pNewRecNode;
|
||||
ppvd = dbPvdAdd(pdbentry->pdbbase,precordType,pNewRecNode);
|
||||
if(!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);}
|
||||
@@ -1630,52 +1618,6 @@ char * dbGetRecordName(DBENTRY *pdbentry)
|
||||
return precnode->recordname;
|
||||
}
|
||||
|
||||
long dbRenameRecord(DBENTRY *pdbentry,const char *newName)
|
||||
{
|
||||
dbBase *pdbbase = pdbentry->pdbbase;
|
||||
dbRecordType *precordType = pdbentry->precordType;
|
||||
dbFldDes *pdbFldDes;
|
||||
dbRecordNode *precnode = pdbentry->precnode;
|
||||
PVDENTRY *ppvd;
|
||||
ELLLIST *preclist;
|
||||
dbRecordNode *plistnode;
|
||||
long status;
|
||||
DBENTRY dbentry;
|
||||
|
||||
if(!precordType) return(S_dbLib_recordTypeNotFound);
|
||||
/*Get size of NAME field*/
|
||||
pdbFldDes = precordType->papFldDes[0];
|
||||
if(!pdbFldDes || (strcmp(pdbFldDes->name,"NAME")!=0))
|
||||
return(S_dbLib_nameLength);
|
||||
if((int)strlen(newName)>=pdbFldDes->size) return(S_dbLib_nameLength);
|
||||
if (!precnode || dbIsAlias(pdbentry)) return S_dbLib_recNotFound;
|
||||
dbInitEntry(pdbentry->pdbbase,&dbentry);
|
||||
status = dbFindRecord(&dbentry,newName);
|
||||
dbFinishEntry(&dbentry);
|
||||
if(!status) return(S_dbLib_recExists);
|
||||
dbPvdDelete(pdbbase,precnode);
|
||||
pdbentry->pflddes = precordType->papFldDes[0];
|
||||
if((status = dbGetFieldAddress(pdbentry))) return(status);
|
||||
strcpy(pdbentry->pfield,newName);
|
||||
ppvd = dbPvdAdd(pdbbase,precordType,precnode);
|
||||
if(!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);}
|
||||
/*remove from record list and reinstall in sorted order*/
|
||||
preclist = &precordType->recList;
|
||||
ellDelete(preclist,&precnode->node);
|
||||
plistnode = (dbRecordNode *)ellFirst(preclist);
|
||||
while(plistnode) {
|
||||
pdbentry->precnode = plistnode;
|
||||
if(strcmp(newName,dbGetRecordName(pdbentry)) >=0) break;
|
||||
plistnode = (dbRecordNode *)ellNext(&plistnode->node);
|
||||
}
|
||||
if(plistnode)
|
||||
ellInsert(preclist,ellPrevious(&plistnode->node),&precnode->node);
|
||||
else
|
||||
ellAdd(preclist,&precnode->node);
|
||||
/*Leave pdbentry pointing to newly renamed record*/
|
||||
return(dbFindRecord(pdbentry,newName));
|
||||
}
|
||||
|
||||
long dbVisibleRecord(DBENTRY *pdbentry)
|
||||
{
|
||||
dbRecordNode *precnode = pdbentry->precnode;
|
||||
@@ -1709,7 +1651,6 @@ long dbCreateAlias(DBENTRY *pdbentry, const char *alias)
|
||||
dbRecordNode *pnewnode;
|
||||
PVDENTRY *ppvd;
|
||||
ELLLIST *preclist = NULL;
|
||||
long status;
|
||||
|
||||
if (!precordType) return S_dbLib_recordTypeNotFound;
|
||||
if (!precnode) return S_dbLib_recNotFound;
|
||||
@@ -1725,18 +1666,7 @@ long dbCreateAlias(DBENTRY *pdbentry, const char *alias)
|
||||
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);
|
||||
while (!status) {
|
||||
if (strcmp(alias, dbGetRecordName(pdbentry)) < 0) break;
|
||||
status = dbNextRecord(pdbentry);
|
||||
}
|
||||
if (!status) {
|
||||
precnode = pdbentry->precnode;
|
||||
ellInsert(preclist, ellPrevious(&precnode->node), &pnewnode->node);
|
||||
} else {
|
||||
ellAdd(preclist, &pnewnode->node);
|
||||
}
|
||||
ellAdd(preclist, &pnewnode->node);
|
||||
precordType->no_aliases++;
|
||||
pdbentry->precnode = pnewnode;
|
||||
ppvd = dbPvdAdd(pdbentry->pdbbase, precordType, pnewnode);
|
||||
|
||||
@@ -146,8 +146,6 @@ epicsShareFunc long dbNextRecord(DBENTRY *pdbentry);
|
||||
epicsShareFunc int dbGetNRecords(DBENTRY *pdbentry);
|
||||
epicsShareFunc int dbGetNAliases(DBENTRY *pdbentry);
|
||||
epicsShareFunc char * dbGetRecordName(DBENTRY *pdbentry);
|
||||
epicsShareFunc long dbRenameRecord(DBENTRY *pdbentry,
|
||||
const char *newName);
|
||||
epicsShareFunc long dbCopyRecord(DBENTRY *pdbentry,
|
||||
const char *newRecordName, int overWriteOK);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user