Changeset 141

Show
Ignore:
Timestamp:
05/25/08 19:03:51 (8 months ago)
Author:
zork
Message:

fixed recursion in XMLIStream

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/dba/dba/collectionfilter.h

    r48 r141  
    6868      Filters for lists implements this by adding reference to  
    6969      Storeable object returned by create() to contained collection  
     70      @return pointer to inserted Storeable object 
    7071      @see InstanceFilter::put implmementation 
    7172    */ 
    72     virtual void put() = 0; 
     73    virtual Storeable* put() = 0; 
    7374    /** 
    7475      Remove all objects from collection 
     
    169170    virtual Storeable& create() { return mInstance; }; 
    170171    /** 
    171       Add Storeable object to collection       
     172      Add Storeable object to collection 
    172173      @param pToAdd object to add 
     174      @return pointer to inserted Storeable object 
    173175    */ 
    174     virtual void add(const S& pToAdd) = 0; 
    175     virtual void put() { 
    176       add(mInstance); 
     176    virtual Storeable* add(const S& pToAdd) = 0; 
     177    virtual Storeable* put() { 
     178      return add(mInstance); 
    177179    }; 
    178180    virtual ~InstanceFilter() {} 
  • trunk/dba/dba/single.h

    r97 r141  
    3939    virtual Storeable& create() { return *mMember; }; 
    4040    //iterator is assiging us 
    41     virtual void put() {}; 
     41    virtual Storeable* put() { return mMember; } 
    4242    virtual void clear() {}; 
    4343    ~Single() {}; 
  • trunk/dba/dba/stddeque.h

    r134 r141  
    5454    }; 
    5555    virtual void clear() { (CollectionFilter<std::deque<T> >::mMember)->clear(); }; 
    56     virtual void add(const T& pToAdd) { 
     56    virtual Storeable* add(const T& pToAdd) { 
    5757      //std::cerr << "adding obj "<< pToAdd.getId() << " to set " << mMember << std::endl; 
    5858      (CollectionFilter<std::deque<T> >::mMember)->push_back(pToAdd); 
     59      return &((CollectionFilter<std::deque<T> >::mMember)->back()); 
    5960    }; 
    6061    virtual ~stdDeque() {}; 
  • trunk/dba/dba/stdlist.h

    r134 r141  
    5454    }; 
    5555    virtual void clear() { (CollectionFilter<std::list<T> >::mMember)->clear(); }; 
    56     virtual void add(const T& pToAdd) { 
     56    virtual Storeable* add(const T& pToAdd) { 
    5757      //std::cerr << "adding obj "<< pToAdd.getId() << " to list " << mMember << std::endl; 
    5858      (CollectionFilter<std::list<T> >::mMember)->push_back(pToAdd); 
     59      return &((CollectionFilter<std::list<T> >::mMember)->back()); 
    5960    }; 
    6061    virtual ~stdList() {}; 
  • trunk/dba/dba/stdmultiset.h

    r134 r141  
    5454    }; 
    5555    virtual void clear() { (CollectionFilter<std::multiset<T> >::mMember)->clear(); }; 
    56     virtual void add(const T& pToAdd) { 
     56    virtual Storeable* add(const T& pToAdd) { 
    5757      //std::cerr << "adding obj "<< pToAdd.getId() << " to set " << mSet << std::endl; 
    58       (CollectionFilter<std::multiset<T> >::mMember)->insert(pToAdd); 
     58      typename std::multiset<T>::iterator it = (CollectionFilter<std::multiset<T> >::mMember)->insert(pToAdd); 
     59      return (Storeable*)&(*it); 
    5960    }; 
    6061    virtual ~stdMultiset() {}; 
  • trunk/dba/dba/stdset.h

    r134 r141  
    5757    }; 
    5858    virtual void clear() { (CollectionFilter<std::set<T> >::mMember)->clear(); }; 
    59     virtual void add(const T& pToAdd) { 
     59    virtual Storeable* add(const T& pToAdd) { 
    6060      //std::cerr << "adding obj "<< pToAdd.getId() << " to set " << mMember << std::endl; 
    61       (CollectionFilter<std::set<T> >::mMember)->insert(pToAdd); 
     61      typename std::pair<typename std::set<T>::const_iterator,bool> p = (CollectionFilter<std::set<T> >::mMember)->insert(pToAdd); 
     62      return (Storeable*)&(*(p.first)); 
    6263    }; 
    6364    virtual ~stdSet() {}; 
  • trunk/dba/dba/stdvector.h

    r134 r141  
    5454    }; 
    5555    virtual void clear() { (CollectionFilter<std::vector<T> >::mMember)->clear(); }; 
    56     virtual void add(const T& pToAdd) { 
     56    virtual Storeable* add(const T& pToAdd) { 
    5757      //std::cerr << "adding obj "<< pToAdd.getId() << " to set " << mMember << std::endl; 
    5858      (CollectionFilter<std::vector<T> >::mMember)->push_back(pToAdd); 
     59      return &((CollectionFilter<std::vector<T> >::mMember)->back()); 
    5960    }; 
    6061    virtual ~stdVector() {}; 
  • trunk/dba/dba/xmlistream.cpp

    r139 r141  
    105105      CollectionFilterBase* childFilter = member->getFilter(); 
    106106      Storeable& child(childFilter->create()); 
    107       open(child,member->getTableName());  
     107      open(child,member->getTableName()); 
    108108 
    109109      xmlNodePtr node = findNonTextNode(pNode); 
    110110      while (node != NULL) {  
    111         mCurrentNode = node; 
    112         while(mCurrentNode && (xmlIsBlankNode(mCurrentNode) == 1))  
    113           mCurrentNode = mCurrentNode->next; 
     111        mCurrentNode = findNonTextNode(node); 
    114112        applyFilters(&child); 
     113 
     114        childFilter->updateRef((char*)pParent + member->getMemberOffset()); 
     115        Storeable* ref = childFilter->put(); 
     116        //recursive getChildren can be called only after put() 
     117        //(on pointer to already added object) 
    115118        if (node->children != NULL) 
    116           getChildren(&child,node->children); 
    117  
    118         childFilter->updateRef((char*)pParent + member->getMemberOffset()); 
    119         childFilter->put(); 
     119          getChildren(ref,node->children); 
    120120        node = setNextNode(node); 
    121121      }; 
     122 
    122123      //restore level to fkey node 
    123124      if (member->getFKeyName() != NULL) 
  • trunk/dba/test/main.cpp

    r140 r141  
    150150  //runner.addTest(new CppUnit::TestCaller<dba_tests::CSVTestCase>("debug_test",&dba_tests::CSVTestCase::manual)); 
    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_tree_store)); 
     152  runner.addTest(dba_tests::XMLTestCase::suite()); 
     153  //runner.addTest(new CppUnit::TestCaller<dba_tests::XMLTestCase>("debug_test",&dba_tests::XMLTestCase::sublist_tree_load)); 
    154154  //runner.addTest(new CppUnit::TestCaller<OdbcPluginTestCase>("debug_test",&OdbcPluginTestCase::dbConnection)); 
    155155  //runner.addTest(new CppUnit::TestCaller<PostgresSQLArchiveTestCase>("debug_test",&PostgresSQLArchiveTestCase::sqlError)); 
  • trunk/dba/test/testobject.h

    r139 r141  
    534534      return true; 
    535535    }; 
     536    void dump(int pLevel = 0) const { 
     537      std::cerr << "level:" << pLevel << " i_val: " << i << std::endl; 
     538      for(std::list<TreeObject>::const_iterator it = mLeafs.begin(); it != mLeafs.end(); it++) 
     539        it->dump(pLevel+1); 
     540    }; 
    536541    std::list<TreeObject> mLeafs; 
    537542}; 
  • trunk/dba/test/xmltestcase.cpp

    r140 r141  
    386386 
    387387void  
     388XMLTestCase::sublist_tree_load() { 
     389  const char* data =  
     390"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 
     391"<dba>\n" 
     392"  <test_objects i_value=\"1\" f_value=\"1\" s_value=\"1\" d_value=\"2008-01-01Z00:00:00\">\n" 
     393"    <fk_owner>\n" 
     394"      <test_objects i_value=\"2\" f_value=\"2\" s_value=\"2\" d_value=\"2008-01-01Z00:00:00\">\n" 
     395"        <fk_owner>\n" 
     396"          <test_objects i_value=\"3\" f_value=\"3\" s_value=\"3\" d_value=\"2008-01-01Z00:00:00\"/>\n" 
     397"        </fk_owner>\n" 
     398"      </test_objects>\n" 
     399"    </fk_owner>\n" 
     400"  </test_objects>\n" 
     401"</dba>\n"; 
     402  {  
     403    std::ofstream file("sublist_tree_load.xml"); 
     404    file << data; 
     405  }; 
     406  { 
     407    dba::XMLArchive ar; 
     408    ar.open("sublist_tree_load.xml"); 
     409 
     410    dba::XMLIStream stream(ar.getIStream()); 
     411    TreeObject obj1; 
     412    stream.get(&obj1); 
     413 
     414    //obj1.dump(); 
     415 
     416    TreeObject expected(1,1,"1"); 
     417    TreeObject middle(2,2,"2"); 
     418    TreeObject last(3,3,"3"); 
     419    middle.mLeafs.push_back(last); 
     420    expected.mLeafs.push_back(middle); 
     421 
     422    CPPUNIT_ASSERT(obj1 == expected); 
     423  }; 
     424}; 
     425 
     426 
     427void  
    388428XMLTestCase::sublist_three_simple() { 
    389429  const char* result =  
  • trunk/dba/test/xmltestcase.h

    r140 r141  
    4141      CPPUNIT_TEST(sublist_tree_store); 
    4242      CPPUNIT_TEST(sublist_three_simple); 
     43      CPPUNIT_TEST(sublist_tree_load); 
    4344    CPPUNIT_TEST_SUITE_END(); 
    4445  public: 
     
    6364    void sublist_tree_store(); 
    6465    void sublist_three_simple(); 
     66    void sublist_tree_load(); 
    6567  private: 
    6668    bool compareXML(const char* pFilename, const char* pData);