diff --git a/src/copy/pvArrayPlugin.cpp b/src/copy/pvArrayPlugin.cpp index acab57d..01b646a 100644 --- a/src/copy/pvArrayPlugin.cpp +++ b/src/copy/pvArrayPlugin.cpp @@ -151,8 +151,10 @@ bool PVArrayFilter::filter(const PVFieldPtr & pvField,const BitSetPtr & bitSet,b { PVFieldPtr pvCopy = pvField; PVScalarArrayPtr copyArray; + bool isUnion = false; Type type = masterField->getField()->getType(); if(type==epics::pvData::union_) { + isUnion = true; PVUnionPtr pvMasterUnion = std::tr1::static_pointer_cast(masterField); PVUnionPtr pvCopyUnion = std::tr1::static_pointer_cast(pvCopy); if(toCopy) pvCopyUnion->copy(*pvMasterUnion); @@ -194,6 +196,7 @@ bool PVArrayFilter::filter(const PVFieldPtr & pvField,const BitSetPtr & bitSet,b } } copyArray->setLength(len); + bitSet->set(pvField->getFieldOffset()); return true; } if (end - start >= 0) len = 1 + (end - start) / increment; @@ -210,7 +213,7 @@ bool PVArrayFilter::filter(const PVFieldPtr & pvField,const BitSetPtr & bitSet,b indto += increment; } } - masterField->postPut(); + if(isUnion) masterField->postPut(); return true; } diff --git a/test/src/testPlugin.cpp b/test/src/testPlugin.cpp index f0cbd59..5a46685 100644 --- a/test/src/testPlugin.cpp +++ b/test/src/testPlugin.cpp @@ -145,6 +145,73 @@ static void arrayTest() testOk1(nset==1); } +static void unionArrayTest() +{ + if(debug) {cout << endl << endl << "****unionArrayTest****" << endl;} + bool result = false; + uint32 nset = 0; + size_t n = 10; + shared_vector values(n); + for(size_t i=0; i(PVDataCreate::getPVDataCreate()->createPVScalarArray(pvDouble)); + const shared_vector yyy(freeze(values)); + pvDoubleArray->putFrom(yyy); + + StandardFieldPtr standardField = getStandardField(); + FieldCreatePtr fieldCreate = getFieldCreate(); + StructureConstPtr top = fieldCreate->createFieldBuilder()-> + add("value",fieldCreate->createVariantUnion()) -> + add("timeStamp", standardField->timeStamp()) -> + addNestedStructure("subfield") -> + add("value",fieldCreate->createVariantUnion()) -> + endNested()-> + createStructure(); + PVStructurePtr pvRecordStructure(PVDataCreate::getPVDataCreate()->createPVStructure(top)); + PVRecordPtr pvRecord(PVRecord::create("unionArrayRecord",pvRecordStructure)); + PVUnionPtr pvUnion = pvRecord->getPVStructure()->getSubField("value"); + pvUnion->set(pvDoubleArray); + pvUnion = pvRecord->getPVStructure()->getSubField("subfield.value"); + pvUnion->set(pvDoubleArray); + if(debug) { cout << "initial\n" << pvRecordStructure << "\n";} + + PVStructurePtr pvRequest(CreateRequest::create()->createRequest("value[array=1:3]")); + PVCopyPtr pvCopy(PVCopy::create(pvRecordStructure,pvRequest,"")); + PVStructurePtr pvStructureCopy(pvCopy->createPVStructure()); + BitSetPtr bitSet(new BitSet(pvStructureCopy->getNumberFields())); + PVDoubleArrayPtr pvValue(pvRecordStructure->getSubField("value")); + result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet); + nset = bitSet->cardinality(); + if(debug) { + cout << "after get value" + << " result " << (result ? "true" : "false") + << " nset " << nset + << " bitSet " << *bitSet + << " pvStructureCopy\n" << pvStructureCopy + << "\n"; + } + testOk1(result==true); + testOk1(nset==1); + + pvRequest = CreateRequest::create()->createRequest("subfield.value[array=1:3]"); + pvCopy = PVCopy::create(pvRecordStructure,pvRequest,""); + pvStructureCopy = pvCopy->createPVStructure(); + bitSet = BitSetPtr(new BitSet(pvStructureCopy->getNumberFields())); + pvValue = pvRecordStructure->getSubField("subfield.value"); + result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet); + nset = bitSet->cardinality(); + if(debug) { + cout << "after get subfield.value" + << " result " << (result ? "true" : "false") + << " nset " << nset + << " bitSet " << *bitSet + << " pvStructureCopy\n" << pvStructureCopy + << "\n"; + } + testOk1(result==true); + testOk1(nset==1); +} + static void timeStampTest() { if(debug) {cout << endl << endl << "****timeStampTest****" << endl;} @@ -267,10 +334,11 @@ static void ignoreTest() MAIN(testPlugin) { - testPlan(22); + testPlan(26); PVDatabasePtr pvDatabase(PVDatabase::getMaster()); deadbandTest(); arrayTest(); + unionArrayTest(); timeStampTest(); ignoreTest(); return 0;