# pvDatabaseCPP

## Release ? - TBD

Latest update 2019.09.11.

## Abstract

This document describes pvDatabaseCPP, which is a framework for implementing a network accessible database of smart memory resident records. Network access is via pvAccess. The data in each record is a top level PVStructure as defined by pvData. The framework includes a complete implementation of ChannelProvider as defined by pvAccess. The framework can be extended in order to create record instances that implements services. The minimum that an extension must provide is a top level PVStructure and a process method.

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial Control System.

## Overview

pvDatabaseCPP is one of the components of EPICS Version 7

This document is only a guide to help locate code and documentation related to pvDatabaseCPP It is intended for developers that want to use pvDatabaseCPP.

## Developer Guide

A guide for developers is available at developerGuide

This guide discusses all the components that are part of an EPICS V4 release. Some understanding of the components and how they are related is necessary in order to develop code that uses pvDatabaseCPP. In particular read everything related to pvDatabase.

pvDatabase has plugin support, which is implemented in pvCopy. pvCopy was originally implemented in pvDataCPP, but pvDatabaseCPP now implements its own version and adds plugin support.

See pvRequest for details.

The developerGuide discusses code in a way that applies to both CPP and C++. For the descriptions of the CPP specific code consult the following sections.

## doxygen

doxygen documentation is available at doxgen

## pvDatabaseCPP

### include/pv

The header files that describe the various components implemented by pvDatabase.

pvDatabase.h
  This describes PVRecord and PVDatabase.
channelProviderLocal.h
  This describes a channel provider for PVDatabase
pvSupport.h
  This is the base class for support attached to a field of a record.
controlSupport.h
  This is support that implements control limits.
scalarAlarmSupport.h
  This is support for a alarm limits for a scalar numeric field.
processRecord.h
  This is a PVRecord that periodical processes a set of PVRecords in the local PVDatabase.
addRecord.h
  This is a PVRecord that adds a new PVRecord to the local PVDatabase.
removeRecord.h
  This is a PVRecord that removes a PVRecord in the local PVDatabase.
traceRecord.h
  This is a PVRecord that sets the trace value for another PVRecord in the local PVDatabase.
pvStructureCopy.h
  This is a facility that allows a client to access a subfield of the fields in a PVRecord. It also provides record and field options an plugin support.
pvPlugin.h
  This is the base class for a plugin attached to a record or field of PVRecord.
pvArrayPlugin.h
  A plugin for accessing a subset of the elements in an array field.
pvDeadbandPlugin.h
  A deadband plugin for monitors.
pvTimestampPlugin.h
  A plugin for timeStamp.

### src/database

This has the code that implements pvDatabase and pvRecord.

### src/pvAccess

This has the code for the channel provider for pvDatabase.

### src/support

This has the pvSupport code.

### src/special

This has the code for processRecord, addRecord, removeRecord, and traceRecord.

### src/copy

This has the code for pvStructureCopy and all the plugin support.

## exampleCPP

Example code is available as part of this release. exampleCPP

In particular look at the example code mentioned in the following sub-sections.

### database

This has many examples of how to create both soft records and records that implement other functionality.

exampleDatabase.cpp
  This shows how to create soft records of each pvData type.
  In addition shows how to create instances of the following two records.
exampleHelloRecord.cpp
  This is a simple "hello world" that is intentended to be used via a channelPutGet request.
exampleHelloRPC.cpp
  This is a simple "hello world" that is intentended to be used via a channelRPC request.
exampleDatabaseMain.cpp
  This shows how to create a standalone IOC.
ioc and iocBoot
  This has code and examples to create a V3 IOC which also has a PVDatabase.

### exampleLink

This shows how to implement a record that has a link to another record

exampleMonitorLinkRecord
  This creates a monitor link to another record.
exampleGetLinkRecord
  This creates a get link to another record.
examplePutLinkRecord
  This creates a put link to another record.

### support

This creates records that have the following features:

value
  Each record has a value field the is a numeric scalar field. In addition each has the following fields: alarm,timeStamp,control,scalarAlarm, and display.
support
  Each record uses the control and scalarAlarm support provided by pvDatabaseCPP.

It also creates records that can be used by clients to show example of the plugin support.

## iocshell commands

Shell commands are made available via the standard DBD include mechanism provided by iocCore. The following provide EPICS V4 shell commands:

    pvAccessCPP
    qsrv
    pvDatabaseCPP

pvDatabaseCPP provides the following iocshell command.

registerChannelProviderLocal
  Including registerChannelProviderLocal.dbd as a dbd file automatically starts provider local and also creates the pvdbl shell command.
pvdbl
  Provides a list of all the pvRecords in database master

In addition any code that implements a PVRecord must implement an ioc command. Look at the examples in exampleCPP/support to see how to implement shell commands.