static long pvNameLookup(DBENTRY *pdbe, const char **ppname) { long status; dbInitEntry(pdbbase, pdbe); status = dbFindRecordPart(pdbe, ppname); if (status) return status; if (**ppname == '.') ++*ppname; status = dbFindFieldPart(pdbe, ppname); if (status == S_dbLib_fieldNotFound) status = dbGetAttributePart(pdbe, ppname); return status; }
/* * Fill out a database structure (*paddr) for * a record given by the name "pname." * * Returns error codes from StaticLib module, not * from dbAccess. */ long dbNameToAddr(const char *pname, DBADDR *paddr) { DBENTRY dbEntry; dbFldDes *pflddes; long status = 0; short dbfType; if (!pname || !*pname || !pdbbase) return S_db_notFound; dbInitEntry(pdbbase, &dbEntry); status = dbFindRecordPart(&dbEntry, &pname); if (status) goto finish; if (*pname == '.') ++pname; status = dbFindFieldPart(&dbEntry, &pname); if (status == S_dbLib_fieldNotFound) status = dbGetAttributePart(&dbEntry, &pname); if (status) goto finish; pflddes = dbEntry.pflddes; dbfType = pflddes->field_type; paddr->precord = dbEntry.precnode->precord; paddr->pfield = dbEntry.pfield; paddr->pfldDes = pflddes; paddr->no_elements = 1; paddr->field_type = dbfType; paddr->field_size = pflddes->size; paddr->special = pflddes->special; paddr->dbr_field_type = mapDBFToDBR[dbfType]; if (paddr->special == SPC_DBADDR) { struct rset *prset = dbGetRset(paddr); /* Let record type modify paddr */ if (prset && prset->cvt_dbaddr) { status = prset->cvt_dbaddr(paddr); if (status) goto finish; dbfType = paddr->field_type; } } /* Handle field modifiers */ if (*pname++ == '$') { /* Some field types can be accessed as char arrays */ if (dbfType == DBF_STRING) { paddr->no_elements = paddr->field_size; paddr->field_type = DBF_CHAR; paddr->field_size = 1; paddr->dbr_field_type = DBR_CHAR; } else if (dbfType >= DBF_INLINK && dbfType <= DBF_FWDLINK) { /* Clients see a char array, but keep original dbfType */ paddr->no_elements = PVNAME_STRINGSZ + 12; paddr->field_size = 1; paddr->dbr_field_type = DBR_CHAR; } else { status = S_dbLib_fieldNotFound; goto finish; } } finish: dbFinishEntry(&dbEntry); return status; }
/* * Fill out a database structure (*paddr) for * a record given by the name "pname." * * Returns error codes from StaticLib module, not * from dbAccess. */ long epicsShareAPI dbNameToAddr(const char *pname, DBADDR *paddr) { DBENTRY dbEntry; dbFldDes *pflddes; struct rset *prset; long status = 0; long no_elements = 1; short dbfType, dbrType, field_size; if (!pname || !*pname || !pdbbase) return S_db_notFound; dbInitEntry(pdbbase, &dbEntry); status = dbFindRecordPart(&dbEntry, &pname); if (status) goto finish; if (*pname == '.') ++pname; status = dbFindFieldPart(&dbEntry, &pname); if (status == S_dbLib_fieldNotFound) status = dbGetAttributePart(&dbEntry, &pname); if (status) goto finish; paddr->precord = dbEntry.precnode->precord; paddr->pfield = dbEntry.pfield; pflddes = dbEntry.pflddes; dbfType = pflddes->field_type; dbrType = mapDBFToDBR[dbfType]; field_size = pflddes->size; if (*pname++ == '$') { /* Some field types can be accessed as char arrays */ if (dbfType == DBF_STRING) { dbfType = DBF_CHAR; dbrType = DBR_CHAR; no_elements = field_size; field_size = 1; } else if (dbfType >= DBF_INLINK && dbfType <= DBF_FWDLINK) { /* Clients see a char array, but keep original dbfType */ dbrType = DBR_CHAR; no_elements = PVNAME_STRINGSZ + 12; field_size = 1; } else { status = S_dbLib_fieldNotFound; goto finish; } } paddr->pfldDes = pflddes; paddr->field_type = dbfType; paddr->dbr_field_type = dbrType; paddr->field_size = field_size; paddr->special = pflddes->special; paddr->no_elements = no_elements; if ((paddr->special == SPC_DBADDR) && (prset = dbGetRset(paddr)) && prset->cvt_dbaddr) /* cvt_dbaddr routine may change any of these elements of paddr: * pfield, no_elements, element_offset, field_type, * dbr_field_type, field_size, and/or special. */ status = prset->cvt_dbaddr(paddr); finish: dbFinishEntry(&dbEntry); return status; }