Changeset 128

Show
Ignore:
Timestamp:
05/02/08 15:44:24 (8 months ago)
Author:
zork
Message:

error handling implementation and test for xml file creation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/dba/dba.bkl

    r127 r128  
    2222    dba/double_filter.cpp 
    2323    dba/exception.cpp 
     24    dba/fileutils.cpp 
    2425    dba/genericfetcher.cpp 
    2526    dba/idlocker.cpp 
     
    6162    dba/double_filter.h 
    6263    dba/exception.h 
     64    dba/fileutils.h 
    6365    dba/genericfetcher.h 
    6466    dba/idlocker.h 
     
    211213    <sources> 
    212214      dba/xmlarchive.cpp 
     215      dba/xmlerrorhandler.cpp 
    213216      dba/xmlistream.cpp 
    214217      dba/xmlostream.cpp 
     
    216219        <msvc-headers> 
    217220      dba/xmlarchive.h 
     221      dba/xmlerrorhandler.h 
    218222      dba/xmlistream.h 
    219223      dba/xmlostream.h 
     
    307311  </lib> 
    308312 
    309   <template id="dbaexe_base" template="xml-exe"> 
     313  <template id="dbaexe_base" template_append="xml-exe"> 
    310314    <app-type>console</app-type> 
    311315    <include>$(SRCDIR)</include> 
     
    335339  <exe id="dba_test_static" template="testbase" cond="SHARED=='0' and TESTS=='1'"> 
    336340    <nameexe>dba_test_static</nameexe> 
     341    <library>dbaxml_static</library> 
     342    <library>dbacsv_static</library> 
    337343    <library>libdba_static</library> 
    338     <library>dbacsv_static</library> 
    339     <library>dbaxml_static</library> 
    340344  </exe> 
    341345 
  • trunk/dba/dba/convspec.cpp

    r57 r128  
    136136}; 
    137137 
     138const char*  
     139ConvSpec::getXmlEncodingName(dba::ConvSpec::charset pCharset) { 
     140  switch (pCharset) { 
     141    case dba::ConvSpec::ISO8859_1: return "iso-8859-1"; 
     142    case dba::ConvSpec::ISO8859_2: return "iso-8859-2"; 
     143    case dba::ConvSpec::ISO8859_3: return "iso-8859-3"; 
     144    case dba::ConvSpec::ISO8859_4: return "iso-8859-4";  
     145    case dba::ConvSpec::ISO8859_5: return "iso-8859-5"; 
     146    case dba::ConvSpec::ISO8859_6: return "iso-8859-6"; 
     147    case dba::ConvSpec::ISO8859_7: return "iso-8859-7"; 
     148    case dba::ConvSpec::ISO8859_8: return "iso-8859-8"; 
     149    case dba::ConvSpec::ISO8859_9: return "iso-8859-9"; 
     150    case dba::ConvSpec::ISO8859_10: return "iso-8859-10"; 
     151    case dba::ConvSpec::ISO8859_11: return "iso-8859-11"; 
     152    case dba::ConvSpec::ISO8859_13: return "iso-8859-13"; 
     153    case dba::ConvSpec::ISO8859_14: return "iso-8859-14"; 
     154    case dba::ConvSpec::ISO8859_15: return "iso-8859-15"; 
     155   
     156    //case dba::ConvSpec::KOI8: return ?;  
     157    //case dba::ConvSpec::KOI8_U: return ?; 
     158    //case dba::ConvSpec::BULGARIAN: return ? 
     159   
     160    //case dba::ConvSpec::CP437: return ?; 
     161    //case dba::ConvSpec::CP850: return ?; 
     162    //case dba::ConvSpec::CP852: return ?; 
     163    //case dba::ConvSpec::CP855: return ?; 
     164    //case dba::ConvSpec::CP866: return ?; 
     165    //case dba::ConvSpec::CP874: return ?; 
     166    //case dba::ConvSpec::CP932: return ?; 
     167    //case dba::ConvSpec::CP936: return ?; 
     168    //case dba::ConvSpec::CP949: return ?; 
     169    //case dba::ConvSpec::CP950: return ?; 
     170    case dba::ConvSpec::CP1250: return "win-1250"; 
     171    case dba::ConvSpec::CP1251: return "win-1251"; 
     172    case dba::ConvSpec::CP1252: return "win-1252"; 
     173    case dba::ConvSpec::CP1254: return "win-1254"; 
     174    case dba::ConvSpec::CP1255: return "win-1255"; 
     175    case dba::ConvSpec::CP1256: return "win-1256"; 
     176   
     177    case dba::ConvSpec::UTF7: return "utf-7"; 
     178    case dba::ConvSpec::UTF8: return "utf-8"; 
     179    //case dba::ConvSpec::EUC_JP: return "?"; 
     180    default: return NULL; 
     181  }; 
     182}; 
     183 
    138184 
    139185} //namespace 
  • trunk/dba/dba/convspec.h

    r56 r128  
    105105    */ 
    106106    static const char* getUnixLCType(charset pCharset); 
     107    /** 
     108      Convert debea charset to xml charset name 
     109    */ 
     110    static const char* getXmlEncodingName(charset pCharset); 
    107111}; 
    108112 
  • trunk/dba/dba/xmlarchive.cpp

    r127 r128  
    1111// 
    1212#include "xmlarchive.h" 
     13#include "fileutils.h" 
    1314 
    1415namespace dba { 
     
    1617XMLArchive::XMLArchive() 
    1718  : Archive(), 
     19    mRootNodeName((xmlChar*)"dba"), 
    1820    mDocument(NULL), 
    1921    mRootNode(NULL) 
     
    2325void  
    2426XMLArchive::open(const char* pOpenStr) { 
    25   //TODO 
    26 }; 
    27  
    28 void  
    29 XMLArchive::open(xmlNodePtr pRoot) { 
    30   //TODO 
     27  mFilename = pOpenStr; 
     28  ErrorContext c(this); 
     29  if (mDocument != NULL) { 
     30    xmlFreeDoc(mDocument); 
     31  };   
     32  if (FileUtils::exists(pOpenStr)) { 
     33    mDocument = xmlParseFile(pOpenStr); 
     34    if (mDocument == NULL) { 
     35      if (c.wasError()) 
     36        throw c.createException(); 
     37      else 
     38        throw XMLException("Error reading file"); 
     39    }; 
     40  } else { 
     41    mDocument = xmlNewDoc((const xmlChar*)"1.0"); 
     42    xmlNodePtr node = xmlNewDocNode(mDocument,NULL,mRootNodeName,NULL); 
     43    xmlDocSetRootElement(mDocument,node); 
     44  }; 
     45  mRootNode = mDocument->children; 
    3146}; 
    3247 
     
    4156}; 
    4257 
     58void 
     59XMLArchive::write() { 
     60  ErrorContext c(this); 
     61  int result = xmlSaveFileEnc(mFilename.c_str(), mDocument, ConvSpec::getXmlEncodingName(mConvSpecs.mDbCharset)); 
     62  if (result == -1) { 
     63    if (c.wasError()) 
     64      throw c.createException(); 
     65    else 
     66      throw XMLException("Unknown error when writing xml data to file"); 
     67  }; 
     68}; 
     69 
    4370XMLArchive::~XMLArchive() 
    4471{ 
    45   xmlFreeDoc(mDocument); 
     72  if (mDocument != NULL) { 
     73    write(); 
     74    xmlFreeDoc(mDocument); 
     75  }; 
    4676} 
    4777 
  • trunk/dba/dba/xmlarchive.h

    r127 r128  
    1414 
    1515#include "archive.h" 
     16#include "xmlerrorhandler.h" 
    1617#include <libxml/tree.h> 
    1718 
     
    2425Archive for XML file format serialization 
    2526*/ 
    26 class XMLArchive  : public Archive
     27class XMLArchive  : public Archive, public ConvSpecContainer, public XMLErrorHandler
    2728  public: 
    2829    XMLArchive(); 
    2930    virtual void open(const char* pOpenStr); 
    30     void open(xmlNodePtr pRoot); 
    3131    virtual bool isOpen() const { return mRootNode != NULL; } 
    3232    virtual IStream* getInputStream(); 
     
    3434    virtual ~XMLArchive(); 
    3535  private: 
     36    xmlChar* mRootNodeName; 
    3637    /** 
    3738      pointer to xml document. NULL if archive is open in external document 
     
    4445    */ 
    4546    xmlNodePtr mRootNode; 
     47    /** 
     48      name of file where mDocument is serialized 
     49    */ 
     50    std::string mFilename; 
     51     
     52    /** 
     53      Write contents of mDocument to file 
     54    */ 
     55    void write(); 
     56     
     57    /** 
     58      Convert ConvSpec::mDbEncoding constant to libxml2 encoding name 
     59    */ 
     60    const char* getLibxmlEncoding(); 
     61    /** 
     62      Convert libxml2 encoding name to ConvSpec constant 
     63    */ 
     64    ConvSpec::charset getDebeaEncoding(const char* pLibxmlEncoding); 
    4665}; 
    4766 
  • trunk/dba/test/xmltestcase.cpp

    r127 r128  
    1111// 
    1212#include "xmltestcase.h" 
     13#include "dba/fileutils.h" 
    1314 
    1415namespace dba_tests { 
     
    1819void  
    1920XMLTestCase::setUp() { 
    20   mArchive = new dba::XMLArchive; 
    2121}; 
    2222 
    2323void  
    2424XMLTestCase::tearDown() { 
    25   delete mArchive; 
    26   mArchive = NULL; 
    2725}; 
    2826 
    2927XMLTestCase::~XMLTestCase() { 
    30   delete mArchive; 
    3128}; 
    3229 
     
    3431void  
    3532XMLTestCase::empty() { 
    36   //TODO 
     33  {  
     34    unlink("empty.xml"); 
     35    dba::XMLArchive ar;   
     36    ar.open("empty.xml"); 
     37  }; 
     38  CPPUNIT_ASSERT(dba::FileUtils::exists("empty.xml")); 
    3739}; 
    3840 
  • trunk/dba/test/xmltestcase.h

    r127 r128  
    3636    void empty(); 
    3737  private: 
    38     dba::XMLArchive* mArchive; 
    3938}; 
    4039