rtlformat.hpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. #ifndef ECLFORMAT_HPP
  2. #define ECLFORMAT_HPP
  3. #include "jiface.hpp"
  4. #include "jfile.hpp"
  5. #include "eclrtl.hpp"
  6. #include "eclhelper.hpp"
  7. interface IXmlWriterExt : extends IXmlWriter
  8. {
  9. virtual IXmlWriterExt & clear() = 0;
  10. virtual size32_t length() const = 0;
  11. virtual const char *str() const = 0;
  12. virtual IInterface *saveLocation() const = 0;
  13. virtual void rewindTo(IInterface *location) = 0;
  14. virtual void cutFrom(IInterface *location, StringBuffer& databuf) = 0;
  15. virtual void outputNumericString(const char *field, const char *fieldname) = 0;
  16. virtual void outputInline(const char* text) = 0;
  17. };
  18. class ECLRTL_API SimpleOutputWriter : implements IXmlWriterExt, public CInterface
  19. {
  20. void outputFieldSeparator();
  21. bool separatorNeeded;
  22. public:
  23. SimpleOutputWriter();
  24. IMPLEMENT_IINTERFACE;
  25. virtual SimpleOutputWriter & clear() override;
  26. virtual size32_t length() const override { return out.length(); }
  27. virtual const char * str() const override { return out.str(); }
  28. virtual void outputQuoted(const char *text) override;
  29. virtual void outputQString(unsigned len, const char *field, const char *fieldname) override;
  30. virtual void outputString(unsigned len, const char *field, const char *fieldname) override;
  31. virtual void outputBool(bool field, const char *fieldname) override;
  32. virtual void outputData(unsigned len, const void *field, const char *fieldname) override;
  33. virtual void outputReal(double field, const char *fieldname) override;
  34. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname) override;
  35. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname) override;
  36. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname) override;
  37. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname) override;
  38. virtual void outputBeginNested(const char *fieldname, bool nestChildren) override;
  39. virtual void outputEndNested(const char *fieldname) override;
  40. virtual void outputBeginDataset(const char *dsname, bool nestChildren) override {}
  41. virtual void outputEndDataset(const char *dsname) override {}
  42. virtual void outputBeginArray(const char *fieldname) override {}
  43. virtual void outputEndArray(const char *fieldname) override {}
  44. virtual void outputSetAll() override;
  45. virtual void outputInlineXml(const char *text) override {} //for appending raw xml content
  46. virtual void outputXmlns(const char *name, const char *uri) override {}
  47. virtual void outputInt(__int64 field, unsigned size, const char *fieldname) override;
  48. virtual void outputUInt(unsigned __int64 field, unsigned size, const char *fieldname) override;
  49. void newline();
  50. virtual IInterface *saveLocation() const override { UNIMPLEMENTED; }
  51. virtual void rewindTo(IInterface *location) override { UNIMPLEMENTED; }
  52. virtual void cutFrom(IInterface *location, StringBuffer& databuf) override { UNIMPLEMENTED; }
  53. virtual void outputNumericString(const char *field, const char *fieldname) override { UNIMPLEMENTED; }
  54. virtual void outputInline(const char* text) override { UNIMPLEMENTED; }
  55. protected:
  56. StringBuffer out;
  57. };
  58. interface IXmlStreamFlusher
  59. {
  60. virtual void flushXML(StringBuffer &current, bool isClose) = 0;
  61. };
  62. class ECLRTL_API CommonXmlPosition : public CInterface, implements IInterface
  63. {
  64. public:
  65. IMPLEMENT_IINTERFACE;
  66. CommonXmlPosition(size32_t _pos, unsigned _indent, unsigned _nestLimit, bool _tagClosed, bool _needDelimiter) :
  67. pos(_pos), indent(_indent), nestLimit(_nestLimit), tagClosed(_tagClosed), needDelimiter(_needDelimiter)
  68. {}
  69. public:
  70. size32_t pos = 0;
  71. unsigned indent = 0;
  72. unsigned nestLimit = 0;
  73. bool tagClosed = false;
  74. bool needDelimiter = false;
  75. };
  76. class ECLRTL_API CommonXmlWriter : implements IXmlWriterExt, public CInterface
  77. {
  78. public:
  79. CommonXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  80. ~CommonXmlWriter();
  81. IMPLEMENT_IINTERFACE;
  82. void outputBeginNested(const char *fieldname, bool nestChildren, bool doIndent);
  83. void outputEndNested(const char *fieldname, bool doIndent);
  84. virtual void outputInlineXml(const char *text){closeTag(); out.append(text); flush(false);} //for appending raw xml content
  85. virtual void outputInline(const char* text) { outputInlineXml(text); }
  86. virtual void outputQuoted(const char *text);
  87. virtual void outputQString(unsigned len, const char *field, const char *fieldname);
  88. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  89. virtual void outputBool(bool field, const char *fieldname);
  90. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  91. virtual void outputInt(__int64 field, unsigned size, const char *fieldname);
  92. virtual void outputUInt(unsigned __int64 field, unsigned size, const char *fieldname);
  93. virtual void outputReal(double field, const char *fieldname);
  94. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  95. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  96. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  97. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  98. virtual void outputBeginDataset(const char *dsname, bool nestChildren);
  99. virtual void outputEndDataset(const char *dsname);
  100. virtual void outputBeginNested(const char *fieldname, bool nestChildren);
  101. virtual void outputEndNested(const char *fieldname);
  102. virtual void outputBeginArray(const char *fieldname){}; //repeated elements are inline for xml
  103. virtual void outputEndArray(const char *fieldname){};
  104. virtual void outputSetAll();
  105. virtual void outputXmlns(const char *name, const char *uri);
  106. //IXmlWriterExt
  107. virtual IXmlWriterExt & clear();
  108. virtual unsigned length() const { return out.length(); }
  109. virtual const char * str() const { return out.str(); }
  110. virtual IInterface *saveLocation() const
  111. {
  112. if (flusher)
  113. throwUnexpected();
  114. return new CommonXmlPosition(length(), indent, nestLimit, tagClosed, false);
  115. }
  116. virtual void rewindTo(IInterface *saved)
  117. {
  118. if (flusher)
  119. throwUnexpected();
  120. CommonXmlPosition *position = dynamic_cast<CommonXmlPosition *>(saved);
  121. if (!position)
  122. return;
  123. if (position->pos < out.length())
  124. {
  125. out.setLength(position->pos);
  126. tagClosed = position->tagClosed;
  127. indent = position->indent;
  128. nestLimit = position->nestLimit;
  129. }
  130. }
  131. virtual void cutFrom(IInterface *location, StringBuffer& databuf);
  132. virtual void outputNumericString(const char *field, const char *fieldname)
  133. {
  134. outputCString(field, fieldname);
  135. }
  136. protected:
  137. bool checkForAttribute(const char * fieldname);
  138. void closeTag();
  139. inline void flush(bool isClose)
  140. {
  141. if (flusher)
  142. flusher->flushXML(out, isClose);
  143. }
  144. protected:
  145. IXmlStreamFlusher *flusher;
  146. StringBuffer out;
  147. unsigned flags;
  148. unsigned indent;
  149. unsigned nestLimit;
  150. bool tagClosed;
  151. };
  152. class ECLRTL_API CommonJsonWriter : implements IXmlWriterExt, public CInterface
  153. {
  154. public:
  155. CommonJsonWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  156. ~CommonJsonWriter();
  157. IMPLEMENT_IINTERFACE;
  158. void checkDelimit(int inc=0);
  159. void checkFormat(bool doDelimit, bool needDelimiter=true, int inc=0);
  160. void prepareBeginArray(const char *fieldname);
  161. virtual void outputInlineXml(const char *text) //for appending raw xml content
  162. {
  163. if (text && *text)
  164. outputUtf8(strlen(text), text, "xml");
  165. }
  166. virtual void outputInline(const char* text) { out.append(text); }
  167. virtual void outputQuoted(const char *text);
  168. virtual void outputQString(unsigned len, const char *field, const char *fieldname);
  169. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  170. virtual void outputBool(bool field, const char *fieldname);
  171. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  172. virtual void outputInt(__int64 field, unsigned size, const char *fieldname);
  173. virtual void outputUInt(unsigned __int64 field, unsigned size, const char *fieldname);
  174. virtual void outputReal(double field, const char *fieldname);
  175. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  176. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  177. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  178. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  179. virtual void outputBeginDataset(const char *dsname, bool nestChildren);
  180. virtual void outputEndDataset(const char *dsname);
  181. virtual void outputBeginNested(const char *fieldname, bool nestChildren);
  182. virtual void outputEndNested(const char *fieldname);
  183. virtual void outputBeginArray(const char *fieldname);
  184. virtual void outputEndArray(const char *fieldname);
  185. virtual void outputSetAll();
  186. virtual void outputXmlns(const char *name, const char *uri){}
  187. virtual void outputNumericString(const char *field, const char *fieldname);
  188. //IXmlWriterExt
  189. virtual IXmlWriterExt & clear();
  190. virtual unsigned length() const { return out.length(); }
  191. virtual const char * str() const { return out.str(); }
  192. virtual void rewindTo(unsigned int prevlen) { if (prevlen < out.length()) out.setLength(prevlen); }
  193. virtual IInterface *saveLocation() const
  194. {
  195. if (flusher)
  196. throwUnexpected();
  197. return new CommonXmlPosition(length(), indent, nestLimit, false, needDelimiter);
  198. }
  199. virtual void rewindTo(IInterface *saved)
  200. {
  201. if (flusher)
  202. throwUnexpected();
  203. CommonXmlPosition *position = dynamic_cast<CommonXmlPosition *>(saved);
  204. if (!position)
  205. return;
  206. if (position->pos < out.length())
  207. {
  208. out.setLength(position->pos);
  209. needDelimiter = position->needDelimiter;
  210. indent = position->indent;
  211. nestLimit = position->nestLimit;
  212. }
  213. }
  214. virtual void cutFrom(IInterface *location, StringBuffer& databuf);
  215. void outputBeginRoot(){out.append('{');}
  216. void outputEndRoot(){out.append('}');}
  217. protected:
  218. inline void flush(bool isClose)
  219. {
  220. if (flusher)
  221. flusher->flushXML(out, isClose);
  222. }
  223. class CJsonWriterItem : public CInterface
  224. {
  225. public:
  226. CJsonWriterItem(const char *_name) : name(_name), depth(0){}
  227. StringAttr name;
  228. unsigned depth;
  229. };
  230. const char *checkItemName(CJsonWriterItem *item, const char *name, bool simpleType=true);
  231. const char *checkItemName(const char *name, bool simpleType=true);
  232. const char *checkItemNameBeginNested(const char *name);
  233. const char *checkItemNameEndNested(const char *name);
  234. bool checkUnamedArrayItem(bool begin);
  235. IXmlStreamFlusher *flusher;
  236. CIArrayOf<CJsonWriterItem> arrays;
  237. StringBuffer out;
  238. unsigned flags;
  239. unsigned indent;
  240. unsigned nestLimit;
  241. bool needDelimiter;
  242. };
  243. class ECLRTL_API CPropertyTreeWriter : public CSimpleInterfaceOf<IXmlWriter>
  244. {
  245. public:
  246. CPropertyTreeWriter(IPropertyTree *_root=nullptr, unsigned _flags=0);
  247. void setRoot(IPropertyTree &_root);
  248. virtual void outputInlineXml(const char *text) override;
  249. virtual void outputQuoted(const char *text) override;
  250. virtual void outputQString(unsigned len, const char *field, const char *fieldname) override;
  251. virtual void outputString(unsigned len, const char *field, const char *fieldname) override;
  252. virtual void outputBool(bool field, const char *fieldname) override;
  253. virtual void outputData(unsigned len, const void *field, const char *fieldname) override;
  254. virtual void outputInt(__int64 field, unsigned size, const char *fieldname) override;
  255. virtual void outputUInt(unsigned __int64 field, unsigned size, const char *fieldname) override;
  256. virtual void outputReal(double field, const char *fieldname) override;
  257. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname) override;
  258. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname) override;
  259. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname) override;
  260. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname) override;
  261. virtual void outputBeginDataset(const char *dsname, bool nestChildren) override;
  262. virtual void outputEndDataset(const char *dsname) override;
  263. virtual void outputBeginNested(const char *fieldname, bool nestChildren) override;
  264. virtual void outputEndNested(const char *fieldname) override;
  265. virtual void outputBeginArray(const char *fieldname) override {}; //repeated elements are inline for xml
  266. virtual void outputEndArray(const char *fieldname) override {};
  267. virtual void outputSetAll();
  268. virtual void outputXmlns(const char *name, const char *uri);
  269. protected:
  270. bool checkForAttribute(const char * fieldname);
  271. protected:
  272. Linked<IPropertyTree> root;
  273. IPropertyTree *target = nullptr;
  274. ICopyArrayOf<IPropertyTree> nestedLevels;
  275. unsigned flags;
  276. };
  277. ECLRTL_API StringBuffer &buildJsonHeader(StringBuffer &header, const char *suppliedHeader, const char *rowTag);
  278. ECLRTL_API StringBuffer &buildJsonFooter(StringBuffer &footer, const char *suppliedFooter, const char *rowTag);
  279. //Writes type encoded XML strings (xsi:type="xsd:string", xsi:type="xsd:boolean" etc)
  280. class ECLRTL_API CommonEncodedXmlWriter : public CommonXmlWriter
  281. {
  282. public:
  283. CommonEncodedXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  284. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  285. virtual void outputBool(bool field, const char *fieldname);
  286. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  287. virtual void outputInt(__int64 field, unsigned size, const char *fieldname);
  288. virtual void outputUInt(unsigned __int64 field, unsigned size, const char *fieldname);
  289. virtual void outputReal(double field, const char *fieldname);
  290. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  291. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  292. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  293. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  294. };
  295. //Writes all encoded DATA fields as base64Binary
  296. class ECLRTL_API CommonEncoded64XmlWriter : public CommonEncodedXmlWriter
  297. {
  298. public:
  299. CommonEncoded64XmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  300. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  301. };
  302. enum XMLWriterType{WTStandard, WTEncoding, WTEncodingData64, WTJSON} ;
  303. ECLRTL_API CommonXmlWriter * CreateCommonXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
  304. ECLRTL_API IXmlWriterExt * createIXmlWriterExt(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
  305. struct CSVOptions
  306. {
  307. StringAttr delimiter, terminator;
  308. bool includeHeader;
  309. };
  310. class CCSVItem : public CInterface, implements IInterface
  311. {
  312. unsigned columnID, nextRowID, rowCount, nestedLayer;
  313. StringAttr name, type, value, parentXPath;
  314. StringArray childNames;
  315. MapStringTo<bool> childNameMap;
  316. bool isNestedItem, simpleNested, currentRowEmpty, outputHeader = false;
  317. public:
  318. CCSVItem() : columnID(0), nestedLayer(0), nextRowID(0), rowCount(0), isNestedItem(false),
  319. simpleNested(false), currentRowEmpty(true) { };
  320. IMPLEMENT_IINTERFACE;
  321. inline const char* getName() const { return name.get(); };
  322. inline void setName(const char* _name) { name.set(_name); };
  323. inline const char* getValue() const { return value.get(); };
  324. inline void setValue(const char* _value) { value.set(_value); };
  325. inline unsigned getColumnID() const { return columnID; };
  326. inline void setColumnID(unsigned _columnID) { columnID = _columnID; };
  327. inline unsigned getNextRowID() const { return nextRowID; };
  328. inline void setNextRowID(unsigned _rowID) { nextRowID = _rowID; };
  329. inline void incrementNextRowID() { nextRowID++; };
  330. inline unsigned getRowCount() const { return rowCount; };
  331. inline void setRowCount(unsigned _rowCount) { rowCount = _rowCount; };
  332. inline void incrementRowCount() { rowCount++; };
  333. inline bool getCurrentRowEmpty() const { return currentRowEmpty; };
  334. inline void setCurrentRowEmpty(bool _currentRowEmpty) { currentRowEmpty = _currentRowEmpty; };
  335. inline unsigned getNestedLayer() const { return nestedLayer; };
  336. inline void setNestedLayer(unsigned _nestedLayer) { nestedLayer = _nestedLayer; };
  337. inline bool checkIsNestedItem() const { return isNestedItem; };
  338. inline void setIsNestedItem(bool _isNestedItem) { isNestedItem = _isNestedItem; };
  339. inline bool checkSimpleNested() const { return simpleNested; };
  340. inline void setSimpleNested(bool _simpleNested) { simpleNested = _simpleNested; };
  341. inline bool checkOutputHeader() const { return outputHeader; };
  342. inline void setOutputHeader(bool _outputHeader) { outputHeader = _outputHeader; };
  343. inline const char* getParentXPath() const { return parentXPath.str(); };
  344. inline void setParentXPath(const char* _parentXPath) { parentXPath.set(_parentXPath); };
  345. inline StringArray& getChildrenNames() { return childNames; };
  346. inline void addChildName(const char* name)
  347. {
  348. if (hasChildName(name))
  349. return;
  350. childNameMap.setValue(name, true);
  351. childNames.append(name);
  352. };
  353. inline bool hasChildName(const char* name)
  354. {
  355. bool* found = childNameMap.getValue(name);
  356. return (found && *found);
  357. };
  358. inline void clearContentVariables()
  359. {
  360. nextRowID = rowCount = 0;
  361. currentRowEmpty = true;
  362. };
  363. };
  364. class CCSVRow : public CInterface, implements IInterface
  365. {
  366. unsigned rowID;
  367. CIArrayOf<CCSVItem> columns;
  368. public:
  369. CCSVRow(unsigned _rowID) : rowID(_rowID) {};
  370. IMPLEMENT_IINTERFACE;
  371. inline unsigned getRowID() const { return rowID; };
  372. inline void setRowID(unsigned _rowID) { rowID = _rowID; };
  373. inline unsigned getColumnCount() const { return columns.length(); };
  374. const char* getColumnValue(unsigned columnID) const;
  375. void setColumn(unsigned columnID, const char* columnName, const char* columnValue);
  376. };
  377. //CommonCSVWriter is used to output a WU result in CSV format.
  378. //Read CSV header information;
  379. //If needed, output CSV headers into the 'out' buffer;
  380. //Read each row (a record) of the WU result and output into the 'out' buffer;
  381. //The 'out' buffer can be accessed through the str() method.
  382. class ECLRTL_API CommonCSVWriter: public CInterface, implements IXmlWriterExt
  383. {
  384. class CXPathItem : public CInterface, implements IInterface
  385. {
  386. bool isArray;
  387. StringAttr path;
  388. public:
  389. CXPathItem(const char* _path, bool _isArray) : path(_path), isArray(_isArray) { };
  390. IMPLEMENT_IINTERFACE;
  391. inline const char* getPath() const { return path.get(); };
  392. inline bool getIsArray() const { return isArray; };
  393. };
  394. CSVOptions options;
  395. bool readingCSVHeader, addingSimpleNestedContent;
  396. unsigned recordCount, headerColumnID, nestedHeaderLayerID;
  397. StringBuffer currentParentXPath, auditOut;
  398. StringArray headerXPathList;
  399. MapStringTo<bool> topHeaderNameMap;
  400. MapStringToMyClass<CCSVItem> csvItems;
  401. CIArrayOf<CCSVRow> contentRowsBuffer;
  402. CIArrayOf<CXPathItem> dataXPath;//xpath in caller
  403. void escapeQuoted(unsigned len, char const* in, StringBuffer& out);
  404. bool checkHeaderName(const char* name);
  405. CCSVItem* getParentCSVItem();
  406. CCSVItem* getCSVItemByFieldName(const char* name);
  407. void addColumnToRow(CIArrayOf<CCSVRow>& rows, unsigned rowID, unsigned colID, const char* columnValue, const char* columnName);
  408. void addCSVHeader(const char* name, const char* type, bool isNested, bool simpleNested, bool outputHeader);
  409. void addContentField(const char* field, const char* fieldName);
  410. void addStringField(unsigned len, const char* field, const char* fieldName);
  411. void setChildrenNextRowID(const char* path, unsigned rowID);
  412. unsigned getChildrenMaxNextRowID(const char* path);
  413. unsigned getChildrenMaxColumnID(CCSVItem* item, unsigned& maxColumnID);
  414. void addChildNameToParentCSVItem(const char* name);
  415. void setParentItemRowEmpty(CCSVItem* item, bool empty);
  416. void addFieldToParentXPath(const char* fieldName);
  417. void removeFieldFromCurrentParentXPath(const char* fieldName);
  418. void appendDataXPathItem(const char* fieldName, bool isArray);
  419. bool isDataRow(const char* fieldName);
  420. void outputCSVRows(CIArrayOf<CCSVRow>& rows, bool isHeader);
  421. void outputHeadersToBuffer();
  422. void finishContentResultRow();
  423. void auditHeaderInfo()
  424. {
  425. ForEachItemIn(i, headerXPathList)
  426. {
  427. const char* path = headerXPathList.item(i);
  428. CCSVItem* item = csvItems.getValue(path);
  429. if (!item)
  430. continue;
  431. if (!item->checkIsNestedItem())
  432. {
  433. auditOut.appendf("dumpHeaderInfo path<%s> next row<%d> col<%d>: name<%s> - value<%s>\n", path, item->getNextRowID(),
  434. item->getColumnID(), item->getName() ? item->getName() : "", item->getValue() ? item->getValue() : "");
  435. }
  436. else
  437. {
  438. auditOut.appendf("dumpHeaderInfo path<%s> next row<%d> col<%d>: name<%s> - value<%s>\n", path, item->getNextRowID(),
  439. item->getColumnID(), item->getName() ? item->getName() : "", item->getValue() ? item->getValue() : "");
  440. }
  441. }
  442. }
  443. public:
  444. CommonCSVWriter(unsigned _flags, CSVOptions& _options, IXmlStreamFlusher* _flusher = NULL);
  445. ~CommonCSVWriter();
  446. IMPLEMENT_IINTERFACE;
  447. inline void flush(bool isClose)
  448. {
  449. if (flusher)
  450. flusher->flushXML(out, isClose);
  451. }
  452. virtual unsigned length() const { return out.length(); }
  453. virtual const char* str() const { return out.str(); }
  454. virtual void rewindTo(IInterface* location) { };
  455. virtual void cutFrom(IInterface *location, StringBuffer& databuf) { };
  456. virtual IInterface* saveLocation() const
  457. {
  458. if (flusher)
  459. throwUnexpected();
  460. return NULL;
  461. };
  462. //IXmlWriter
  463. virtual void outputString(unsigned len, const char* field, const char* fieldName);
  464. virtual void outputBool(bool field, const char* fieldName);
  465. virtual void outputData(unsigned len, const void* field, const char* fieldName);
  466. virtual void outputInt(__int64 field, unsigned size, const char* fieldName);
  467. virtual void outputUInt(unsigned __int64 field, unsigned size, const char* fieldName);
  468. virtual void outputReal(double field, const char *fieldName);
  469. virtual void outputDecimal(const void* field, unsigned size, unsigned precision, const char* fieldName);
  470. virtual void outputUDecimal(const void* field, unsigned size, unsigned precision, const char* fieldName);
  471. virtual void outputUnicode(unsigned len, const UChar* field, const char* fieldName);
  472. virtual void outputQString(unsigned len, const char* field, const char* fieldName);
  473. virtual void outputUtf8(unsigned len, const char* field, const char* fieldName);
  474. virtual void outputBeginNested(const char* fieldName, bool simpleNested);
  475. virtual void outputEndNested(const char* fieldName);
  476. virtual void outputBeginDataset(const char* dsname, bool nestChildren);
  477. virtual void outputEndDataset(const char* dsname);
  478. virtual void outputBeginArray(const char* fieldName);
  479. virtual void outputEndArray(const char* fieldName);
  480. virtual void outputSetAll() { };
  481. virtual void outputXmlns(const char* name, const char* uri) { };
  482. virtual void outputQuoted(const char* text)
  483. {
  484. //No fieldName. Is it valid for CSV?
  485. };
  486. virtual void outputInlineXml(const char* text)//for appending raw xml content
  487. {
  488. //Dynamically add a new header 'xml' and insert the header.
  489. //But, not sure we want to do that for a big WU result.
  490. //if (text && *text)
  491. //outputUtf8(strlen(text), text, "xml");
  492. };
  493. virtual void outputInline(const char* text) { out.append(text); }
  494. //IXmlWriterExt
  495. virtual void outputNumericString(const char* field, const char* fieldName);
  496. virtual IXmlWriterExt& clear();
  497. void outputBeginNested(const char* fieldName, bool simpleNested, bool outputHeader);
  498. void outputEndNested(const char* fieldName, bool outputHeader);
  499. void outputCSVHeader(const char* name, const char* type);
  500. void finishCSVHeaders();
  501. const char* auditStr() const { return auditOut.str(); }
  502. protected:
  503. IXmlStreamFlusher* flusher;
  504. StringBuffer out;
  505. unsigned flags;
  506. };
  507. #endif