diff --git a/src/copy/createRequest.cpp b/src/copy/createRequest.cpp index 67c246d..6260162 100644 --- a/src/copy/createRequest.cpp +++ b/src/copy/createRequest.cpp @@ -322,149 +322,155 @@ public: virtual PVStructurePtr createRequest( string const & crequest) { - string request = crequest; - if (!request.empty()) removeBlanks(request); - if (request.empty()) - { - return pvDataCreate->createPVStructure(fieldCreate->createStructure()); - } - size_t offsetRecord = request.find("record["); - size_t offsetField = request.find("field("); - size_t offsetPutField = request.find("putField("); - size_t offsetGetField = request.find("getField("); - if(offsetRecord==string::npos - && offsetField==string::npos - && offsetPutField==string::npos - && offsetGetField==string::npos) - { - request = "field(" + request + ")"; - offsetField = request.find("field("); - } - int numParan = 0; - int numBrace = 0; - int numBracket = 0; - for(size_t i=0; i< request.length() ; ++i) { - char chr = request[i]; - if(chr=='(') numParan++; - if(chr==')') numParan--; - if(chr=='{') numBrace++; - if(chr=='}') numBrace--; - if(chr=='[') numBracket++; - if(chr==']') numBracket--; - } - if(numParan!=0) { - ostringstream oss; - oss << "mismatched () " << numParan; - message = oss.str(); - return PVStructurePtr(); - } - if(numBrace!=0) { - ostringstream oss; - oss << "mismatched {} " << numBrace; - message = oss.str(); - return PVStructurePtr(); - } - if(numBracket!=0) { - ostringstream oss; - oss << "mismatched [] " << numBracket; - message = oss.str(); - return PVStructurePtr(); - } - vector top; try { - if(offsetRecord!=string::npos) { - fullFieldName = "record"; - size_t openBracket = request.find('[', offsetRecord); - size_t closeBracket = request.find(']', openBracket); - if(closeBracket==string::npos) { - message = request.substr(offsetRecord) + - "record[ does not have matching ]"; - return PVStructurePtr(); + string request = crequest; + if (!request.empty()) removeBlanks(request); + if (request.empty()) + { + return pvDataCreate->createPVStructure(fieldCreate->createStructure()); + } + size_t offsetRecord = request.find("record["); + size_t offsetField = request.find("field("); + size_t offsetPutField = request.find("putField("); + size_t offsetGetField = request.find("getField("); + if(offsetRecord==string::npos + && offsetField==string::npos + && offsetPutField==string::npos + && offsetGetField==string::npos) + { + request = "field(" + request + ")"; + offsetField = request.find("field("); + } + int numParan = 0; + int numBrace = 0; + int numBracket = 0; + for(size_t i=0; i< request.length() ; ++i) { + char chr = request[i]; + if(chr=='(') numParan++; + if(chr==')') numParan--; + if(chr=='{') numBrace++; + if(chr=='}') numBrace--; + if(chr=='[') numBracket++; + if(chr==']') numBracket--; + } + if(numParan!=0) { + ostringstream oss; + oss << "mismatched () " << numParan; + message = oss.str(); + return PVStructurePtr(); + } + if(numBrace!=0) { + ostringstream oss; + oss << "mismatched {} " << numBrace; + message = oss.str(); + return PVStructurePtr(); + } + if(numBracket!=0) { + ostringstream oss; + oss << "mismatched [] " << numBracket; + message = oss.str(); + return PVStructurePtr(); + } + vector top; + try { + if(offsetRecord!=string::npos) { + fullFieldName = "record"; + size_t openBracket = request.find('[', offsetRecord); + size_t closeBracket = request.find(']', openBracket); + if(closeBracket==string::npos) { + message = request.substr(offsetRecord) + + "record[ does not have matching ]"; + return PVStructurePtr(); + } + if(closeBracket-openBracket > 3) { + Node node("record"); + Node optNode = createRequestOptions( + request.substr(openBracket+1,closeBracket-openBracket-1)); + node.nodes.push_back(optNode); + top.push_back(node); + } } - if(closeBracket-openBracket > 3) { - Node node("record"); - Node optNode = createRequestOptions( - request.substr(openBracket+1,closeBracket-openBracket-1)); - node.nodes.push_back(optNode); + if(offsetField!=string::npos) { + fullFieldName = "field"; + Node node("field"); + size_t openParan = request.find('(', offsetField); + size_t closeParan = request.find(')', openParan); + if(closeParan==string::npos) { + message = request.substr(offsetField) + + " field( does not have matching )"; + return PVStructurePtr(); + } + if(closeParan>openParan+1) { + createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); + } top.push_back(node); } + if(offsetGetField!=string::npos) { + fullFieldName = "getField"; + Node node("getField"); + size_t openParan = request.find('(', offsetGetField); + size_t closeParan = request.find(')', openParan); + if(closeParan==string::npos) { + message = request.substr(offsetField) + + " getField( does not have matching )"; + return PVStructurePtr(); + } + if(closeParan>openParan+1) { + createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); + } + top.push_back(node); + } + if(offsetPutField!=string::npos) { + fullFieldName = "putField"; + Node node("putField"); + size_t openParan = request.find('(', offsetPutField); + size_t closeParan = request.find(')', openParan); + if(closeParan==string::npos) { + message = request.substr(offsetField) + + " putField( does not have matching )"; + return PVStructurePtr(); + } + if(closeParan>openParan+1) { + createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); + } + top.push_back(node); + } + } catch (std::exception &e) { + string xxx = e.what(); + message = "while creating Structure exception " + xxx; + return PVStructurePtr(); } - if(offsetField!=string::npos) { - fullFieldName = "field"; - Node node("field"); - size_t openParan = request.find('(', offsetField); - size_t closeParan = request.find(')', openParan); - if(closeParan==string::npos) { - message = request.substr(offsetField) - + " field( does not have matching )"; - return PVStructurePtr(); + size_t num = top.size(); + StringArray names(num); + FieldConstPtrArray fields(num); + for(size_t i=0; i subNode = node.nodes; + if(subNode.empty()) { + fields[i] = fieldCreate->createStructure(); + } else { + fields[i] = createSubStructure(subNode); } - if(closeParan>openParan+1) { - createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); - } - top.push_back(node); } - if(offsetGetField!=string::npos) { - fullFieldName = "getField"; - Node node("getField"); - size_t openParan = request.find('(', offsetGetField); - size_t closeParan = request.find(')', openParan); - if(closeParan==string::npos) { - message = request.substr(offsetField) - + " getField( does not have matching )"; - return PVStructurePtr(); - } - if(closeParan>openParan+1) { - createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); - } - top.push_back(node); - } - if(offsetPutField!=string::npos) { - fullFieldName = "putField"; - Node node("putField"); - size_t openParan = request.find('(', offsetPutField); - size_t closeParan = request.find(')', openParan); - if(closeParan==string::npos) { - message = request.substr(offsetField) - + " putField( does not have matching )"; - return PVStructurePtr(); - } - if(closeParan>openParan+1) { - createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); - } - top.push_back(node); + StructureConstPtr structure = fieldCreate->createStructure(names, fields); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(structure); + for(size_t i=0; igetSubField(name); + pvField->put(value); } + optionList.clear(); + return pvStructure; } catch (std::exception &e) { - string xxx = e.what(); - message = "while creating Structure exception " + xxx; - return PVStructurePtr(); + message = e.what(); + return PVStructurePtr(); } - size_t num = top.size(); - StringArray names(num); - FieldConstPtrArray fields(num); - for(size_t i=0; i subNode = node.nodes; - if(subNode.empty()) { - fields[i] = fieldCreate->createStructure(); - } else { - fields[i] = createSubStructure(subNode); - } - } - StructureConstPtr structure = fieldCreate->createStructure(names, fields); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(structure); - for(size_t i=0; igetSubField(name); - pvField->put(value); - } - optionList.clear(); - return pvStructure; } + }; CreateRequest::shared_pointer CreateRequest::create() diff --git a/testApp/copy/testCreateRequest.cpp b/testApp/copy/testCreateRequest.cpp index 3c0db1c..4df1b89 100644 --- a/testApp/copy/testCreateRequest.cpp +++ b/testApp/copy/testCreateRequest.cpp @@ -30,7 +30,7 @@ static void testCreateRequestInternal() { string request = ""; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getStructure()->getNumberFields()==0); @@ -39,7 +39,7 @@ static void testCreateRequestInternal() { request = "record[]field()getField()putField()"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("field").get()!=NULL); @@ -50,7 +50,7 @@ static void testCreateRequestInternal() { request = "record[a=b,x=y]field(a) putField(a),getField(a)"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("record._options.a"); @@ -67,7 +67,7 @@ static void testCreateRequestInternal() { request = "field(a.b[x=y])"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); @@ -78,7 +78,7 @@ static void testCreateRequestInternal() { request = "field(a.b{c.d})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("field.a.b.c.d").get()!=NULL); @@ -87,7 +87,7 @@ static void testCreateRequestInternal() { request = "field(a.b[x=y]{c.d})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); @@ -99,7 +99,7 @@ static void testCreateRequestInternal() { request = "field(a.b[x=y]{c.d[x=y]})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); @@ -113,7 +113,7 @@ static void testCreateRequestInternal() { request = "record[a=b,c=d] field(a.a[a=b]{a.a[a=b]},b.a[a=b]{a,b})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("field.a.a._options.a"); @@ -133,7 +133,7 @@ static void testCreateRequestInternal() { request = "alarm,timeStamp,power.value"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("field.alarm").get()!=NULL); @@ -144,7 +144,7 @@ static void testCreateRequestInternal() { request = "record[process=true]field(alarm,timeStamp,power.value)"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("record._options.process"); @@ -158,7 +158,7 @@ static void testCreateRequestInternal() { request = "record[process=true]field(alarm,timeStamp[algorithm=onChange,causeMonitor=false],power{value,alarm})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("record._options.process"); @@ -179,7 +179,7 @@ static void testCreateRequestInternal() { request = "record[int=2,float=3.14159]field(alarm,timeStamp[shareData=true],power.value)"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); pvString = pvRequest->getSubField("record._options.int"); @@ -201,7 +201,7 @@ static void testCreateRequestInternal() { + "current{value,alarm},voltage{value,alarm})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("putField.power.value").get()!=NULL); @@ -221,7 +221,7 @@ static void testCreateRequestInternal() { + "})"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("field.alarm").get()!=NULL); @@ -243,7 +243,7 @@ static void testCreateRequestInternal() { + ")"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("putField.power.value").get()!=NULL); @@ -276,7 +276,7 @@ static void testCreateRequestInternal() { request = "a{b{c{d}}}"; if(debug) { cout << "request " << request <createRequest(request); - if(pvRequest.get()==NULL) { cout<< createRequest->getMessage() << endl;} + if(!pvRequest) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} testOk1(pvRequest.get()!=NULL); testOk1(pvRequest->getSubField("field.a.b.c.d").get()!=NULL); @@ -302,11 +302,19 @@ static void testCreateRequestInternal() { cout << "reason " << createRequest->getMessage() << endl; testOk1(pvRequest.get()==NULL); testPass("request %s",request.c_str()); + + request = "field(alarm.status,alarm.severity)"; + if(debug) { cout << "request " << request <createRequest(request); + cout << "reason " << createRequest->getMessage() << endl; + testOk1(pvRequest.get()==NULL); + testPass("request %s",request.c_str()); } MAIN(testCreateRequest) { - testPlan(117); + testPlan(119); testCreateRequestInternal(); return testDone(); }