From b558e11ede76dfbc6a89ca4c51d0f669fe6db8c7 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Tue, 19 Aug 2014 08:25:38 -0400 Subject: [PATCH] major changes to CreateRequest; now compatible with Java version --- documentation/Doxyfile | 2 +- src/copy/createRequest.cpp | 649 +++++++++++++---------------- testApp/copy/testCreateRequest.cpp | 291 ++++++------- 3 files changed, 421 insertions(+), 521 deletions(-) diff --git a/documentation/Doxyfile b/documentation/Doxyfile index 55df4dd..71c896d 100644 --- a/documentation/Doxyfile +++ b/documentation/Doxyfile @@ -580,7 +580,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = ../pvDataApp +INPUT = ../include/pv # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is diff --git a/src/copy/createRequest.cpp b/src/copy/createRequest.cpp index 37b1c5f..f80dc24 100644 --- a/src/copy/createRequest.cpp +++ b/src/copy/createRequest.cpp @@ -18,6 +18,7 @@ using std::tr1::static_pointer_cast; using std::cout; using std::endl; using std::string; +using std::vector; namespace epics { namespace pvData { @@ -27,6 +28,38 @@ static FieldCreatePtr fieldCreate = getFieldCreate(); class CreateRequestImpl : public CreateRequest { private: + struct Node + { + string name; + vector nodes; + Node(string name) + : name(name) + {} + }; + + struct OptionPair + { + string name; + string value; + OptionPair(string name,string value) + : name(name), + value(value) + {} + }; + + + vector optionList; + string fullFieldName; + + +public: + CreateRequestImpl() + { + fullFieldName = ""; + } +private: + + void removeBlanks(string& str) { while(true) { @@ -40,8 +73,8 @@ private: size_t openBrace = request.find('{', index+1); size_t closeBrace = request.find('}', index+1); if(openBrace == string::npos && closeBrace == string::npos){ - message = request + " missing }"; - return string::npos; + message = request + " mismatched {}"; + throw std::logic_error("message"); } if (openBrace != string::npos && openBrace!=0) { if(openBrace=maxind) break; ++ind; } return request.size(); } - std::vector split(string const & commaSeparatedList) { + vector split(string const & commaSeparatedList) { string::size_type numValues = 1; string::size_type index=0; while(true) { @@ -99,7 +136,7 @@ private: numValues++; index = pos +1; } - std::vector valueList(numValues,""); + vector valueList(numValues,""); index=0; for(size_t i=0; i items = split(request); + if(request.length()<=1) { + throw std::logic_error("logic error empty options"); + } + vector top; + vector items = split(request); + size_t nitems = items.size(); - StringArray fieldNames(nitems); - FieldConstPtrArray fields(nitems); for(size_t j=0; jcreateScalar(pvString); - } - StringArray names(1); - FieldConstPtrArray field(1); - names[0] = "_options"; - field[0] = fieldCreate->createStructure(fieldNames,fields); - return fieldCreate->createStructure(names,field); - } - - void initRequestOptions( - PVStructurePtr const & pvParent, - string request) - { - if(request.length()<=1) return; - std::vector items = split(request); - size_t nitems = items.size(); - for(size_t j=0; jgetSubField(name); - pvValue->put(value); + optionList.push_back(OptionPair(name,value)); } - } - - StructureConstPtr createSubFieldRequest( - StructureConstPtr parent, - string request) - { - if(request.length()<=0) return parent; - size_t period = request.find('.'); - size_t openBracket = request.find('['); - size_t openBrace = request.find('{'); - - // name only - if(period==string::npos - && openBracket==string::npos - && openBrace==string::npos) - { - StructureConstPtr subField = fieldCreate->createStructure(); - parent = fieldCreate->appendField(parent,request,subField); - return parent; - } - - // period is first - if(period!=string::npos - && (openBracket==string::npos || periodcreateStructure(); - subField = createSubFieldRequest(subField,request.substr(period+1)); - if(!subField) return subField; - parent = fieldCreate->appendField(parent,fieldName,subField); - return parent; - } - - // brace before [ or . - if(openBrace!=string::npos - && (openBracket==string::npos || openBrace= request.size()) nextChar = string::npos; - if(nextChar!=string::npos) { - message = request + " syntax error " + request[nextChar] + " after } illegal"; - return StructureConstPtr(); - } - StructureConstPtr subField = fieldCreate->createStructure(); - string subRequest = request.substr(openBrace+1,closeBrace-openBrace-1); - subField = createFieldRequest(subField,subRequest); - if(!subField) return subField; - parent = fieldCreate->appendField(parent,fieldName,subField); - return parent; - } - - // [ is before brace or . - if(openBracket!=string::npos - && (openBrace==string::npos || openBracket= request.size()) nextChar = string::npos; - if(nextChar==string::npos) { - StringArray fieldNames(1); - FieldConstPtrArray fields(1); - fieldNames[0] = "_options"; - fields[0] = createRequestOptions( - request.substr(openBracket+1,closeBracket-openBracket-1)); - StructureConstPtr subField = fieldCreate->createStructure(fieldNames,fields); - parent = fieldCreate->appendField(parent,fieldName,subField); - return parent; - } - if(request[nextChar]=='.') { - StructureConstPtr subField = fieldCreate->createStructure(); - subField = createSubFieldRequest(subField,request.substr(nextChar+1)); - if(!subField) return StructureConstPtr(); - if(subField->getNumberFields()!=1) { - message = request + " logic error createSubFieldRequest openBracket subField"; - return StructureConstPtr(); - } - StringArray fieldNames(2); - FieldConstPtrArray fields(2); - fieldNames[0] = "_options"; - fields[0] = createRequestOptions( - request.substr(openBracket+1,closeBracket-openBracket-1)); - fieldNames[1] = subField->getFieldNames()[0]; - fields[1] = subField; - subField = fieldCreate->createStructure(fieldNames,fields); - parent = fieldCreate->appendField(parent,fieldName,subField); - return parent; - } - if(request[nextChar]=='{') { - size_t closeBrace = findMatchingBrace(request,openBrace,1); - if(closeBrace==string::npos) return StructureConstPtr(); - StructureConstPtr subField = fieldCreate->createStructure(); - string subRequest = request.substr(openBrace+1,closeBrace-openBrace-1); - subField = createFieldRequest(subField,subRequest); - if(!subField) return subField; - size_t numSub = subField->getNumberFields(); - StringArray fieldNames(numSub + 1); - FieldConstPtrArray fields(numSub+1); - fieldNames[0] = "_options"; - fields[0] = createRequestOptions( - request.substr(openBracket+1,closeBracket-openBracket-1)); - StringArray subNames = subField->getFieldNames(); - FieldConstPtrArray subFields = subField->getFields(); - for(size_t i=0; iappendFields(parent,fieldNames,fields); - parent = fieldCreate->appendField(parent,fieldName,subField); - return parent; - } - } - message = request + " logic error createSubFieldRequest"; - return StructureConstPtr(); + Node node("_options"); + node.nodes = top; + return node; } - StructureConstPtr createFieldRequest( - StructureConstPtr parent, - string request) + void createSubNode(Node &node,string const & crequest) { - size_t length = request.length(); - if(length<=0) return parent; - size_t end = findEndField(request); - if(end==string::npos) return StructureConstPtr(); - StringArray fieldNames; - FieldConstPtrArray fields; - StructureConstPtr subField = fieldCreate->createStructure(); - subField = createSubFieldRequest(subField,request.substr(0,end)); - if(!subField) return subField; - fieldNames.push_back(subField->getFieldNames()[0]); - fields.push_back(subField->getFields()[0]); - if(end!=length) { - if(request[end]!=',') { - message = request; - message += " expected char "; - message += length; - message += " to be ,"; - return StructureConstPtr(); - } - StructureConstPtr nextSubField = fieldCreate->createStructure(); - nextSubField = createFieldRequest(nextSubField,request.substr(end+1)); - if(!nextSubField) return nextSubField; - size_t numFields = nextSubField->getNumberFields(); - StringArray subNames = nextSubField->getFieldNames(); - FieldConstPtrArray subFields = nextSubField->getFields(); - for(size_t i=0; iappendFields(parent,fieldNames,fields); - return parent; - } - - void initSubFieldOptions( - PVStructurePtr const & pvParent, - string request) - { - if(request.length()<=0) return; - size_t period = request.find('.'); - size_t openBracket = request.find('['); - size_t openBrace = request.find('{'); - // name only - if(period==string::npos - && openBracket==string::npos - && openBrace==string::npos) - { - return; + char chr = request[end]; + Node optionNode(""); + if(chr=='[') { + string saveFullName = fullFieldName; + fullFieldName += "." + request.substr(0,end); + size_t endBracket = findMatchingBracket(request,end); + string options = request.substr(end+1,endBracket -end -1); + optionNode = createRequestOptions(options); + fullFieldName = saveFullName; + size_t next = endBracket+1; + if(next(pvParent->getPVFields()[0]); - initSubFieldOptions(pvSubField,request.substr(period+1)); + if(end==0) end = request.size(); + string name = request.substr(0,end); + if(name.size()<1) { + throw std::logic_error("null field name " + request); + } + string saveFullName = fullFieldName; + fullFieldName += "." + name; + if(end==request.size()) { + Node subNode(name); + if(optionNode.name.size()>0) subNode.nodes.push_back(optionNode); + node.nodes.push_back(subNode); + fullFieldName = saveFullName; return; } - - // brace before [ or . - if(openBrace!=string::npos - && (openBracket==string::npos || openBrace(pvParent->getPVFields()[0]); - size_t closeBrace = findMatchingBrace(request,openBrace,1); - string subRequest = request.substr(openBrace+1,closeBrace-openBrace-1); - initFieldOptions(pvSubField,subRequest); + if(chr==',') { + Node subNode(name); + if(optionNode.name.size()>0) subNode.nodes.push_back(optionNode); + node.nodes.push_back(subNode); + string rest = request.substr(end+1); + fullFieldName = saveFullName; + createSubNode(node,rest); return; } - PVStructurePtr pvOptions = pvParent->getSubField("_options"); - if(!pvOptions) throw std::logic_error("initSubFieldOptions pvOptions NULL"); - size_t closeBracket = findMatchingBracket(request,openBracket); - initRequestOptions(pvOptions,request.substr(openBracket+1,closeBracket-openBracket-1)); - size_t nextChar = closeBracket+1; - if(nextChar>= request.size()) nextChar = string::npos; - if(nextChar==string::npos) return; - if(request[nextChar]=='.') { - PVStructurePtr pvSubField = static_pointer_cast(pvParent->getPVFields()[1]); - initSubFieldOptions(pvSubField,request.substr(nextChar+1)); + if(chr=='.') { + request = request.substr(end+1); + if(request.size()==string::npos || request.size()<1) { + throw std::logic_error("null field name " + request); + } + Node subNode(name); + if(optionNode.name.size()>0) subNode.nodes.push_back(optionNode); + size_t endField = findEndField(request); + string subRequest = request.substr(0, endField); + createSubNode(subNode,subRequest); + node.nodes.push_back(subNode); + size_t next = endField+1; + if(next>=request.size()) { + fullFieldName = saveFullName; + return; + } + request = request.substr(next); + fullFieldName = saveFullName; + createSubNode(node,request); return; } - if(request[nextChar]!='{') throw std::logic_error("initSubFieldOptions request[nextChar]!='{'"); - size_t closeBrace = findMatchingBrace(request,openBrace,1); - const PVFieldPtrArray &pvFields = pvParent->getPVFields(); - string subRequest = request.substr(openBrace+1,closeBrace-openBrace-1); - for(size_t i=1; i(pvFields[i]); - size_t comma = subRequest.find(','); - initSubFieldOptions(pvSubField, subRequest.substr(0,comma-1)); - subRequest = subRequest.substr(comma+1); + if(chr=='{') { + size_t endBrace = findEndField(request); + if((end+1)>=(endBrace-1)) { + throw std::logic_error("illegal syntax " + request); + } + string subRequest = request.substr(end+1,endBrace-1 -end -1); + if(subRequest.size()<1) { + throw std::logic_error("empty {} " + request); + } + Node subNode(name); + if(optionNode.name.size()>0) subNode.nodes.push_back(optionNode); + createSubNode(subNode,subRequest); + node.nodes.push_back(subNode); + size_t next = endBrace + 1; + if(next>=request.size()) { + fullFieldName = saveFullName; + return; + } + request = request.substr(next); + fullFieldName = saveFullName; + createSubNode(node,request); + return; } + throw std::logic_error("logic error"); } - void initFieldOptions( - PVStructurePtr const & pvParent, - string request) + FieldConstPtr createSubStructure(vector & nodes) { - if(request.find('[')==string::npos) return; - size_t num = pvParent->getStructure()->getNumberFields(); - if(num==0) return; - if(num==1) { - initSubFieldOptions(pvParent,request); - return; - } - size_t end = findEndField(request); - size_t start = 0; + size_t num = nodes.size(); + StringArray names(num); + FieldConstPtrArray fields(num); for(size_t i=0; i(pvParent->getPVFields()[i]); - string subRequest = request.substr(start, end - start); - initSubFieldOptions(pvSub,subRequest); - if(i==num-1) break; - start = end +1; - string xxx = request.substr(start); - end += findEndField(xxx) + 1; + Node node = nodes[i]; + names[i] = node.name; + if(node.name.compare("_options")==0) { + fields[i] = createOptions(node.nodes); + } else { + vector subNode = node.nodes; + if(subNode.empty()) { + fields[i] = fieldCreate->createStructure(); + } else { + fields[i] = createSubStructure(subNode); + } + } } + StructureConstPtr structure = fieldCreate->createStructure( + names, fields); + return structure; } + StructureConstPtr createOptions(vector &nodes) + { + size_t num = nodes.size(); + StringArray names(num); + FieldConstPtrArray fields(num); + for(size_t i=0; icreateScalar(pvString); + } + StructureConstPtr structure = fieldCreate->createStructure(names, fields); + return structure; + } public: - virtual PVStructure::shared_pointer createRequest( + virtual PVStructurePtr createRequest( string const & crequest) { string request = crequest; - StructureConstPtr topStructure = fieldCreate->createStructure(); - if (!request.empty()) removeBlanks(request); if (request.empty()) { - PVFieldPtrArray pvFields; - StringArray fieldNames; - return pvDataCreate->createPVStructure(fieldNames,pvFields); + return pvDataCreate->createPVStructure(fieldCreate->createStructure()); } size_t offsetRecord = request.find("record["); size_t offsetField = request.find("field("); @@ -420,108 +336,117 @@ public: && offsetPutField==string::npos && offsetGetField==string::npos) { - request = "field(" + crequest + ")"; + request = "field(" + request + ")"; offsetField = request.find("field("); } - if (offsetRecord != string::npos) { - 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(); - } - StructureConstPtr structure = createRequestOptions( - request.substr(openBracket+1,closeBracket-openBracket-1)); - if(!structure) - { - return PVStructurePtr(); - } - topStructure = fieldCreate->appendField(topStructure,"record",structure); + 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 (offsetField != string::npos) { - size_t openBrace = request.find('(', offsetField); - size_t closeBrace = request.find(')', openBrace); - if(closeBrace == string::npos) { - message = request.substr(offsetField) - + " field( does not have matching )"; - return PVStructurePtr(); - } - StructureConstPtr structure = fieldCreate->createStructure(); - structure = createFieldRequest(structure,request.substr(openBrace+1,closeBrace-openBrace-1)); - if(!structure) - { - return PVStructurePtr(); - } - topStructure = fieldCreate->appendField(topStructure,"field",structure); + if(numParan!=0) { + message = "mismatched () " + numParan; + return PVStructurePtr(); } - if (offsetPutField != string::npos) { - size_t openBrace = request.find('(', offsetPutField); - size_t closeBrace = request.find(')', openBrace); - if(closeBrace == string::npos) { - message = request.substr(offsetField) - + " putField( does not have matching )"; - return PVStructurePtr(); - } - StructureConstPtr structure = fieldCreate->createStructure(); - structure = createFieldRequest(structure,request.substr(openBrace+1,closeBrace-openBrace-1)); - if(!structure) - { - return PVStructurePtr(); - } - topStructure = fieldCreate->appendField(topStructure,"putField",structure); + if(numBrace!=0) { + message = "mismatched {} " + numBrace; + return PVStructurePtr(); } - if (offsetGetField != string::npos) { - size_t openBrace = request.find('(', offsetGetField); - size_t closeBrace = request.find(')', openBrace); - if(closeBrace == string::npos) { - message = request.substr(offsetField) - + " getField( does not have matching )"; - return PVStructurePtr(); - } - StructureConstPtr structure = fieldCreate->createStructure(); - structure = createFieldRequest(structure,request.substr(openBrace+1,closeBrace-openBrace-1)); - if(!structure) - { - return PVStructurePtr(); - } - topStructure = fieldCreate->appendField(topStructure,"getField",structure); + if(numBracket!=0) { + message = "mismatched [] " + numBracket; + return PVStructurePtr(); } - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - if (offsetRecord != string::npos) { - size_t openBracket = request.find('[', offsetRecord); - size_t closeBracket = request.find(']', openBracket); - initRequestOptions( - pvStructure->getSubField("record"), - request.substr(openBracket+1,closeBracket-openBracket-1)); - } - if (offsetField != string::npos) { - size_t openParam = request.find('(', offsetField); - size_t closeParam = request.find(')', openParam); - PVStructurePtr pvSub = pvStructure->getSubField("field"); - if(pvSub->getStructure()->getNumberFields()==1) { - pvSub = static_pointer_cast(pvSub->getPVFields()[0]); + 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(); + } + Node node("record"); + Node optNode = createRequestOptions( + request.substr(openBracket+1,closeBracket-openBracket-1)); + node.nodes.push_back(optNode); + top.push_back(node); } - if(pvSub) initFieldOptions(pvSub,request.substr(openParam+1,closeParam-openParam-1)); - } - if (offsetPutField != string::npos) { - size_t openParam = request.find('(', offsetPutField); - size_t closeParam = request.find(')', openParam); - PVStructurePtr pvSub = pvStructure->getSubField("putField"); - if(pvSub->getStructure()->getNumberFields()==1) { - pvSub = static_pointer_cast(pvSub->getPVFields()[0]); + if(offsetField!=string::npos) { + fullFieldName = "field"; + Node node("field"); + size_t openBrace = request.find('(', offsetField); + size_t closeBrace = request.find(')', openBrace); + if(closeBrace==string::npos) { + message = request.substr(offsetField) + + " field( does not have matching )"; + return PVStructurePtr(); + } + createSubNode(node,request.substr(openBrace+1,closeBrace-openBrace-1)); + top.push_back(node); } - if(pvSub) initFieldOptions(pvSub,request.substr(openParam+1,closeParam-openParam-1)); - } - if (offsetGetField != string::npos) { - size_t openParam = request.find('(', offsetGetField); - size_t closeParam = request.find(')', openParam); - PVStructurePtr pvSub = pvStructure->getSubField("getField"); - if(pvSub->getStructure()->getNumberFields()==1) { - pvSub = static_pointer_cast(pvSub->getPVFields()[0]); + if(offsetGetField!=string::npos) { + fullFieldName = "getField"; + Node node("getField"); + size_t openBrace = request.find('(', offsetGetField); + size_t closeBrace = request.find(')', openBrace); + if(closeBrace==string::npos) { + message = request.substr(offsetField) + + " getField( does not have matching )"; + return PVStructurePtr(); + } + createSubNode(node,request.substr(openBrace+1,closeBrace-openBrace-1)); + top.push_back(node); } - if(pvSub) initFieldOptions(pvSub,request.substr(openParam+1,closeParam-openParam-1)); + if(offsetPutField!=string::npos) { + fullFieldName = "putField"; + Node node("putField"); + size_t openBrace = request.find('(', offsetPutField); + size_t closeBrace = request.find(')', openBrace); + if(closeBrace==string::npos) { + message = request.substr(offsetField) + + " putField( does not have matching )"; + return PVStructurePtr(); + } + createSubNode(node,request.substr(openBrace+1,closeBrace-openBrace-1)); + top.push_back(node); + } + } catch (std::exception &e) { + string xxx = e.what(); + message = "while creating Structure exception " + xxx; + 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; } diff --git a/testApp/copy/testCreateRequest.cpp b/testApp/copy/testCreateRequest.cpp index 9f341d4..f2915c1 100644 --- a/testApp/copy/testCreateRequest.cpp +++ b/testApp/copy/testCreateRequest.cpp @@ -23,98 +23,88 @@ static bool debug = false; void testCreateRequest() { printf("testCreateRequest... \n"); CreateRequest::shared_pointer createRequest = CreateRequest::create(); + PVStringPtr pvString; + string sval; string out; string request = ""; if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout<< createRequest->getMessage() << endl;} - testOk1(pvRequest.get()!=0); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); testOk1(pvRequest->getStructure()->getNumberFields()==0); testPass("request %s",request.c_str()); - request = "record[a=b,x=y]field(a) putField(a),getField(a)"; - pvRequest = createRequest->createRequest(request); - if(!pvRequest) { - cout << createRequest->getMessage() << endl; - } if(debug) { cout << "request " << request <createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} - PVStringPtr pvString = pvRequest->getSubField("record._options.a"); - string sval = pvString->get(); + testOk1(pvRequest!=NULL); + pvString = pvRequest->getSubField("record._options.a"); + sval = pvString->get(); testOk(sval.compare("b")==0,"record.a = b"); pvString = pvRequest->getSubField("record._options.x"); sval = pvString->get(); testOk(sval.compare("y")==0,"record.x = y"); - testOk1(pvRequest->getSubField("field.a").get()!=0); - testOk1(pvRequest->getSubField("putField.a").get()!=0); - testOk1(pvRequest->getSubField("getField.a").get()!=0); + testOk1(pvRequest->getSubField("field.a")!=NULL); + testOk1(pvRequest->getSubField("putField.a")!=NULL); + testOk1(pvRequest->getSubField("getField.a")!=NULL); testPass("request %s",request.c_str()); request = "field(a.b[x=y])"; - pvRequest = createRequest->createRequest(request); - if(!pvRequest) { - cout << createRequest->getMessage() << endl; - } if(debug) { cout << "request " << request <createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); sval = pvString->get(); testOk(sval.compare("y")==0,"field.a.b._options.x = y"); testPass("request %s",request.c_str()); request = "field(a.b{c.d})"; - pvRequest = createRequest->createRequest(request); if(debug) { cout << "request " << request <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - testOk1(pvRequest->getSubField("field.a.b.c.d").get()!=0); + pvRequest = createRequest->createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("field.a.b.c.d")!=NULL); testPass("request %s",request.c_str()); request = "field(a.b[x=y]{c.d})"; - pvRequest = createRequest->createRequest(request); if(debug) { cout << "request " << request <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); + pvRequest = createRequest->createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); sval = pvString->get(); testOk(sval.compare("y")==0,"field.a.b._options.x = y"); - testOk1(pvRequest->getSubField("field.a.b.c.d").get()!=0); - if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest->getSubField("field.a.b.c.d")!=NULL); testPass("request %s",request.c_str()); request = "field(a.b[x=y]{c.d[x=y]})"; - pvRequest = createRequest->createRequest(request); if(debug) { cout << "request " << request <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); + pvRequest = createRequest->createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); pvString = pvRequest->getSubField("field.a.b._options.x"); sval = pvString->get(); testOk(sval.compare("y")==0,"field.a.b._options.x = y"); pvString = pvRequest->getSubField("field.a.b.c.d._options.x"); sval = pvString->get(); testOk(sval.compare("y")==0,"field.a.b.c.d._options.x = y"); - if(debug) { cout << *pvRequest << endl;} testPass("request %s",request.c_str()); request = "record[a=b,c=d] field(a.a[a=b]{a.a[a=b]},b.a[a=b]{a,b})"; - pvRequest = createRequest->createRequest(request); if(debug) { cout << "request " << request <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); + pvRequest = createRequest->createRequest(request); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); pvString = pvRequest->getSubField("field.a.a._options.a"); sval = pvString->get(); testOk(sval.compare("b")==0,"field.a.a._options.a = b"); @@ -124,126 +114,113 @@ void testCreateRequest() { pvString = pvRequest->getSubField("field.b.a._options.a"); sval = pvString->get(); testOk(sval.compare("b")==0,"field.b.a._options.a = b"); - testOk1(pvRequest->getSubField("field.b.a.a").get()!=0); - testOk1(pvRequest->getSubField("field.b.a.b").get()!=0); - if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest->getSubField("field.b.a.a")!=NULL); + testOk1(pvRequest->getSubField("field.b.a.b")!=NULL); testPass("request %s",request.c_str()); request = "alarm,timeStamp,power.value"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << endl << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - testOk1(pvRequest->getSubField("field.alarm").get()!=0); - testOk1(pvRequest->getSubField("field.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("field.power.value").get()!=0); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("field.alarm")!=NULL); + testOk1(pvRequest->getSubField("field.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("field.power.value")!=NULL); testPass("request %s",request.c_str()); request = "record[process=true]field(alarm,timeStamp,power.value)"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << endl << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - pvString = pvRequest->getSubField("record.process"); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + pvString = pvRequest->getSubField("record._options.process"); sval = pvString->get(); - testOk(sval.compare("true")==0,"record.process = true"); - testOk1(pvRequest->getSubField("field.alarm").get()!=0); - testOk1(pvRequest->getSubField("field.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("field.power.value").get()!=0); - if(debug) {cout << *pvRequest << endl;} + testOk(sval.compare("true")==0,"record._options.process = true"); + testOk1(pvRequest->getSubField("field.alarm")!=NULL); + testOk1(pvRequest->getSubField("field.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("field.power.value")!=NULL); testPass("request %s",request.c_str()); request = "record[process=true]field(alarm,timeStamp[algorithm=onChange,causeMonitor=false],power{value,alarm})"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - pvString = pvRequest->getSubField("record.process"); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + pvString = pvRequest->getSubField("record._options.process"); sval = pvString->get(); - testOk(sval.compare("true")==0,"record.process = true"); - testOk1(pvRequest->getSubField("field.alarm").get()!=0); - testOk1(pvRequest->getSubField("field.timeStamp").get()!=0); + testOk(sval.compare("true")==0,"record._options.process = true"); + testOk1(pvRequest->getSubField("field.alarm")!=NULL); + testOk1(pvRequest->getSubField("field.timeStamp")!=NULL); pvString = pvRequest->getSubField("field.timeStamp._options.algorithm"); sval = pvString->get(); testOk(sval.compare("onChange")==0,"field.timeStamp._options.algorithm = onChange"); pvString = pvRequest->getSubField("field.timeStamp._options.causeMonitor"); sval = pvString->get(); testOk(sval.compare("false")==0,"field.timeStamp._options.causeMonitor = false"); - testOk1(pvRequest->getSubField("field.power.value").get()!=0); - testOk1(pvRequest->getSubField("field.power.alarm").get()!=0); - if(debug) {cout << *pvRequest << endl;} + testOk1(pvRequest->getSubField("field.power.value")!=NULL); + testOk1(pvRequest->getSubField("field.power.alarm")!=NULL); testPass("request %s",request.c_str()); request = "record[int=2,float=3.14159]field(alarm,timeStamp[shareData=true],power.value)"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - pvString = pvRequest->getSubField("record.int"); + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + pvString = pvRequest->getSubField("record._options.int"); sval = pvString->get(); - testOk(sval.compare("2")==0,"record.int = 2"); - pvString = pvRequest->getSubField("record.float"); + testOk(sval.compare("2")==0,"record._options.int = 2"); + pvString = pvRequest->getSubField("record._options.float"); sval = pvString->get(); - testOk(sval.compare("3.14159")==0,"record.float = 3.14159"); - testOk1(pvRequest->getSubField("field.alarm").get()!=0); + testOk(sval.compare("3.14159")==0,"record._options.float = 3.14159"); + testOk1(pvRequest->getSubField("field.alarm")!=NULL); pvString = pvRequest->getSubField("field.timeStamp._options.shareData"); sval = pvString->get(); testOk(sval.compare("true")==0,"field.timeStamp._options.shareData = true"); - testOk1(pvRequest->getSubField("field.power.value").get()!=0); - if(debug) {cout << *pvRequest << endl;} + testOk1(pvRequest->getSubField("field.power.value")!=NULL); testPass("request %s",request.c_str()); request = string("record[process=true,xxx=yyy]") + "putField(power.value)" + "getField(alarm,timeStamp,power{value,alarm}," + "current{value,alarm},voltage{value,alarm})"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - testOk1(pvRequest->getSubField("putField.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("getField.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.power.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.current.value").get()!=0); - testOk1(pvRequest->getSubField("getField.current.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("getField.voltage.alarm").get()!=0); - if(debug) {cout << *pvRequest << endl;} + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("putField.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("getField.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.power.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.current.value")!=NULL); + testOk1(pvRequest->getSubField("getField.current.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("getField.voltage.alarm")!=NULL); testPass("request %s",request.c_str()); request = string("field(alarm,timeStamp,supply{") + "0{voltage.value,current.value,power.value}," + "1{voltage.value,current.value,power.value}" + "})"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - testOk1(pvRequest->getSubField("field.alarm").get()!=0); - testOk1(pvRequest->getSubField("field.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("field.supply.0.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("field.supply.0.current.value").get()!=0); - testOk1(pvRequest->getSubField("field.supply.0.power.value").get()!=0); - testOk1(pvRequest->getSubField("field.supply.1.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("field.supply.1.current.value").get()!=0); - testOk1(pvRequest->getSubField("field.supply.1.power.value").get()!=0); - if(debug) {cout << *pvRequest << endl;} + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("field.alarm")!=NULL); + testOk1(pvRequest->getSubField("field.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("field.supply.0.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("field.supply.0.current.value")!=NULL); + testOk1(pvRequest->getSubField("field.supply.0.power.value")!=NULL); + testOk1(pvRequest->getSubField("field.supply.1.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("field.supply.1.current.value")!=NULL); + testOk1(pvRequest->getSubField("field.supply.1.power.value")!=NULL); testPass("request %s",request.c_str()); request = string("record[process=true,xxx=yyy]") @@ -253,46 +230,45 @@ void testCreateRequest() { + "ps0{alarm,timeStamp,power{value,alarm},current{value,alarm},voltage{value,alarm}}," + "ps1{alarm,timeStamp,power{value,alarm},current{value,alarm},voltage{value,alarm}}" + ")"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getMessage() << endl; - } - testOk1(pvRequest.get()!=0); - testOk1(pvRequest->getSubField("putField.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("getField.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.power.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.current.value").get()!=0); - testOk1(pvRequest->getSubField("getField.current.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("getField.voltage.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.power.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.current.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.current.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps0.voltage.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.timeStamp").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.power.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.power.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.current.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.current.alarm").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.voltage.value").get()!=0); - testOk1(pvRequest->getSubField("getField.ps1.voltage.alarm").get()!=0); - if(debug) {cout << *pvRequest << endl;} + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("putField.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("getField.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.power.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.current.value")!=NULL); + testOk1(pvRequest->getSubField("getField.current.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("getField.voltage.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.power.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.current.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.current.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps0.voltage.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.timeStamp")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.power.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.power.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.current.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.current.alarm")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.voltage.value")!=NULL); + testOk1(pvRequest->getSubField("getField.ps1.voltage.alarm")!=NULL); testPass("request %s",request.c_str()); request = "a{b{c{d}}}"; + if(debug) { cout << "request " << request <createRequest(request); - if(debug) { cout << string("request") <getSubField("field.a.b.c.d").get()!=0); - if(debug) {cout << *pvRequest << endl;} + if(pvRequest==NULL) { cout<< createRequest->getMessage() << endl;} + if(debug) { cout << *pvRequest << endl;} + testOk1(pvRequest!=NULL); + testOk1(pvRequest->getSubField("field.a.b.c.d")!=NULL); testPass("request %s",request.c_str()); request = string("record[process=true,xxx=yyy]") @@ -302,25 +278,24 @@ void testCreateRequest() { + "ps0{alarm,timeStamp,power{value,alarm},current{value,alarm},voltage{value,alarm}}," + "ps1{alarm,timeStamp,power{value,alarm},current{value,alarm},voltage{value,alarm}" + ")"; + if(debug) { cout << "request " << request <createRequest(request); - assert(!pvRequest); if(debug) {cout << "reason " << createRequest->getMessage() << endl;} testPass("request %s",request.c_str()); request = "record[process=true,power.value"; - if(debug) { cout << string("request") <createRequest(request); - assert(!pvRequest); - if(debug) { cout << "reason " << createRequest->getMessage() << endl;} + if(debug) {cout << "reason " << createRequest->getMessage() << endl;} + testOk1(pvRequest==NULL); testPass("request %s",request.c_str()); } MAIN(testCreateRequest) { - testPlan(111); + testPlan(112); testCreateRequest(); return testDone(); }