Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2715f585e0 | ||
|
|
c2e3315f54 | ||
|
|
d0ddcead24 | ||
|
|
5f42eec15a | ||
|
|
20e55d5bca | ||
|
|
6d2d63621e |
@@ -2,6 +2,19 @@
|
|||||||
|
|
||||||
This document summarizes the changes to the module between releases.
|
This document summarizes the changes to the module between releases.
|
||||||
|
|
||||||
|
## Release 4.4.2 (EPICS 7.0.2.2, Apr 2019)
|
||||||
|
|
||||||
|
Formerly if a client makes a request for a subfield of a non structure field
|
||||||
|
it resulted in a crash.
|
||||||
|
|
||||||
|
Now if a request is made for a subfield of a non structure field
|
||||||
|
|
||||||
|
1) if the field is not a union an exception is thrown which is passed to the client.
|
||||||
|
2) if the field is a union
|
||||||
|
a) if more than one subfield is requested an exception is thrown
|
||||||
|
b) if the subfield is the type for the current union the request succeeds
|
||||||
|
c) if type is not the same an exception is thrown
|
||||||
|
|
||||||
## Release 4.4.1 (EPICS 7.0.2.1, Mar 2019)
|
## Release 4.4.1 (EPICS 7.0.2.1, Mar 2019)
|
||||||
|
|
||||||
* Cleaned up some build warnings.
|
* Cleaned up some build warnings.
|
||||||
@@ -35,5 +48,3 @@ The test is now a regression test which can be run using:
|
|||||||
This is the first release of pvDatabaseCPP.
|
This is the first release of pvDatabaseCPP.
|
||||||
|
|
||||||
It provides functionality equivalent to pvDatabaseJava.
|
It provides functionality equivalent to pvDatabaseJava.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ PVDATABASE_SRC = $(TOP)/src
|
|||||||
LIBRARY += pvDatabase
|
LIBRARY += pvDatabase
|
||||||
|
|
||||||
# shared library ABI version.
|
# shared library ABI version.
|
||||||
SHRLIB_VERSION ?= 4.4.1
|
SHRLIB_VERSION ?= 4.4.2
|
||||||
|
|
||||||
INC += pv/channelProviderLocal.h
|
INC += pv/channelProviderLocal.h
|
||||||
INC += pv/pvDatabase.h
|
INC += pv/pvDatabase.h
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ PVFieldPtr PVCopy::getMasterPVField(size_t structureOffset)
|
|||||||
node = getMasterNode(snode,structureOffset);
|
node = getMasterNode(snode,structureOffset);
|
||||||
}
|
}
|
||||||
if(!node) {
|
if(!node) {
|
||||||
throw std::invalid_argument(
|
throw std::logic_error(
|
||||||
"PVCopy::getMasterPVField: structureOffset not valid");
|
"PVCopy::getMasterPVField: structureOffset not valid");
|
||||||
}
|
}
|
||||||
size_t diff = structureOffset - node->structureOffset;
|
size_t diff = structureOffset - node->structureOffset;
|
||||||
@@ -248,7 +248,7 @@ PVStructurePtr PVCopy::getOptions(std::size_t fieldOffset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(okToContinue) continue;
|
if(okToContinue) continue;
|
||||||
throw std::invalid_argument("fieldOffset not valid");
|
throw std::logic_error("PVCopy logic error: fieldOffset not valid");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,7 +464,13 @@ StructureConstPtr PVCopy::createStructure(
|
|||||||
fields.push_back(field);
|
fields.push_back(field);
|
||||||
}
|
}
|
||||||
size_t numsubfields = fields.size();
|
size_t numsubfields = fields.size();
|
||||||
if(numsubfields==0) return NULLStructure;
|
if(numsubfields==0) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << pvFromRequest << "\n";
|
||||||
|
string val("no fields from the following request were found\n");
|
||||||
|
val += ss.str();
|
||||||
|
throw std::invalid_argument(val);
|
||||||
|
}
|
||||||
return getFieldCreate()->createStructure(fieldNames, fields);
|
return getFieldCreate()->createStructure(fieldNames, fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,16 +493,65 @@ CopyNodePtr PVCopy::createStructureNodes(
|
|||||||
requestPVStructure->getSubField<PVStructure>("_options");
|
requestPVStructure->getSubField<PVStructure>("_options");
|
||||||
PVFieldPtr pvMasterField = pvMasterStructure->getSubField(fieldName);
|
PVFieldPtr pvMasterField = pvMasterStructure->getSubField(fieldName);
|
||||||
if(!pvMasterField) {
|
if(!pvMasterField) {
|
||||||
throw std::logic_error("did not find field in master");
|
throw std::logic_error("PVCopy logic error: did not find field in master");
|
||||||
}
|
}
|
||||||
size_t numberRequest = requestPVStructure->getPVFields().size();
|
size_t numberRequest = requestPVStructure->getPVFields().size();
|
||||||
if(pvSubFieldOptions) numberRequest--;
|
bool haveOptions = false;
|
||||||
|
if(pvSubFieldOptions) {
|
||||||
|
numberRequest--;
|
||||||
|
haveOptions = true;
|
||||||
|
}
|
||||||
if(numberRequest>0) {
|
if(numberRequest>0) {
|
||||||
nodes->push_back(createStructureNodes(
|
Type copyType = copyPVField->getField()->getType();
|
||||||
static_pointer_cast<PVStructure>(pvMasterField),
|
if(copyType==epics::pvData::structure) {
|
||||||
requestPVStructure,
|
nodes->push_back(createStructureNodes(
|
||||||
static_pointer_cast<PVStructure>(copyPVField)));
|
static_pointer_cast<PVStructure>(pvMasterField),
|
||||||
continue;
|
requestPVStructure,
|
||||||
|
static_pointer_cast<PVStructure>(copyPVField)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(copyType==epics::pvData::union_) {
|
||||||
|
if(numberRequest!=1) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << pvFromRequest << "\n";
|
||||||
|
string val("In the following request a union field has more than one subfield in\n");
|
||||||
|
val += ss.str();
|
||||||
|
throw std::invalid_argument(val);
|
||||||
|
}
|
||||||
|
PVUnionPtr pvUnion = static_pointer_cast<PVUnion>(pvMasterField);
|
||||||
|
std::string selectedName = pvUnion->getSelectedFieldName();
|
||||||
|
PVFieldPtrArray const & pvFields = requestPVStructure->getPVFields();
|
||||||
|
size_t len = pvFields.size();
|
||||||
|
if(len>2 || (haveOptions && len!=2)) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << pvFromRequest << "\n";
|
||||||
|
string val("PVCopy logic error: pvRequest is\n");
|
||||||
|
val += ss.str();
|
||||||
|
throw std::logic_error(val);
|
||||||
|
}
|
||||||
|
size_t indRequestValue = 0;
|
||||||
|
if((pvFields[0]->getFieldName().compare("_options"))==0) indRequestValue = 1;
|
||||||
|
PVFieldPtr pvRequestValue = pvFields[indRequestValue];
|
||||||
|
if(pvRequestValue) {
|
||||||
|
string requestName = pvRequestValue->getFieldName();
|
||||||
|
if(requestName.compare(selectedName)!=0) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << pvFromCopy << "\n";
|
||||||
|
string requestName = pvRequestValue->getFieldName();
|
||||||
|
string val("field ");
|
||||||
|
val += requestName + " does not match union type in\n";
|
||||||
|
val += ss.str();
|
||||||
|
throw std::invalid_argument(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << pvFromCopy << "\n";
|
||||||
|
string val("requested a subfield of field ");
|
||||||
|
val += fieldName + " which does not have type structure in\n";
|
||||||
|
val += ss.str();
|
||||||
|
throw std::invalid_argument(val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CopyNodePtr node(new CopyNode());
|
CopyNodePtr node(new CopyNode());
|
||||||
node->options = pvSubFieldOptions;
|
node->options = pvSubFieldOptions;
|
||||||
|
|||||||
Reference in New Issue
Block a user