thorxmlwrite.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef THORXMLWRITE_HPP
  14. #define THORXMLWRITE_HPP
  15. #ifdef _WIN32
  16. #ifdef THORHELPER_EXPORTS
  17. #define thorhelper_decl __declspec(dllexport)
  18. #else
  19. #define thorhelper_decl __declspec(dllimport)
  20. #endif
  21. #else
  22. #define thorhelper_decl
  23. #endif
  24. #include "eclhelper.hpp"
  25. #include "jptree.hpp"
  26. #include "thorhelper.hpp"
  27. interface IXmlStreamFlusher
  28. {
  29. virtual void flushXML(StringBuffer &current, bool isClose) = 0;
  30. };
  31. class thorhelper_decl CommonXmlWriter : public CInterface, implements IXmlWriter
  32. {
  33. public:
  34. CommonXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  35. ~CommonXmlWriter();
  36. IMPLEMENT_IINTERFACE;
  37. CommonXmlWriter & clear();
  38. unsigned length() const { return out.length(); }
  39. const char * str() const { return out.str(); }
  40. void outputBeginNested(const char *fieldname, bool nestChildren, bool doIndent);
  41. void outputEndNested(const char *fieldname, bool doIndent);
  42. virtual void outputInlineXml(const char *text){out.append(text); flush(false);} //for appending raw xml content
  43. virtual void outputQuoted(const char *text);
  44. virtual void outputQString(unsigned len, const char *field, const char *fieldname);
  45. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  46. virtual void outputBool(bool field, const char *fieldname);
  47. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  48. virtual void outputInt(__int64 field, const char *fieldname);
  49. virtual void outputUInt(unsigned __int64 field, const char *fieldname);
  50. virtual void outputReal(double field, const char *fieldname);
  51. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  52. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  53. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  54. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  55. virtual void outputBeginDataset(const char *dsname, bool nestChildren);
  56. virtual void outputEndDataset(const char *dsname);
  57. virtual void outputBeginNested(const char *fieldname, bool nestChildren);
  58. virtual void outputEndNested(const char *fieldname);
  59. virtual void outputBeginArray(const char *fieldname){}; //repeated elements are inline for xml
  60. virtual void outputEndArray(const char *fieldname){};
  61. virtual void outputSetAll();
  62. protected:
  63. bool checkForAttribute(const char * fieldname);
  64. void closeTag();
  65. inline void flush(bool isClose)
  66. {
  67. if (flusher)
  68. flusher->flushXML(out, isClose);
  69. }
  70. protected:
  71. IXmlStreamFlusher *flusher;
  72. StringBuffer out;
  73. unsigned flags;
  74. unsigned indent;
  75. unsigned nestLimit;
  76. bool tagClosed;
  77. };
  78. class thorhelper_decl CommonJsonWriter : public CInterface, implements IXmlWriter
  79. {
  80. public:
  81. CommonJsonWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  82. ~CommonJsonWriter();
  83. IMPLEMENT_IINTERFACE;
  84. CommonJsonWriter & clear();
  85. unsigned length() const { return out.length(); }
  86. const char * str() const { return out.str(); }
  87. void checkDelimit(int inc=0);
  88. void checkFormat(bool doDelimit, bool needDelimiter=true, int inc=0);
  89. virtual void outputInlineXml(const char *text) //for appending raw xml content
  90. {
  91. if (text && *text)
  92. outputUtf8(strlen(text), text, "xml");
  93. }
  94. virtual void outputQuoted(const char *text);
  95. virtual void outputQString(unsigned len, const char *field, const char *fieldname);
  96. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  97. virtual void outputBool(bool field, const char *fieldname);
  98. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  99. virtual void outputInt(__int64 field, const char *fieldname);
  100. virtual void outputUInt(unsigned __int64 field, const char *fieldname);
  101. virtual void outputReal(double field, const char *fieldname);
  102. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  103. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  104. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  105. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  106. virtual void outputBeginDataset(const char *dsname, bool nestChildren);
  107. virtual void outputEndDataset(const char *dsname);
  108. virtual void outputBeginNested(const char *fieldname, bool nestChildren);
  109. virtual void outputEndNested(const char *fieldname);
  110. virtual void outputBeginArray(const char *fieldname);
  111. virtual void outputEndArray(const char *fieldname);
  112. virtual void outputSetAll();
  113. void outputBeginRoot(){out.append('{');}
  114. void outputEndRoot(){out.append('}');}
  115. protected:
  116. inline void flush(bool isClose)
  117. {
  118. if (flusher)
  119. flusher->flushXML(out, isClose);
  120. }
  121. class CJsonWriterItem : public CInterface
  122. {
  123. public:
  124. CJsonWriterItem(const char *_name) : name(_name), depth(0){}
  125. StringAttr name;
  126. unsigned depth;
  127. };
  128. const char *checkItemName(CJsonWriterItem *item, const char *name, bool simpleType=true);
  129. const char *checkItemName(const char *name, bool simpleType=true);
  130. const char *checkItemNameBeginNested(const char *name);
  131. const char *checkItemNameEndNested(const char *name);
  132. IXmlStreamFlusher *flusher;
  133. CIArrayOf<CJsonWriterItem> arrays;
  134. StringBuffer out;
  135. unsigned flags;
  136. unsigned indent;
  137. unsigned nestLimit;
  138. bool needDelimiter;
  139. };
  140. //Writes type encoded XML strings (xsi:type="xsd:string", xsi:type="xsd:boolean" etc)
  141. class thorhelper_decl CommonEncodedXmlWriter : public CommonXmlWriter
  142. {
  143. public:
  144. CommonEncodedXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  145. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  146. virtual void outputBool(bool field, const char *fieldname);
  147. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  148. virtual void outputInt(__int64 field, const char *fieldname);
  149. virtual void outputUInt(unsigned __int64 field, const char *fieldname);
  150. virtual void outputReal(double field, const char *fieldname);
  151. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  152. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  153. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  154. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  155. };
  156. //Writes all encoded DATA fields as base64Binary
  157. class thorhelper_decl CommonEncoded64XmlWriter : public CommonEncodedXmlWriter
  158. {
  159. public:
  160. CommonEncoded64XmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL);
  161. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  162. };
  163. enum XMLWriterType{WTStandard, WTEncoding, WTEncodingData64, WTJSON} ;
  164. thorhelper_decl CommonXmlWriter * CreateCommonXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
  165. thorhelper_decl IXmlWriter * createIXmlWriter(unsigned _flags, unsigned initialIndent=0, IXmlStreamFlusher *_flusher=NULL, XMLWriterType xmlType=WTStandard);
  166. class thorhelper_decl SimpleOutputWriter : public CInterface, implements IXmlWriter
  167. {
  168. void outputFieldSeparator();
  169. bool separatorNeeded;
  170. public:
  171. SimpleOutputWriter();
  172. IMPLEMENT_IINTERFACE;
  173. SimpleOutputWriter & clear();
  174. unsigned length() const { return out.length(); }
  175. const char * str() const { return out.str(); }
  176. virtual void outputQuoted(const char *text);
  177. virtual void outputQString(unsigned len, const char *field, const char *fieldname);
  178. virtual void outputString(unsigned len, const char *field, const char *fieldname);
  179. virtual void outputBool(bool field, const char *fieldname);
  180. virtual void outputData(unsigned len, const void *field, const char *fieldname);
  181. virtual void outputInt(__int64 field, const char *fieldname);
  182. virtual void outputUInt(unsigned __int64 field, const char *fieldname);
  183. virtual void outputReal(double field, const char *fieldname);
  184. virtual void outputDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  185. virtual void outputUDecimal(const void *field, unsigned size, unsigned precision, const char *fieldname);
  186. virtual void outputUnicode(unsigned len, const UChar *field, const char *fieldname);
  187. virtual void outputUtf8(unsigned len, const char *field, const char *fieldname);
  188. virtual void outputBeginNested(const char *fieldname, bool nestChildren);
  189. virtual void outputEndNested(const char *fieldname);
  190. virtual void outputBeginDataset(const char *dsname, bool nestChildren){}
  191. virtual void outputEndDataset(const char *dsname){}
  192. virtual void outputBeginArray(const char *fieldname){}
  193. virtual void outputEndArray(const char *fieldname){}
  194. virtual void outputSetAll();
  195. virtual void outputInlineXml(const char *text){} //for appending raw xml content
  196. void newline();
  197. protected:
  198. StringBuffer out;
  199. };
  200. class thorhelper_decl CommonFieldProcessor : public CInterface, implements IFieldProcessor
  201. {
  202. bool trim;
  203. StringBuffer &result;
  204. public:
  205. IMPLEMENT_IINTERFACE;
  206. CommonFieldProcessor(StringBuffer &_result, bool _trim=false);
  207. virtual void processString(unsigned len, const char *value, const RtlFieldInfo * field);
  208. virtual void processBool(bool value, const RtlFieldInfo * field);
  209. virtual void processData(unsigned len, const void *value, const RtlFieldInfo * field);
  210. virtual void processInt(__int64 value, const RtlFieldInfo * field);
  211. virtual void processUInt(unsigned __int64 value, const RtlFieldInfo * field);
  212. virtual void processReal(double value, const RtlFieldInfo * field);
  213. virtual void processDecimal(const void *value, unsigned digits, unsigned precision, const RtlFieldInfo * field);
  214. virtual void processUDecimal(const void *value, unsigned digits, unsigned precision, const RtlFieldInfo * field);
  215. virtual void processUnicode(unsigned len, const UChar *value, const RtlFieldInfo * field);
  216. virtual void processQString(unsigned len, const char *value, const RtlFieldInfo * field);
  217. virtual void processUtf8(unsigned len, const char *value, const RtlFieldInfo * field);
  218. virtual bool processBeginSet(const RtlFieldInfo * field, unsigned numElements, bool isAll, const byte *data);
  219. virtual bool processBeginDataset(const RtlFieldInfo * field, unsigned numRows);
  220. virtual bool processBeginRow(const RtlFieldInfo * field);
  221. virtual void processEndSet(const RtlFieldInfo * field);
  222. virtual void processEndDataset(const RtlFieldInfo * field);
  223. virtual void processEndRow(const RtlFieldInfo * field);
  224. };
  225. extern thorhelper_decl void printKeyedValues(StringBuffer &out, IIndexReadContext *segs, IOutputMetaData *rowMeta);
  226. extern thorhelper_decl void convertRowToXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags = (unsigned)-1);
  227. #endif // THORXMLWRITE_HPP