12 #include <epicsVersion.h> 22 # define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P)) 25 #ifndef EPICS_VERSION_INT 26 # define EPICS_VERSION_INT VERSION_INT(EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL) 29 #if EPICS_VERSION_INT>=VERSION_INT(3,16,0,2) 30 # define USE_MULTILOCK 43 long copyPVD2DBF(
const epics::pvData::PVField::const_shared_pointer& in,
44 void *outbuf,
short outdbf,
long *outnReq);
48 const epics::pvData::PVField::shared_pointer& out,
63 #ifdef EPICS_VERSION_INT 64 # if EPICS_VERSION_INT>=VERSION_INT(3,16,1,0) 75 explicit DBCH(dbChannel *ch);
76 explicit DBCH(
const std::string& name);
81 operator dbChannel*() {
return chan; }
82 operator const dbChannel*()
const {
return chan; }
93 std::vector<char>
user, host;
94 std::vector<std::vector<char> >
groups;
95 void update(
const std::tr1::shared_ptr<epics::pvAccess::ChannelRequester>&
request);
104 void add(dbChannel* chan,
ASCred& cred);
114 throw std::runtime_error(ent.
message);
120 const char *
info(
const char *key,
const char *
def =0)
144 #if EPICS_VERSION_INT>=VERSION_INT(3,16,1,0) 145 dbInitEntryFromRecord(dbChannelRecord(chan), &ent);
149 throw std::logic_error(
"Record not found");
153 #if EPICS_VERSION_INT>=VERSION_INT(3,16,1,0) 156 dbInitEntryFromRecord(prec, &ent);
164 bool done()
const {
return m_done; }
185 const char *
info(
const char *key,
const char *
def =0)
205 bool done()
const {
return m_done; }
224 void create(dbEventCtx ctx, dbChannel *ch, EVENTFUNC *
fn,
unsigned mask)
226 subscript = db_add_event(ctx, ch, fn,
this, mask);
228 throw std::runtime_error(
"Failed to subscribe to dbEvent");
233 if(subscript) db_cancel_event(subscript);
249 if(!pfl && (
ellCount(&pchan->pre_chain)!=0 ||
ellCount(&pchan->pre_chain)==0)) {
250 pfl = db_create_read_log(pchan);
253 pfl = dbChannelRunPreChain(pchan, pfl);
254 if(pfl) pfl = dbChannelRunPostChain(pchan, pfl);
259 if(ours) db_delete_field_log(pfl);
267 { dbScanLock(prec); }
269 { dbScanLock(prec); }
271 { dbScanUnlock(prec); }
279 DBManyLock() :plock(
NULL) {}
280 DBManyLock(
const std::vector<dbCommon*>& recs,
unsigned flags=0)
281 :plock(dbLockerAlloc( (recs.size() > 0 ? (dbCommon**)&recs[0] :
NULL), recs.size(), flags))
283 if(!plock)
throw std::invalid_argument(
"Failed to create locker");
285 DBManyLock(dbCommon *
const *precs,
size_t nrecs,
unsigned flags=0)
286 :plock(dbLockerAlloc((dbCommon**)precs, nrecs, flags))
288 if(!plock)
throw std::invalid_argument(
"Failed to create locker");
290 ~DBManyLock() {
if(plock) dbLockerFree(plock); }
291 void swap(DBManyLock& O) {
std::swap(plock, O.plock); }
292 operator dbLocker*() {
return plock; }
294 DBManyLock(
const DBManyLock&);
295 DBManyLock& operator=(
const DBManyLock&);
301 DBManyLocker(dbLocker *L) :plock(L)
303 dbScanLockMany(plock);
307 dbScanUnlockMany(plock);
319 :name(name), index(index)
333 bool empty()
const {
return parts.empty(); }
334 size_t size()
const {
return parts.size(); }
346 #if !defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 403) 378 PVIF& operator=(
const PVIF&);
389 const std::string& fld,
397 static PVIFBuilder* create(
const std::string& name);
pdbRecordIterator(const dbChannel *chan)
void dbInitEntry(dbBase *pdbbase, DBENTRY *pdbentry)
const char * dbGetInfoName(DBENTRY *pdbentry)
long dbFirstRecordType(DBENTRY *pdbentry)
long dbNextInfo(DBENTRY *pdbentry)
dbEventSubscription subscript
std::tr1::shared_ptr< detail::SharedPut > put
#define ellCount(PLIST)
Report the number of nodes in a list.
short PVD2DBR(epics::pvData::ScalarType pvt)
const Component & operator[](size_t i) const
const char * info(const char *key, const char *def=0)
unsigned short epicsUInt16
Component(const std::string &name, epicsUInt32 index=(epicsUInt32)-1)
const char * info(const char *key, const char *def=0)
void dbFinishEntry(DBENTRY *pdbentry)
TODO only here because of the Lockable.
DBScanLocker(dbChannel *chan)
bucket * lookup(char *name)
long dbNextRecordType(DBENTRY *pdbentry)
PVField is the base class for each PVData field.
long dbFindRecord(DBENTRY *pdbentry, const char *pname)
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
long dbNextRecord(DBENTRY *pdbentry)
unsigned long long epicsUInt64
long dbFindRecordPart(DBENTRY *pdbentry, const char **ppname)
std::vector< std::vector< char > > groups
QSRV_API long copyDBF2PVD(const epics::pvData::shared_vector< const void > &buf, const epics::pvData::PVField::shared_pointer &out, epics::pvData::BitSet &changed, const epics::pvData::PVStringArray::const_svector &choices)
const char * dbGetInfoString(DBENTRY *pdbentry)
long dbFindInfo(DBENTRY *pdbentry, const char *name)
void create(dbEventCtx ctx, dbChannel *ch, EVENTFUNC *fn, unsigned mask)
std::tr1::shared_ptr< const Field > FieldConstPtr
const Component & back() const
std::vector< ASCLIENTPVT > grppvt
long dbFirstInfo(DBENTRY *pdbentry)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
void dbCopyEntryContents(DBENTRY *pfrom, DBENTRY *pto)
const ChannelProviderRegistry::factoryfn_t fn
std::tr1::shared_ptr< PVField > PVFieldPtr
void swap(shared_ptr< T > &a, shared_ptr< T > &b) BOOST_NOEXCEPT
long dbFirstRecord(DBENTRY *pdbentry)
std::vector< Component > parts_t
DBScanLocker(dbCommon *prec)
QSRV_API long copyPVD2DBF(const epics::pvData::PVField::const_shared_pointer &in, void *outbuf, short outdbf, long *outnReq)
pdbRecordInfo(const char *name)
const char * name() const
const dbChannel * operator->() const
pdbInfoIterator(const pdbRecordIterator &I)
LocalFL(db_field_log *pfl, dbChannel *pchan)
dbCommon * record() const