rtlfield.hpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  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 rtlfield_hpp
  14. #define rtlfield_hpp
  15. #include "eclhelper.hpp"
  16. #include "eclrtl.hpp"
  17. /*
  18. The classes in this file are used to represent the type of various fields, and information about the fields.
  19. They are primarily designed to be used in generated code, so should have as little overhead as possible when used
  20. in that context. For that reason the classes have no destructors.
  21. The file rtldynfield contains classes which manage instances of these classes which are dynamically created.
  22. */
  23. size32_t ECLRTL_API getMinSize(const RtlFieldInfo * const * fields);
  24. // A base implementation of RtlTypeInfo
  25. struct ECLRTL_API RtlTypeInfoBase : public RtlTypeInfo
  26. {
  27. constexpr inline RtlTypeInfoBase(unsigned _fieldType, unsigned _length) : RtlTypeInfo(_fieldType, _length) {}
  28. virtual size32_t getMinSize() const override;
  29. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  30. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  31. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  32. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  33. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  34. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  35. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  36. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  37. virtual size32_t buildReal(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, double val) const override;
  38. virtual double getReal(const void * ptr) const override;
  39. virtual bool isScalar() const override;
  40. virtual bool isNumeric() const override { return false; }
  41. virtual bool canTruncate() const override { return false; }
  42. virtual bool canExtend(char &) const override { return false; }
  43. virtual const char * queryLocale() const override;
  44. virtual const RtlFieldInfo * const * queryFields() const override;
  45. virtual const RtlTypeInfo * queryChildType() const override;
  46. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  47. virtual void readAhead(IRowDeserializerSource & in) const override;
  48. };
  49. //-------------------------------------------------------------------------------------------------------------------
  50. struct ECLRTL_API RtlBoolTypeInfo : public RtlTypeInfoBase
  51. {
  52. constexpr inline RtlBoolTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  53. virtual void doDelete() const final override { delete this; }
  54. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  55. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  56. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  57. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  58. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  59. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  60. virtual __int64 getInt(const void * ptr) const override;
  61. };
  62. struct ECLRTL_API RtlRealTypeInfo : public RtlTypeInfoBase
  63. {
  64. constexpr inline RtlRealTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  65. virtual void doDelete() const final override { delete this; }
  66. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  67. virtual size32_t buildReal(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, double val) const override;
  68. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  69. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  70. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  71. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  72. virtual __int64 getInt(const void * ptr) const override;
  73. virtual double getReal(const void * ptr) const override;
  74. virtual bool isNumeric() const override { return true; }
  75. private:
  76. inline double value(const void * self) const;
  77. };
  78. //MORE: Create specialist versions
  79. struct ECLRTL_API RtlIntTypeInfo : public RtlTypeInfoBase
  80. {
  81. constexpr inline RtlIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  82. virtual void doDelete() const final override { delete this; }
  83. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  84. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  85. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  86. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  87. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  88. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  89. virtual __int64 getInt(const void * ptr) const override;
  90. virtual double getReal(const void * ptr) const override;
  91. virtual bool canTruncate() const override;
  92. virtual bool canExtend(char &fillChar) const override;
  93. virtual bool isNumeric() const override { return true; }
  94. };
  95. struct ECLRTL_API RtlSwapIntTypeInfo : public RtlTypeInfoBase
  96. {
  97. constexpr inline RtlSwapIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  98. virtual void doDelete() const final override { delete this; }
  99. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  100. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  101. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  102. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  103. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  104. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  105. virtual __int64 getInt(const void * ptr) const override;
  106. virtual double getReal(const void * ptr) const override;
  107. virtual bool canTruncate() const override;
  108. virtual bool canExtend(char &fillChar) const override;
  109. virtual bool isNumeric() const override { return true; }
  110. };
  111. struct ECLRTL_API RtlPackedIntTypeInfo : public RtlTypeInfoBase
  112. {
  113. constexpr inline RtlPackedIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  114. virtual void doDelete() const final override { delete this; }
  115. virtual size32_t getMinSize() const override;
  116. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  117. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  118. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  119. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  120. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  121. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  122. virtual void readAhead(IRowDeserializerSource & in) const override;
  123. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  124. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  125. virtual __int64 getInt(const void * ptr) const override;
  126. virtual double getReal(const void * ptr) const override;
  127. virtual bool isNumeric() const override { return true; }
  128. };
  129. struct ECLRTL_API RtlStringTypeInfo : public RtlTypeInfoBase
  130. {
  131. constexpr inline RtlStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  132. virtual void doDelete() const final override { delete this; }
  133. virtual size32_t getMinSize() const override;
  134. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  135. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  136. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  137. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  138. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t codepoints, const char *value) const override;
  139. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  140. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  141. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  142. virtual void readAhead(IRowDeserializerSource & in) const override;
  143. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  144. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  145. virtual __int64 getInt(const void * ptr) const override;
  146. virtual bool canTruncate() const override { return isFixedSize(); }
  147. virtual bool canExtend(char &fillChar) const override;
  148. };
  149. struct ECLRTL_API RtlDataTypeInfo : public RtlTypeInfoBase
  150. {
  151. constexpr inline RtlDataTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  152. virtual void doDelete() const final override { delete this; }
  153. virtual size32_t getMinSize() const override;
  154. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  155. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  156. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  157. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  158. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  159. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  160. virtual void readAhead(IRowDeserializerSource & in) const override;
  161. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  162. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  163. virtual __int64 getInt(const void * ptr) const override;
  164. virtual bool canTruncate() const override { return isFixedSize(); }
  165. virtual bool canExtend(char &fillChar) const override;
  166. };
  167. struct ECLRTL_API RtlVarStringTypeInfo : public RtlTypeInfoBase
  168. {
  169. constexpr inline RtlVarStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  170. virtual void doDelete() const final override { delete this; }
  171. virtual size32_t getMinSize() const override;
  172. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  173. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  174. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  175. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  176. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  177. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  178. virtual void readAhead(IRowDeserializerSource & in) const override;
  179. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  180. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  181. virtual __int64 getInt(const void * ptr) const override;
  182. virtual bool canExtend(char &fillChar) const override;
  183. };
  184. struct ECLRTL_API RtlQStringTypeInfo : public RtlTypeInfoBase
  185. {
  186. constexpr inline RtlQStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  187. virtual void doDelete() const final override { delete this; }
  188. virtual size32_t getMinSize() const override;
  189. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  190. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  191. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  192. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  193. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  194. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  195. virtual void readAhead(IRowDeserializerSource & in) const override;
  196. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  197. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  198. virtual __int64 getInt(const void * ptr) const override;
  199. virtual bool canExtend(char &fillChar) const override;
  200. };
  201. struct ECLRTL_API RtlDecimalTypeInfo : public RtlTypeInfoBase
  202. {
  203. constexpr inline RtlDecimalTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  204. virtual void doDelete() const final override { delete this; }
  205. virtual size32_t getMinSize() const override;
  206. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  207. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  208. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  209. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  210. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  211. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  212. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  213. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  214. virtual __int64 getInt(const void * ptr) const override;
  215. virtual double getReal(const void * ptr) const override;
  216. size32_t calcSize() const;
  217. };
  218. struct ECLRTL_API RtlCharTypeInfo : public RtlTypeInfoBase
  219. {
  220. constexpr inline RtlCharTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  221. virtual void doDelete() const final override { delete this; }
  222. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  223. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  224. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  225. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  226. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  227. virtual __int64 getInt(const void * ptr) const override;
  228. };
  229. struct ECLRTL_API RtlUnicodeTypeInfo : public RtlTypeInfoBase
  230. {
  231. public:
  232. constexpr inline RtlUnicodeTypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  233. virtual void doDelete() const final override { delete this; }
  234. virtual size32_t getMinSize() const override;
  235. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  236. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  237. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  238. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  239. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  240. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  241. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  242. virtual void readAhead(IRowDeserializerSource & in) const override;
  243. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  244. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  245. virtual __int64 getInt(const void * ptr) const override;
  246. virtual const char * queryLocale() const override { return locale; }
  247. protected:
  248. const char * locale;
  249. };
  250. struct ECLRTL_API RtlVarUnicodeTypeInfo : public RtlTypeInfoBase
  251. {
  252. public:
  253. constexpr inline RtlVarUnicodeTypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  254. virtual void doDelete() const final override { delete this; }
  255. virtual size32_t getMinSize() const override;
  256. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  257. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  258. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  259. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  260. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  261. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  262. virtual void readAhead(IRowDeserializerSource & in) const override;
  263. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  264. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  265. virtual __int64 getInt(const void * ptr) const override;
  266. virtual const char * queryLocale() const override { return locale; }
  267. protected:
  268. const char * locale;
  269. };
  270. struct ECLRTL_API RtlUtf8TypeInfo : public RtlTypeInfoBase
  271. {
  272. public:
  273. constexpr inline RtlUtf8TypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  274. virtual void doDelete() const final override { delete this; }
  275. virtual size32_t getMinSize() const override;
  276. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  277. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  278. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  279. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  280. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  281. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  282. virtual void readAhead(IRowDeserializerSource & in) const override;
  283. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  284. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  285. virtual __int64 getInt(const void * ptr) const override;
  286. virtual const char * queryLocale() const override { return locale; }
  287. protected:
  288. const char * locale;
  289. };
  290. struct ECLRTL_API RtlRecordTypeInfo : public RtlTypeInfoBase
  291. {
  292. constexpr inline RtlRecordTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields) : RtlTypeInfoBase(_fieldType, _length), fields(_fields) {}
  293. virtual void doDelete() const final override { delete this; }
  294. const RtlFieldInfo * const * fields; // null terminated
  295. virtual size32_t getMinSize() const override;
  296. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  297. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  298. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  299. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  300. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  301. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  302. virtual void readAhead(IRowDeserializerSource & in) const override;
  303. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  304. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  305. virtual __int64 getInt(const void * ptr) const override;
  306. virtual const RtlFieldInfo * const * queryFields() const override { return fields; }
  307. virtual bool isScalar() const override { return false; }
  308. };
  309. struct ECLRTL_API RtlCompoundTypeInfo : public RtlTypeInfoBase
  310. {
  311. constexpr inline RtlCompoundTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlTypeInfoBase(_fieldType, _length), child(_child) {}
  312. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  313. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  314. virtual __int64 getInt(const void * ptr) const override;
  315. virtual const RtlTypeInfo * queryChildType() const override { return child; }
  316. virtual bool isScalar() const override { return false; }
  317. const RtlTypeInfo * child;
  318. };
  319. struct ECLRTL_API RtlSetTypeInfo : public RtlCompoundTypeInfo
  320. {
  321. constexpr inline RtlSetTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  322. virtual void doDelete() const final override { delete this; }
  323. virtual size32_t getMinSize() const override;
  324. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  325. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  326. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  327. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  328. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  329. virtual void readAhead(IRowDeserializerSource & in) const override;
  330. };
  331. struct ECLRTL_API RtlRowTypeInfo : public RtlCompoundTypeInfo
  332. {
  333. constexpr inline RtlRowTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  334. virtual void doDelete() const final override { delete this; }
  335. virtual size32_t getMinSize() const override;
  336. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  337. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  338. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  339. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  340. virtual void readAhead(IRowDeserializerSource & in) const override;
  341. };
  342. struct ECLRTL_API RtlDatasetTypeInfo : public RtlCompoundTypeInfo
  343. {
  344. constexpr inline RtlDatasetTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  345. virtual void doDelete() const final override { delete this; }
  346. virtual size32_t getMinSize() const override;
  347. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  348. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  349. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  350. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  351. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  352. virtual void readAhead(IRowDeserializerSource & in) const override;
  353. };
  354. struct ECLRTL_API RtlDictionaryTypeInfo : public RtlCompoundTypeInfo
  355. {
  356. constexpr inline RtlDictionaryTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child, IHThorHashLookupInfo *_hashInfo)
  357. : RtlCompoundTypeInfo(_fieldType|RFTMnoserialize, _length, _child), hashInfo(_hashInfo) {}
  358. virtual void doDelete() const final override { delete this; }
  359. IHThorHashLookupInfo * hashInfo;
  360. virtual size32_t getMinSize() const override;
  361. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  362. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  363. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  364. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  365. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  366. virtual void readAhead(IRowDeserializerSource & in) const override;
  367. };
  368. struct ECLRTL_API RtlIfBlockTypeInfo : public RtlTypeInfoBase
  369. {
  370. constexpr inline RtlIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields) : RtlTypeInfoBase(_fieldType|RFTMnoserialize, _length), fields(_fields) {}
  371. const RtlFieldInfo * const * fields; // null terminated
  372. virtual bool getCondition(const byte * selfrow) const = 0;
  373. virtual size32_t getMinSize() const override;
  374. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  375. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  376. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  377. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  378. virtual void readAhead(IRowDeserializerSource & in) const override;
  379. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  380. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  381. virtual __int64 getInt(const void * ptr) const override;
  382. virtual bool isScalar() const override { return false; }
  383. virtual const RtlFieldInfo * const * queryFields() const override { return fields; }
  384. };
  385. struct ECLRTL_API RtlBitfieldTypeInfo : public RtlTypeInfoBase
  386. {
  387. constexpr inline RtlBitfieldTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  388. virtual void doDelete() const final override { delete this; }
  389. virtual size32_t getMinSize() const override;
  390. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  391. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  392. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  393. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  394. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  395. virtual __int64 getInt(const void * ptr) const override;
  396. protected:
  397. __int64 signedValue(const void * self) const;
  398. unsigned __int64 unsignedValue(const void * self) const;
  399. };
  400. struct ECLRTL_API RtlUnimplementedTypeInfo : public RtlTypeInfoBase
  401. {
  402. constexpr inline RtlUnimplementedTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  403. virtual void doDelete() const final override { delete this; }
  404. virtual size32_t getMinSize() const override;
  405. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  406. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  407. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  408. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  409. virtual void readAhead(IRowDeserializerSource & in) const override;
  410. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  411. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  412. virtual __int64 getInt(const void * ptr) const override;
  413. virtual bool isScalar() const override { return false; }
  414. };
  415. /*
  416. struct ECLRTL_API RtlAlienTypeInfo : public RtlTypeInfoBase
  417. {
  418. public:
  419. constexpr inline RtlAlienTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  420. virtual void doDelete() const final override { delete this; }
  421. virtual size32_t size(const byte * self, const byte * selfrow) const override = 0;
  422. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  423. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  424. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  425. virtual void readAhead(IRowDeserializerSource & in) const override;
  426. };
  427. */
  428. //-------------------------------------------------------------------------------------------------------------------
  429. struct ECLRTL_API RtlFieldStrInfo : public RtlFieldInfo
  430. {
  431. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type);
  432. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type, unsigned _flags);
  433. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type, unsigned _flags, const char * _initializer);
  434. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type, const char * _initializer); // So old WU dlls can load (and then fail) rather than failing to load.
  435. };
  436. extern unsigned ECLRTL_API countFields(const RtlFieldInfo * const * fields);
  437. #endif