Changeset 174

Show
Ignore:
Timestamp:
07/30/08 16:29:06 (4 months ago)
Author:
zork
Message:

XMLOStream incorrect root node replacement and fatal bug in putChildren processing

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/dba/dba/ostream.cpp

    r138 r174  
    116116  while(table != NULL) { 
    117117    ColMemberEntry* member = table->getMembers(); 
     118    initMemberChildrenStore(*pObject,*member); 
    118119    while(member != NULL) { 
    119120      //getTableName uses create() to call Storeable::getRootTable() 
     
    126127      const char* obj_table = member->getTableName(); 
    127128      //call archive specific store alghoritm 
    128       initMemberChildrenStore(*pObject,*member); 
    129129      bool was_changed = putMemberChildren(pObject, *member, filter, obj_table); 
    130       endMemberChildrenStore(*pObject,*member); 
    131130      if (!ret) ret = was_changed; 
    132131      //move forward in loop 
    133132      member = member->getNextMember(); 
    134133    }; 
     134    endMemberChildrenStore(*pObject,*member); 
    135135    //move forward in loop 
    136136    table = table->getNextTable(); 
  • trunk/dba/dba/xmlostream.cpp

    r166 r174  
    149149  xmlNodePtr node = createNode(current->name); 
    150150  if (!mReplaceParentNode) { 
     151    debug("Adding child node '%s' to '%s'", getRootTableName(*pObject), (const char*)mParentNode->name); 
    151152    //store table is readed from last element to first 
    152153    //and from child table to parent. 
     
    160161    node->nsDef = xmlCopyNamespaceList(mParentNode->nsDef); 
    161162    xmlFree(xmlDocSetRootElement(mDocument,node)); 
     163    //no mParentNode means that we are the parent node 
     164    mParentNode = NULL; 
    162165    mReplaceParentNode = false; 
    163166  }; 
     
    177180XMLOStream::initMemberChildrenStore(const Storeable& pObject, const ColMemberEntry& pMember) { 
    178181  //set new parent node for storing subobjects 
    179   mParentNode = mParentNode->children; 
     182  if (mParentNode != NULL) { 
     183    debug("going down to first child of mParent '%s'", (const char*)mParentNode->name); 
     184    mParentNode = mParentNode->children; 
     185  } else { 
     186    mParentNode = xmlDocGetRootElement(mDocument); 
     187    debug("mParent set to '%s'", (const char*)mParentNode->name); 
     188  }; 
    180189}; 
    181190 
     
    185194  //in hierarchy. After storing all children we have to reset it back to 
    186195  //parent of pObject node 
    187   mParentNode = mParentNode->parent; 
     196  if (mParentNode != xmlDocGetRootElement(mDocument)) { 
     197    debug("up from mParent '%s'", (const char*)mParentNode->name); 
     198    mParentNode = mParentNode->parent; 
     199  }; 
    188200  if (mParentNode == NULL) 
    189201    throw DatabaseException("Internal error: parent node is NULL"); 
     
    208220  bool ret = false; 
    209221  if (!pObject->isDeleted()) { 
     222/*    if (mParentNode != NULL) { 
     223      debug("going down to first child of mParent '%s'", (const char*)mParentNode->name); 
     224      mParentNode = mParentNode->children; 
     225    } else { 
     226      mParentNode = xmlDocGetRootElement(mDocument); 
     227      debug("mParent set to '%s'", (const char*)mParentNode->name); 
     228    };*/ 
    210229    std::auto_ptr<CollectionFilterIterator> iterator(pFilter.createIterator()); 
    211230    //do not create fkey node if list is empty 
     
    227246      }; 
    228247    }; 
     248/*    if (mParentNode != xmlDocGetRootElement(mDocument)) { 
     249      debug("up from mParent '%s'", (const char*)mParentNode->name); 
     250      mParentNode = mParentNode->parent; 
     251    };*/ 
    229252  }; 
    230253  return ret; 
  • trunk/dba/test/main.cpp

    r169 r174  
    144144  CppUnit::BriefTestProgressListener listener; 
    145145  runner.eventManager().addListener(&listener); 
    146   runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); 
     146  //runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); 
    147147  //runner.addTest(new CppUnit::TestCaller<SQLite3SQLArchiveTestCase>("debug_test",&SQLite3SQLArchiveTestCase::sqlError)); 
    148148  //runner.addTest(new CppUnit::TestCaller<PostgresSQLArchiveTestCase>("debug_test",&PostgresSQLArchiveTestCase::sqlError)); 
     
    150150  //runner.addTest(new CppUnit::TestCaller<dba_tests::CSVTestCase>("debug_test",&dba_tests::CSVTestCase::invalidPos)); 
    151151  //runner.addTest(new CppUnit::TestCaller<SQLite3SQLArchiveTestCase>("debug_test",&SQLite3SQLArchiveTestCase::transactions_rollback)); 
    152   //runner.addTest(dba_tests::XMLTestCase::suite()); 
    153   //runner.addTest(new CppUnit::TestCaller<dba_tests::XMLTestCase>("debug_test",&dba_tests::XMLTestCase::sublist_two_store)); 
     152  runner.addTest(dba_tests::XMLTestCase::suite()); 
     153  //runner.addTest(new CppUnit::TestCaller<dba_tests::XMLTestCase>("debug_test",&dba_tests::XMLTestCase::storeBug1)); 
    154154  //runner.addTest(new CppUnit::TestCaller<dba_tests::XMLTestCase>("debug_test",&dba_tests::XMLTestCase::store_two)); 
    155155  //runner.addTest(new CppUnit::TestCaller<OdbcPluginTestCase>("debug_test",&OdbcPluginTestCase::dbConnection)); 
  • trunk/dba/test/xmltestcase.cpp

    r173 r174  
    832832}; 
    833833 
     834struct Address : public dba::Storeable { 
     835  DECLARE_STORE_TABLE(); 
     836  std::string mData; 
     837}; 
     838 
     839BEGIN_STORE_TABLE(Address,dba::Storeable,"address") 
     840  BIND_STR(mData,dba::String,"data") 
     841END_STORE_TABLE() 
     842 
     843struct Patient : public dba::Storeable { 
     844  DECLARE_STORE_TABLE(); 
     845  Address mAddress; 
     846}; 
     847 
     848BEGIN_STORE_TABLE(Patient,dba::Storeable,"patient") 
     849  BIND_COL(mAddress,dba::Single,NULL) 
     850END_STORE_TABLE() 
     851 
     852 
     853struct Report : public dba::Storeable { 
     854  DECLARE_STORE_TABLE(); 
     855}; 
     856 
     857BEGIN_STORE_TABLE(Report,dba::Storeable,"report") 
     858END_STORE_TABLE() 
     859 
     860struct Request : public dba::Storeable { 
     861  DECLARE_STORE_TABLE(); 
     862  Patient mPatient; 
     863  Report mReport; 
     864}; 
     865 
     866BEGIN_STORE_TABLE(Request,dba::Storeable,"request") 
     867  BIND_COL(mReport,dba::Single,NULL) 
     868  BIND_COL(mPatient,dba::Single,NULL) 
     869END_STORE_TABLE() 
     870 
     871void 
     872XMLTestCase::storeBug1() { 
     873  const char* result =  
     874"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 
     875"<request>\n" 
     876"  <report/>\n" 
     877"  <patient>\n" 
     878"    <address/>\n" 
     879"  </patient>\n" 
     880"</request>\n" 
     881; 
     882  { 
     883    dba::XMLArchive ar; 
     884    ar.setRootNodeName(NULL); 
     885    //ar.useElements(); 
     886    unlink("storebug1.xml"); 
     887    ar.open("storebug1.xml"); 
     888    Request obj1; 
     889    dba::XMLOStream stream(ar.getOStream()); 
     890    stream.enableDebug(); 
     891    stream.open(); 
     892    stream.put(&obj1); 
     893  } 
     894  CPPUNIT_ASSERT(compareXML("storebug1.xml",result)); 
     895}; 
    834896 
    835897} //namespace 
  • trunk/dba/test/xmltestcase.h

    r169 r174  
    5353      CPPUNIT_TEST(loadFromElements); 
    5454      CPPUNIT_TEST(storeToElements); 
     55      CPPUNIT_TEST(storeBug1); 
    5556    CPPUNIT_TEST_SUITE_END(); 
    5657  public: 
     
    8990    void loadFromElements(); 
    9091    void storeToElements(); 
     92    void storeBug1(); 
    9193  private: 
    9294    bool compareXML(const char* pFilename, const char* pData);