Changeset 166
- Timestamp:
- 07/18/08 17:15:56 (6 months ago)
- Files:
-
- trunk/dba/dba/xmlarchive.cpp (modified) (3 diffs)
- trunk/dba/dba/xmlarchive.h (modified) (2 diffs)
- trunk/dba/dba/xmlistream.cpp (modified) (4 diffs)
- trunk/dba/dba/xmlistream.h (modified) (2 diffs)
- trunk/dba/dba/xmlostream.cpp (modified) (3 diffs)
- trunk/dba/dba/xmlostream.h (modified) (3 diffs)
- trunk/dba/test/xmltestcase.cpp (modified) (1 diff)
- trunk/dba/test/xmltestcase.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/dba/dba/xmlarchive.cpp
r154 r166 20 20 : Archive(), 21 21 mDocument(NULL), 22 mRootNode(NULL) 22 mRootNode(NULL), 23 mUseElements(false) 23 24 { 24 25 mConvSpecs.mTimestampFormat = "%Y-%m-%dZ%H:%M:%S"; … … 90 91 if (mRootNodeName != NULL) 91 92 root = root->children; 92 return new XMLIStream(mDocument,root,mConvSpecs );93 return new XMLIStream(mDocument,root,mConvSpecs,mUseElements); 93 94 }; 94 95 95 96 OStream* 96 97 XMLArchive::getOutputStream() { 97 return new XMLOStream(mDocument,mRootNode,mRootNodeName != NULL,mConvSpecs );98 return new XMLOStream(mDocument,mRootNode,mRootNodeName != NULL,mConvSpecs,mUseElements); 98 99 }; 99 100 … … 103 104 if (mRootNodeName != NULL) 104 105 root = root->children; 105 return XMLIStream(mDocument,root,mConvSpecs );106 return XMLIStream(mDocument,root,mConvSpecs,mUseElements); 106 107 }; 107 108 108 109 XMLOStream 109 110 XMLArchive::getOStream() { 110 XMLOStream ret(mDocument,mRootNode,mRootNodeName == NULL,mConvSpecs );111 XMLOStream ret(mDocument,mRootNode,mRootNodeName == NULL,mConvSpecs,mUseElements); 111 112 return ret; 112 113 }; trunk/dba/dba/xmlarchive.h
r154 r166 47 47 void close(); 48 48 virtual bool isOpen() const { return mDocument != NULL; } 49 void useElements(bool pFlag = true) { mUseElements = pFlag; } 49 50 XMLOStream getOStream(); 50 51 XMLIStream getIStream(); … … 68 69 */ 69 70 std::string mFilename; 71 /** 72 should archive store/load members data from elements or attributes 73 */ 74 bool mUseElements; 70 75 71 76 /** trunk/dba/dba/xmlistream.cpp
r165 r166 17 17 namespace dba { 18 18 19 XMLIStream::XMLIStream(xmlDocPtr pDocument, xmlNodePtr pNode, const ConvSpec& pSpecs )19 XMLIStream::XMLIStream(xmlDocPtr pDocument, xmlNodePtr pNode, const ConvSpec& pSpecs, bool pUseElements) 20 20 : IStream(), 21 21 ConvSpecContainer(pSpecs), … … 23 23 mParentNode(pNode), 24 24 mIgnoreNonMappedNodes(false), 25 mIgnoreOrder(false) 25 mIgnoreOrder(false), 26 mUseElements(pUseElements) 26 27 { 27 28 mCurrentNode = findNonTextNode(mParentNode); … … 193 194 if (!xmlNodeIsText(node) && !xmlStrcmp(name,node->name)) 194 195 break; 195 if (!xmlNodeIsText(node)) debug("findNode: ignoring node %s", node->name != NULL ? (const char*)node->name : "(null)");196 //if (!xmlNodeIsText(node)) debug("findNode: ignoring node %s", node->name != NULL ? (const char*)node->name : "(null)"); 196 197 }; 197 198 … … 225 226 dba::StoreableFilterBase* filter(member->getFilter()); 226 227 setFilterPtr(*filter,(char*)pObject + (int)(member->getMemberOffset() + tbl->getClassOffset())); 227 xmlAttrPtr attr = findAttribute(pNode,member->getMemberName()); 228 if (attr != NULL) { 229 xmlChar* xmldata = xmlNodeGetContent(attr->children); 230 if (xmldata == NULL) { 231 filter->fromNull(); 232 } else { 233 std::string data((const char*)xmldata); 234 filter->fromString(mConvSpecs, data); 235 }; 228 xmlChar* xmldata = NULL; 229 if (mUseElements) { 230 xmlNodePtr node = findNode(pNode->children, member->getMemberName()); 231 if (node != NULL) { 232 debug("member %s: using child node",(const char*)node->name); 233 xmldata = xmlNodeGetContent(node); 234 }; 235 }; 236 if (xmldata == NULL) { 237 xmlAttrPtr attr = findAttribute(pNode,member->getMemberName()); 238 if (attr != NULL) { 239 debug("member %s: using attribute",(const char*)attr->name); 240 xmldata = xmlNodeGetContent(attr->children); 241 }; 242 }; 243 if (xmldata != NULL) { 244 std::string data((const char*)xmldata); 245 filter->fromString(mConvSpecs, data); 236 246 } else { 237 247 filter->fromNull(); trunk/dba/dba/xmlistream.h
r164 r166 24 24 class XMLIStream : public IStream, public XMLErrorHandler, public ConvSpecContainer { 25 25 public: 26 XMLIStream(xmlDocPtr pDocument, xmlNodePtr pNode, const ConvSpec& pSpecs );26 XMLIStream(xmlDocPtr pDocument, xmlNodePtr pNode, const ConvSpec& pSpecs, bool pUseElements); 27 27 /** 28 28 If set to true, then stream will igore all nodes that are not mapped to class … … 53 53 bool mIgnoreNonMappedNodes; 54 54 bool mIgnoreOrder; 55 bool mUseElements; 55 56 56 57 virtual void setIdsCondition(const char* pFKeyName, id pRelationId, const std::vector<id>& pIds); trunk/dba/dba/xmlostream.cpp
r154 r166 17 17 namespace dba { 18 18 19 XMLOStream::XMLOStream(xmlDocPtr pDocument, xmlNodePtr pNode, bool pReplaceParentNode, const ConvSpec& pSpecs )19 XMLOStream::XMLOStream(xmlDocPtr pDocument, xmlNodePtr pNode, bool pReplaceParentNode, const ConvSpec& pSpecs, bool pUseElements) 20 20 : OStream(), 21 21 ConvSpecContainer(pSpecs), 22 22 mDocument(pDocument), 23 23 mParentNode(pNode), 24 mReplaceParentNode(pReplaceParentNode) 24 mReplaceParentNode(pReplaceParentNode), 25 mUseElements(pUseElements) 25 26 { 26 27 } … … 105 106 if (!filter.isNull()) { 106 107 std::string strdata(filter.toString(getConversionSpecs())); 107 setAttribute(pNode,member->name,(xmlChar*)strdata.c_str());108 updateNodeData(pNode,member->name,strdata.c_str()); 108 109 }; 109 110 member = member->next; … … 116 117 XMLOStream::updateNodeFromVars(xmlNodePtr pNode, mt_class* pTable) { 117 118 for (VarMap::const_iterator it = mBindings.begin(); it != mBindings.end(); it++) { 118 std::string data;119 119 if (!strcmp(it->mTable,pTable->name)) { 120 120 dba::StoreableFilterBase& filter = *(it->mFilter); 121 data = filter.toString(mConvSpecs);121 std::string data(filter.toString(mConvSpecs)); 122 122 if (!data.empty()) { 123 setAttribute(pNode,it->mField,(xmlChar*)data.c_str()); 124 }; 125 }; 123 updateNodeData(pNode,it->mField,data.c_str()); 124 }; 125 }; 126 }; 127 }; 128 129 void 130 XMLOStream::updateNodeData(xmlNodePtr pNode, const char* pName, const char* pContent) { 131 if (mUseElements) { 132 xmlNodePtr node(createNode(pName)); 133 xmlChar* encoded_data = xmlEncodeEntitiesReentrant(NULL,(xmlChar*)pContent); 134 xmlNodeSetContent(node,encoded_data); 135 xmlFree(encoded_data); 136 xmlAddChild(pNode,node); 137 } else { 138 setAttribute(pNode,pName,(xmlChar*)pContent); 126 139 }; 127 140 }; trunk/dba/dba/xmlostream.h
r154 r166 24 24 class XMLOStream : public OStream, public XMLErrorHandler, public ConvSpecContainer { 25 25 public: 26 XMLOStream(xmlDocPtr pDocument, xmlNodePtr pNode, bool pReplaceParentNode, const ConvSpec& pSpecs );26 XMLOStream(xmlDocPtr pDocument, xmlNodePtr pNode, bool pReplaceParentNode, const ConvSpec& pSpecs, bool pUseElements); 27 27 virtual void close(); 28 28 virtual void destroy(); … … 46 46 xmlNodePtr mParentNode; 47 47 bool mReplaceParentNode; 48 bool mUseElements; 48 49 49 50 void updateNodeFromVars(xmlNodePtr pNode, mt_class* pTable); … … 51 52 void setAttribute(xmlNodePtr pNode, const char* pName, const xmlChar* pData); 52 53 xmlNodePtr createNode(const char* pName); 54 void updateNodeData(xmlNodePtr pNode, const char* pName, const char* pContent); 53 55 }; 54 56 trunk/dba/test/xmltestcase.cpp
r165 r166 775 775 }; 776 776 777 void 778 XMLTestCase::loadFromElements() { 779 const char* data = 780 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 781 "<test_objects>\n" 782 " <i_value>1</i_value>\n" 783 " <f_value>1.1</f_value>\n" 784 " <s_value>test</s_value>\n" 785 " <d_value>2008-01-01Z00:00:00</d_value>\n" 786 "</test_objects>\n" 787 ; 788 { 789 std::ofstream file("loadfromelements.xml"); 790 file << data; 791 }; 792 { 793 dba::XMLArchive ar; 794 ar.setRootNodeName(NULL); 795 ar.useElements(); 796 ar.open("loadfromelements.xml"); 797 TestObject obj1; 798 dba::XMLIStream stream(ar.getIStream()); 799 stream.enableDebug(); 800 stream.open(obj1); 801 CPPUNIT_ASSERT(stream.getNext(&obj1)); 802 803 TestObject expected(1,1.1,"test",Utils::getDate(2008,1,1,0,0,0)); 804 CPPUNIT_ASSERT(obj1 == expected); 805 }; 806 }; 807 808 void 809 XMLTestCase::storeToElements() { 810 const char* result = 811 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 812 "<test_objects>\n" 813 " <i_value>1</i_value>\n" 814 " <f_value>1.1</f_value>\n" 815 " <s_value>test</s_value>\n" 816 " <d_value>2008-01-01Z00:00:00</d_value>\n" 817 "</test_objects>\n" 818 ; 819 { 820 dba::XMLArchive ar; 821 ar.setRootNodeName(NULL); 822 ar.useElements(); 823 unlink("storetoelements.xml"); 824 ar.open("storetoelements.xml"); 825 TestObject obj1(1,1.1,"test",Utils::getDate(2008,1,1,0,0,0)); 826 dba::XMLOStream stream(ar.getOStream()); 827 stream.open(); 828 stream.put(&obj1); 829 } 830 CPPUNIT_ASSERT(compareXML("storetoelements.xml",result)); 831 }; 832 777 833 778 834 } //namespace trunk/dba/test/xmltestcase.h
r154 r166 51 51 CPPUNIT_TEST(store_ns); 52 52 CPPUNIT_TEST(load_two); 53 CPPUNIT_TEST(loadFromElements); 54 CPPUNIT_TEST(storeToElements); 53 55 CPPUNIT_TEST_SUITE_END(); 54 56 public: … … 85 87 void load_two_inverted(); 86 88 void store_two(); 89 void loadFromElements(); 90 void storeToElements(); 87 91 private: 88 92 bool compareXML(const char* pFilename, const char* pData);
