From 9cb14b5f13cc7018c0d43d09a51a299b7061b1df Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 16 Mar 1998 16:21:50 +0000 Subject: [PATCH] add support for field attributes --- src/db/dbAccess.c | 341 ++++++++++++++++++++++++---------------------- src/db/dbAccess.h | 42 ++---- src/db/iocInit.c | 2 +- 3 files changed, 195 insertions(+), 190 deletions(-) diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index 871347092..42e25908b 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -397,6 +397,21 @@ struct rset *dbGetRset(struct dbAddr *paddr) return(pfldDes->pdbRecordType->prset); } +long dbPutAttribute(char *recordTypename,char *name,char*value) +{ + DBENTRY dbEntry; + DBENTRY *pdbEntry = &dbEntry; + long status=0; + + if(!pdbbase) return(S_db_notFound); + dbInitEntry(pdbbase,pdbEntry); + status = dbFindRecordType(pdbEntry,recordTypename); + if(!status) status = dbPutRecordAttribute(pdbEntry,name,value); + dbFinishEntry(pdbEntry); + if(status) errMessage(status,"dbPutAttribute failure"); + return(status); +} + int dbIsValueField(struct dbFldDes *pdbFldDes) { if(pdbFldDes->pdbRecordType->indvalFlddes == pdbFldDes->indRecordType) @@ -634,13 +649,16 @@ long dbNameToAddr(const char *pname,DBADDR *paddr) if(!pdbbase) return(S_db_notFound); dbInitEntry(pdbbase,&dbEntry); - if((status = dbFindRecord(&dbEntry,pname))) return(status); - paddr->precord = dbEntry.precnode->precord; - if(!dbEntry.pfield) { - if((status=dbFindField(&dbEntry,"VAL"))) return(status); + status = dbFindRecord(&dbEntry,pname); + if(!status && !dbEntry.pfield) status=dbFindField(&dbEntry,"VAL"); + if(status) { + dbFinishEntry(&dbEntry); + return(status); } + paddr->precord = dbEntry.precnode->precord; paddr->pfield = dbEntry.pfield; pflddes = dbEntry.pflddes; + dbFinishEntry(&dbEntry); paddr->pfldDes = (void *)pflddes; paddr->field_type = pflddes->field_type; paddr->dbr_field_type = mapDBFToDBR[pflddes->field_type]; @@ -710,9 +728,9 @@ long dbGetLinkValue(struct link *plink, short dbrType, void *pbuffer, if(poptions) *poptions = 0; if(pnRequest) *pnRequest = 0; } else if(plink->type==DB_LINK) { - dbCommon *precord = plink->value.pv_link.precord; struct pv_link *ppv_link = &(plink->value.pv_link); DBADDR *paddr = ppv_link->pvt; + dbCommon *precord = plink->value.pv_link.precord; /* scan passive records with links that are process passive */ if(ppv_link->pvlMask&pvlOptPP) { @@ -743,7 +761,9 @@ long dbGetLinkValue(struct link *plink, short dbrType, void *pbuffer, /* attempt to make a fast link */ if((!poptions || (*poptions == 0)) && (no_elements == 1) - && (!pnRequest || (*pnRequest == 1))) { + && (!pnRequest || (*pnRequest == 1)) + && (paddr->special!=SPC_ATTRIBUTE) ) + { ppv_link->getCvt = dbFastGetConvertRoutine[dbfType][dbrType]; status = (*ppv_link->getCvt) (paddr->pfield,pbuffer, paddr); }else{ @@ -816,47 +836,46 @@ long dbPutLinkValue(struct link *plink,short dbrType, } long dbGetField( DBADDR *paddr,short dbrType,void *pbuffer, - long *options,long *nRequest,void *pflin) + long *options,long *nRequest,void *pflin) { - dbCommon *precord = (dbCommon *)(paddr->precord); - long status = 0; - short dbfType = paddr->field_type; + short dbfType = paddr->field_type; + dbCommon *precord = (dbCommon *)(paddr->precord); + long status = 0; - dbScanLock(precord); - if(dbfType>=DBF_INLINK && dbfType<=DBF_FWDLINK) { - DBENTRY dbEntry; - dbFldDes *pfldDes = (dbFldDes *)paddr->pfldDes; - char *rtnString; - char *pbuf = (char *)pbuffer; + dbScanLock(precord); + if(dbfType>=DBF_INLINK && dbfType<=DBF_FWDLINK) { + DBENTRY dbEntry; + dbFldDes *pfldDes = (dbFldDes *)paddr->pfldDes; + char *rtnString; + char *pbuf = (char *)pbuffer; - if(dbrType!=DBR_STRING) { - status = S_db_badDbrtype; - goto done; - } - if(options && (*options)) - getOptions(paddr,(void **)&pbuf,options,pflin); - if(nRequest && *nRequest==0) goto done; - dbInitEntry(pdbbase,&dbEntry); - if((status = dbFindRecord(&dbEntry,precord->name))) goto done; - if((status = dbFindField(&dbEntry,pfldDes->name))) goto done; - rtnString = dbGetString(&dbEntry); - /*begin kludge for old db_access MAX_STRING_SIZE*/ - if(strlen(rtnString)>=MAX_STRING_SIZE) { - strncpy(pbuf,rtnString,MAX_STRING_SIZE-1); - pbuf[MAX_STRING_SIZE-1] = 0; - } else { - strcpy(pbuf,rtnString); - } - /*end kludge for old db_access MAX_STRING_SIZE*/ - dbFinishEntry(&dbEntry); - goto done; - - } else { - status = dbGet(paddr,dbrType,pbuffer,options,nRequest,pflin); + if(dbrType!=DBR_STRING) { + status = S_db_badDbrtype; + goto done; } + if(options && (*options))getOptions(paddr,(void **)&pbuf,options,pflin); + if(nRequest && *nRequest==0) goto done; + dbInitEntry(pdbbase,&dbEntry); + status = dbFindRecord(&dbEntry,precord->name); + if(!status) status = dbFindField(&dbEntry,pfldDes->name); + if(!status) { + rtnString = dbGetString(&dbEntry); + /*begin kludge for old db_access MAX_STRING_SIZE*/ + if(strlen(rtnString)>=MAX_STRING_SIZE) { + strncpy(pbuf,rtnString,MAX_STRING_SIZE-1); + pbuf[MAX_STRING_SIZE-1] = 0; + } else { + strcpy(pbuf,rtnString); + } + /*end kludge for old db_access MAX_STRING_SIZE*/ + } + dbFinishEntry(&dbEntry); + } else { + status = dbGet(paddr,dbrType,pbuffer,options,nRequest,pflin); + } done: - dbScanUnlock(precord); - return(status); + dbScanUnlock(precord); + return(status); } long dbGet(DBADDR *paddr,short dbrType,void *pbuffer,long *options, @@ -871,7 +890,12 @@ long dbGet(DBADDR *paddr,short dbrType,void *pbuffer,long *options, long status = 0; char message[80]; - + if(paddr->special == SPC_ATTRIBUTE) { + if(dbrType!=DBR_STRING) return(S_db_badDbrtype); + if(!paddr->pfield) return(S_db_badField); + strcpy((char *)pbuffer,(char *)paddr->pfield); + return(0); + } prset=dbGetRset(paddr); if(options && (*options)) { void *pbuf = pbuffer; @@ -940,133 +964,125 @@ long dbGet(DBADDR *paddr,short dbrType,void *pbuffer,long *options, long dbPutField(DBADDR *paddr,short dbrType,const void *pbuffer,long nRequest) { - long status = 0; - long special=paddr->special; - dbFldDes *pfldDes=(dbFldDes *)(paddr->pfldDes); - dbCommon *precord = (dbCommon *)(paddr->precord); - short dbfType = paddr->field_type; + long status = 0; + long special=paddr->special; + dbFldDes *pfldDes=(dbFldDes *)(paddr->pfldDes); + dbCommon *precord = (dbCommon *)(paddr->precord); + short dbfType = paddr->field_type; - /*check for putField disabled*/ - if(precord->disp) { - if((void *)(&precord->disp) != paddr->pfield) return(0); + if(special==SPC_ATTRIBUTE) return(S_db_noMod); + /*check for putField disabled*/ + if(precord->disp) { + if((void *)(&precord->disp) != paddr->pfield) return(0); + } + if(dbfType>=DBF_INLINK && dbfType<=DBF_FWDLINK) { + DBLINK *plink = (DBLINK *)paddr->pfield; + DBENTRY dbEntry; + dbFldDes *pfldDes = (dbFldDes *)paddr->pfldDes; + char buffer[MAX_STRING_SIZE+2]; + int len,j; + char *lastblank; + + if(dbrType!=DBR_STRING) return(S_db_badDbrtype); + /*begin kludge for old db_access MAX_STRING_SIZE*/ + /*Allow M for MS and (N or NM) for NMS */ + strcpy(buffer,(char *)pbuffer); + /*Strip trailing blanks*/ + len = strlen(buffer); + for(j=len-1; j>0; j--) { + if(buffer[j]==' ') + buffer[j] = 0; + else + break; } - if(dbfType>=DBF_INLINK && dbfType<=DBF_FWDLINK) { - DBLINK *plink = (DBLINK *)paddr->pfield; - DBENTRY dbEntry; - dbFldDes *pfldDes = (dbFldDes *)paddr->pfldDes; - char buffer[MAX_STRING_SIZE+2]; - int len,j; - char *lastblank; + lastblank = strrchr(buffer,' '); + if(lastblank) { + if(strcmp(lastblank,"M")==0) { + strcpy(lastblank,"MS"); + } else { + if((strcmp(lastblank,"N")==0) || (strcmp(lastblank,"NM")==0)) { + strcpy(lastblank,"NMS"); + } + } + } + /*End kludge for old db_access MAX_STRING_SIZE*/ + dbLockSetGblLock(); + dbLockSetRecordLock(precord); + if((plink->type == DB_LINK)||(plink->type == CA_LINK)) { + if(plink->type == DB_LINK) { + free(plink->value.pv_link.pvt); + plink->value.pv_link.pvt = 0; + plink->type = PV_LINK; + dbLockSetSplit(precord); + } else if(plink->type == CA_LINK) { + dbCaRemoveLink(plink); + } + plink->value.pv_link.getCvt = 0; + plink->value.pv_link.pvlMask = 0; + plink->value.pv_link.lastGetdbrType = 0; + plink->type = PV_LINK; + } + dbInitEntry(pdbbase,&dbEntry); + status=dbFindRecord(&dbEntry,precord->name); + if(!status) status=dbFindField(&dbEntry,pfldDes->name); + if(!status && special) status = putSpecial(paddr,0); + if(!status) status=dbPutString(&dbEntry,buffer); + dbFinishEntry(&dbEntry); + if(!status && special) status = putSpecial(paddr,1); + if(status) goto done; + if(plink->type == PV_LINK) { + DBADDR dbaddr; - if(dbrType!=DBR_STRING) return(S_db_badDbrtype); - /*begin kludge for old db_access MAX_STRING_SIZE*/ - /*Allow M for MS and (N or NM) for NMS */ - strcpy(buffer,(char *)pbuffer); - /*Strip trailing blanks*/ - len = strlen(buffer); - for(j=len-1; j>0; j--) { - if(buffer[j]==' ') - buffer[j] = 0; - else - break; - } - lastblank = strrchr(buffer,' '); - if(lastblank) { - if(strcmp(lastblank,"M")==0) { - strcpy(lastblank,"MS"); - } else { - if((strcmp(lastblank,"N")==0) - || (strcmp(lastblank,"NM")==0)) { - strcpy(lastblank,"NMS"); - } - } - } - /*End kludge for old db_access MAX_STRING_SIZE*/ - dbLockSetGblLock(); - dbLockSetRecordLock(precord); - if((plink->type == DB_LINK)||(plink->type == CA_LINK)) { - if(plink->type == DB_LINK) { - free(plink->value.pv_link.pvt); - plink->value.pv_link.pvt = 0; - plink->type = PV_LINK; - dbLockSetSplit(precord); - } else if(plink->type == CA_LINK) { - dbCaRemoveLink(plink); - } - plink->value.pv_link.getCvt = 0; - plink->value.pv_link.pvlMask = 0; - plink->value.pv_link.lastGetdbrType = 0; - plink->type = PV_LINK; - } - dbInitEntry(pdbbase,&dbEntry); - if((status=dbFindRecord(&dbEntry,precord->name))) goto done; - if((status=dbFindField(&dbEntry,pfldDes->name))) goto done; - /* check for special processing is required */ - if(special) { - status = putSpecial(paddr,0); - if(status) return(status); - } - if((status=dbPutString(&dbEntry,buffer))) goto done; - if(special) { - status = putSpecial(paddr,1); - if(status) return(status); - } - if(plink->type == PV_LINK) { - DBADDR dbaddr; + if(!(plink->value.pv_link.pvlMask &(pvlOptCA|pvlOptCP|pvlOptCPP)) + &&(dbNameToAddr(plink->value.pv_link.pvname,&dbaddr)==0)){ + DBADDR *pdbAddr; - if(!(plink->value.pv_link.pvlMask - &(pvlOptCA|pvlOptCP|pvlOptCPP)) - &&(dbNameToAddr(plink->value.pv_link.pvname,&dbaddr)==0)){ - DBADDR *pdbAddr; + plink->type = DB_LINK; + pdbAddr = dbCalloc(1,sizeof(struct dbAddr)); + *pdbAddr = dbaddr; /*structure copy*/; + plink->value.pv_link.precord = precord; + plink->value.pv_link.pvt = pdbAddr; + dbLockSetMerge(precord,pdbAddr->precord); + } else {/*It is a CA link*/ + char *pperiod; - plink->type = DB_LINK; - pdbAddr = dbCalloc(1,sizeof(struct dbAddr)); - *pdbAddr = dbaddr; /*structure copy*/; - plink->value.pv_link.precord = precord; - plink->value.pv_link.pvt = pdbAddr; - dbLockSetMerge(precord,pdbAddr->precord); - } else {/*It is a CA link*/ - char *pperiod; - - plink->type = CA_LINK; - plink->value.pv_link.precord = precord; - if(pfldDes->field_type==DBF_INLINK) { - plink->value.pv_link.pvlMask |= pvlOptInpNative; - } - dbCaAddLink(plink); - if(pfldDes->field_type==DBF_FWDLINK) { - pperiod = strrchr(plink->value.pv_link.pvname, - '.'); - if(pperiod && strstr(pperiod,"PROC")) - plink->value.pv_link.pvlMask |= pvlOptFWD; - } - } + plink->type = CA_LINK; + plink->value.pv_link.precord = precord; + if(pfldDes->field_type==DBF_INLINK) { + plink->value.pv_link.pvlMask |= pvlOptInpNative; } - db_post_events(precord,plink,DBE_VALUE|DBE_LOG); - dbFinishEntry(&dbEntry); + dbCaAddLink(plink); + if(pfldDes->field_type==DBF_FWDLINK) { + pperiod = strrchr(plink->value.pv_link.pvname,'.'); + if(pperiod && strstr(pperiod,"PROC")) + plink->value.pv_link.pvlMask |= pvlOptFWD; + } + } + } + db_post_events(precord,plink,DBE_VALUE|DBE_LOG); done: - dbLockSetGblUnlock(); - return(status); - } - dbScanLock(precord); - status=dbPut(paddr,dbrType,pbuffer,nRequest); - if(status==0){ - if((paddr->pfield==(void *)&precord->proc) - ||(pfldDes->process_passive && precord->scan==0 - && dbrTypepact) { - if(precord->tpro) - printf("active: %s\n",precord->name); - precord->rpro = TRUE; - } else { - /*indicate that dbPutField called dbProcess*/ - precord->putf = TRUE; - status=dbProcess(precord); - } - } - } - dbScanUnlock(precord); + dbLockSetGblUnlock(); return(status); + } + dbScanLock(precord); + status=dbPut(paddr,dbrType,pbuffer,nRequest); + if(status==0){ + if((paddr->pfield==(void *)&precord->proc) + ||(pfldDes->process_passive && precord->scan==0 + && dbrTypepact) { + if(precord->tpro) + printf("active: %s\n",precord->name); + precord->rpro = TRUE; + } else { + /*indicate that dbPutField called dbProcess*/ + precord->putf = TRUE; + status=dbProcess(precord); + } + } + } + dbScanUnlock(precord); + return(status); } static long putAckt(paddr,pbuffer,nRequest,no_elements,offset) @@ -1120,6 +1136,7 @@ long dbPut(DBADDR *paddr,short dbrType,const void *pbuffer,long nRequest) int isValueField; char message[80]; + if(special==SPC_ATTRIBUTE) return(S_db_noMod); if(dbrType==DBR_PUT_ACKT && field_type<=DBF_DEVICE) { status=putAckt(paddr,pbuffer,(long)1,(long)1,(long)0); return(status); diff --git a/src/db/dbAccess.h b/src/db/dbAccess.h index 30647b257..d7e941401 100644 --- a/src/db/dbAccess.h +++ b/src/db/dbAccess.h @@ -1,31 +1,21 @@ /* dbAccess.h */ -/* $Id$ +/***************************************************************** + COPYRIGHT NOTIFICATION +***************************************************************** + +(C) COPYRIGHT 1993 UNIVERSITY OF CHICAGO + +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +**********************************************************************/ + +/* $Id$ * * Original Author: Bob Dalesio * Current Author: Marty Kraimer * Date: 6-1-90 * - * Experimental Physics and Industrial Control System (EPICS) - * - * Copyright 1991, the Regents of the University of California, - * and the University of Chicago Board of Governors. - * - * This software was produced under U.S. Government contracts: - * (W-7405-ENG-36) at the Los Alamos National Laboratory, - * and (W-31-109-ENG-38) at Argonne National Laboratory. - * - * Initial development by: - * The Controls and Automation Group (AT-8) - * Ground Test Accelerator - * Accelerator Technology Division - * Los Alamos National Laboratory - * - * Co-developed with - * The Controls and Computing Group - * Accelerator Systems Division - * Advanced Photon Source - * Argonne National Laboratory - * * Modification Log: * ----------------- * .01 12-18-91 jba Changed caddr_t to void * @@ -53,9 +43,6 @@ #include #include "dbAddr.h" - - - /* The database field and request types are defined in dbFldTypes.h*/ /* Data Base Request Options */ #define DBR_STATUS 0x00000001 @@ -185,7 +172,7 @@ struct dbr_alDouble {DBRalDouble}; #define dbr_ctrlDouble_size sizeof(struct dbr_ctrlDouble) #define dbr_alLong_size sizeof(struct dbr_alLong) #define dbr_alDouble_size sizeof(struct dbr_alDouble) - + #ifndef INCerrMdefh #include #endif @@ -212,7 +199,7 @@ struct dbr_alDouble {DBRalDouble}; #define S_db_bkptLogic (M_dbAccess|61) /*Logic error in breakpoint routine*/ #define S_db_cntSpwn (M_dbAccess|63) /*Cannot spawn dbContTask*/ #define S_db_cntCont (M_dbAccess|65) /*Cannot resume dbContTask*/ - + /* Global Database Access Routines*/ #define dbGetLink(PLNK,DBRTYPE,PBUFFER,OPTIONS,NREQUEST) \ (((((PLNK)->type == CONSTANT)&&(!(NREQUEST))) ||\ @@ -234,6 +221,7 @@ struct dbr_alDouble {DBRalDouble}; #ifdef __STDC__ struct rset *dbGetRset(struct dbAddr *paddr); +long dbPutAttribute(char *recordTypename,char *name,char*value); int dbIsValueField(struct dbFldDes *pdbFldDes); int dbGetFieldIndex(struct dbAddr *paddr); long dbGetNelements(struct link *plink,long *nelements); diff --git a/src/db/iocInit.c b/src/db/iocInit.c index 87d5c1591..cad5526c2 100644 --- a/src/db/iocInit.c +++ b/src/db/iocInit.c @@ -139,7 +139,7 @@ int iocInit(char * pResourceFilename) return(-1); } - epicsPrintf("Starting iocInit"); + epicsPrintf("Starting iocInit\n"); if (!pdbbase) { epicsPrintf("iocInit aborting because No database\n"); return(-1);