rtlfield.hpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  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. interface IFieldFilter;
  24. class RtlRow;
  25. size32_t ECLRTL_API getMinSize(const RtlFieldInfo * const * fields);
  26. // A base implementation of RtlTypeInfo
  27. // base classes should always implement buildString and buildUtf8 - default implementations of buildInt/buildReal
  28. // are implemented in terms of them.
  29. // The helper function buildUtf8ViaString can be used to provide a simple implementation of buildUtf8
  30. struct ECLRTL_API RtlTypeInfoBase : public RtlTypeInfo
  31. {
  32. constexpr inline RtlTypeInfoBase(unsigned _fieldType, unsigned _length) : RtlTypeInfo(_fieldType, _length) {}
  33. virtual size32_t getMinSize() const override;
  34. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  35. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  36. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  37. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  38. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  39. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  40. virtual size32_t buildReal(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, double val) const override;
  41. virtual double getReal(const void * ptr) const override;
  42. virtual bool isScalar() const override;
  43. virtual bool isNumeric() const override { return false; }
  44. virtual bool canTruncate() const override { return false; }
  45. virtual bool canExtend(char &) const override { return false; }
  46. virtual bool canMemCmp() const override { return false; }
  47. virtual bool equivalent(const RtlTypeInfo *) const override;
  48. virtual const char * queryLocale() const override;
  49. virtual const RtlFieldInfo * const * queryFields() const override;
  50. virtual const RtlTypeInfo * queryChildType() const override;
  51. virtual const IFieldFilter * queryFilter() const override;
  52. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  53. virtual void readAhead(IRowPrefetcherSource & in) const override;
  54. virtual void doCleanup() const override {}
  55. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  56. virtual void setLowBound(void * buffer, const byte * value, size32_t subLength, bool inclusive) const override;
  57. virtual void setHighBound(void * buffer, const byte * value, size32_t subLength, bool inclusive) const override;
  58. protected:
  59. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const;
  60. size32_t buildUtf8ViaString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const;
  61. void getUtf8ViaString(size32_t & resultLen, char * & result, const void * ptr) const;
  62. };
  63. //-------------------------------------------------------------------------------------------------------------------
  64. struct ECLRTL_API RtlBoolTypeInfo final : public RtlTypeInfoBase
  65. {
  66. constexpr inline RtlBoolTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  67. virtual void doDelete() const override { delete this; }
  68. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  69. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  70. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  71. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  72. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  73. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  74. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  75. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  76. virtual __int64 getInt(const void * ptr) const override;
  77. virtual int compare(const byte * left, const byte * right) const override;
  78. virtual bool canMemCmp() const override { return true; }
  79. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  80. protected:
  81. bool getBool(const void * ptr) const;
  82. };
  83. struct ECLRTL_API RtlRealTypeInfo final : public RtlTypeInfoBase
  84. {
  85. constexpr inline RtlRealTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  86. virtual void doDelete() const override { delete this; }
  87. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  88. virtual size32_t buildReal(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, double val) const override;
  89. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  90. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  91. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  92. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  93. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  94. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  95. virtual __int64 getInt(const void * ptr) const override;
  96. virtual double getReal(const void * ptr) const override;
  97. virtual bool isNumeric() const override { return true; }
  98. virtual int compare(const byte * left, const byte * right) const override;
  99. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  100. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  101. private:
  102. inline double value(const void * self) const;
  103. };
  104. struct ECLRTL_API RtlIntTypeInfo final : public RtlTypeInfoBase
  105. {
  106. constexpr inline RtlIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  107. virtual void doDelete() const override { delete this; }
  108. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  109. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  110. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  111. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  112. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  113. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  114. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  115. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  116. virtual __int64 getInt(const void * ptr) const override;
  117. virtual double getReal(const void * ptr) const override;
  118. virtual bool canTruncate() const override;
  119. virtual bool canExtend(char &fillChar) const override;
  120. virtual bool isNumeric() const override { return true; }
  121. virtual int compare(const byte * left, const byte * right) const override;
  122. virtual bool canMemCmp() const override;
  123. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  124. };
  125. struct ECLRTL_API RtlBlobTypeInfo final : public RtlTypeInfoBase
  126. {
  127. // Used for values stored in blobs. The child type represents the original type
  128. constexpr inline RtlBlobTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo *_child)
  129. : RtlTypeInfoBase(_fieldType, _length), child(_child)
  130. {}
  131. virtual void doDelete() const override { delete this; }
  132. virtual size32_t getMinSize() const override;
  133. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  134. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  135. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  136. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  137. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  138. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  139. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  140. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  141. virtual __int64 getInt(const void * ptr) const override;
  142. virtual double getReal(const void * ptr) const override;
  143. virtual bool canTruncate() const override;
  144. virtual bool canExtend(char &fillChar) const override;
  145. virtual bool isNumeric() const override { return false; }
  146. virtual bool isScalar() const override { return false; }
  147. virtual int compare(const byte * left, const byte * right) const override;
  148. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  149. virtual const RtlTypeInfo * queryChildType() const override { return child; }
  150. private:
  151. const RtlTypeInfo *child = nullptr;
  152. };
  153. struct ECLRTL_API RtlSwapIntTypeInfo final : public RtlTypeInfoBase
  154. {
  155. constexpr inline RtlSwapIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  156. virtual void doDelete() const override { delete this; }
  157. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  158. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  159. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  160. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  161. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  162. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  163. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  164. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  165. virtual __int64 getInt(const void * ptr) const override;
  166. virtual double getReal(const void * ptr) const override;
  167. virtual bool canTruncate() const override;
  168. virtual bool canExtend(char &fillChar) const override;
  169. virtual bool isNumeric() const override { return true; }
  170. virtual int compare(const byte * left, const byte * right) const override;
  171. virtual bool canMemCmp() const override;
  172. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  173. };
  174. struct ECLRTL_API RtlKeyedIntTypeInfo final : public RtlTypeInfoBase
  175. {
  176. constexpr inline RtlKeyedIntTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo *_child) : RtlTypeInfoBase(_fieldType, _length), child(_child) {}
  177. virtual void doDelete() const override { delete this; }
  178. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  179. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  180. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  181. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  182. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  183. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  184. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  185. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  186. virtual __int64 getInt(const void * ptr) const override;
  187. virtual double getReal(const void * ptr) const override;
  188. virtual bool isNumeric() const override { return true; }
  189. virtual int compare(const byte * left, const byte * right) const override;
  190. virtual bool canMemCmp() const override { return true; }
  191. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  192. virtual const RtlTypeInfo * queryChildType() const override;
  193. private:
  194. inline __uint64 getUInt(const void * ptr) const { return (__uint64) getInt(ptr); }
  195. static unsigned __int64 addBias(__int64 value, unsigned length);
  196. static __int64 removeBias(unsigned __int64 value, unsigned length);
  197. const RtlTypeInfo *child = nullptr;
  198. };
  199. struct ECLRTL_API RtlPackedIntTypeInfo final : public RtlTypeInfoBase
  200. {
  201. constexpr inline RtlPackedIntTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  202. virtual void doDelete() const override { delete this; }
  203. virtual size32_t getMinSize() const override;
  204. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  205. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  206. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  207. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  208. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  209. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  210. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  211. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  212. virtual void readAhead(IRowPrefetcherSource & in) const override;
  213. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  214. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  215. virtual __int64 getInt(const void * ptr) const override;
  216. virtual double getReal(const void * ptr) const override;
  217. virtual bool isNumeric() const override { return true; }
  218. virtual int compare(const byte * left, const byte * right) const override;
  219. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  220. };
  221. struct ECLRTL_API RtlStringTypeInfo final : public RtlTypeInfoBase
  222. {
  223. constexpr inline RtlStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  224. virtual void doDelete() const override { delete this; }
  225. virtual size32_t getMinSize() const override;
  226. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  227. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  228. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  229. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  230. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t codepoints, const char *value) const override;
  231. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  232. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  233. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  234. virtual void readAhead(IRowPrefetcherSource & in) const override;
  235. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  236. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  237. virtual __int64 getInt(const void * ptr) const override;
  238. virtual bool canTruncate() const override { return isFixedSize(); }
  239. virtual bool canExtend(char &fillChar) const override;
  240. virtual int compare(const byte * left, const byte * right) const override;
  241. virtual bool canMemCmp() const override;
  242. virtual unsigned hash(const byte * self, unsigned inhash) const override;
  243. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  244. };
  245. struct ECLRTL_API RtlDataTypeInfo final : public RtlTypeInfoBase
  246. {
  247. constexpr inline RtlDataTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  248. virtual void doDelete() const override { delete this; }
  249. virtual size32_t getMinSize() const override;
  250. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  251. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  252. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  253. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  254. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  255. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  256. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  257. virtual void readAhead(IRowPrefetcherSource & in) const override;
  258. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  259. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  260. virtual __int64 getInt(const void * ptr) const override;
  261. virtual bool canTruncate() const override { return isFixedSize(); }
  262. virtual bool canExtend(char &fillChar) const override;
  263. virtual int compare(const byte * left, const byte * right) const override;
  264. virtual bool canMemCmp() const override;
  265. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  266. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  267. };
  268. struct ECLRTL_API RtlVarStringTypeInfo final : public RtlTypeInfoBase
  269. {
  270. constexpr inline RtlVarStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  271. virtual void doDelete() const override { delete this; }
  272. virtual size32_t getMinSize() const override;
  273. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  274. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  275. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  276. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  277. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  278. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  279. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  280. virtual void readAhead(IRowPrefetcherSource & in) const override;
  281. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  282. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  283. virtual __int64 getInt(const void * ptr) const override;
  284. virtual bool canExtend(char &fillChar) const override;
  285. virtual int compare(const byte * left, const byte * right) const override;
  286. virtual unsigned hash(const byte * self, unsigned inhash) const override;
  287. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  288. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  289. };
  290. struct ECLRTL_API RtlQStringTypeInfo final : public RtlTypeInfoBase
  291. {
  292. constexpr inline RtlQStringTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  293. virtual void doDelete() const override { delete this; }
  294. virtual size32_t getMinSize() const override;
  295. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  296. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  297. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  298. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) 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(IRowPrefetcherSource & 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 bool canExtend(char &fillChar) const override;
  307. virtual int compare(const byte * left, const byte * right) const override;
  308. virtual bool canMemCmp() const override;
  309. virtual unsigned hash(const byte * self, unsigned inhash) const override;
  310. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  311. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  312. };
  313. struct ECLRTL_API RtlDecimalTypeInfo final : public RtlTypeInfoBase
  314. {
  315. constexpr inline RtlDecimalTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  316. virtual void doDelete() const override { delete this; }
  317. virtual size32_t getMinSize() const override;
  318. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  319. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  320. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  321. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  322. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  323. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  324. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  325. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  326. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  327. virtual __int64 getInt(const void * ptr) const override;
  328. virtual double getReal(const void * ptr) const override;
  329. virtual int compare(const byte * left, const byte * right) const override;
  330. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  331. size32_t calcSize() const;
  332. };
  333. struct ECLRTL_API RtlCharTypeInfo final : public RtlTypeInfoBase
  334. {
  335. constexpr inline RtlCharTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  336. virtual void doDelete() const override { delete this; }
  337. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  338. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  339. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  340. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  341. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  342. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  343. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  344. virtual __int64 getInt(const void * ptr) const override;
  345. virtual int compare(const byte * left, const byte * right) const override;
  346. virtual bool canMemCmp() const override { return true; }
  347. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  348. };
  349. struct ECLRTL_API RtlUnicodeTypeInfo final : public RtlTypeInfoBase
  350. {
  351. public:
  352. constexpr inline RtlUnicodeTypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  353. virtual void doDelete() const override { delete this; }
  354. virtual size32_t getMinSize() const override;
  355. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  356. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  357. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  358. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  359. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  360. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  361. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  362. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  363. virtual void readAhead(IRowPrefetcherSource & in) const override;
  364. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  365. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  366. virtual __int64 getInt(const void * ptr) const override;
  367. virtual int compare(const byte * left, const byte * right) const override;
  368. virtual unsigned hash(const byte * self, unsigned inhash) const override;
  369. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  370. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  371. virtual const char * queryLocale() const override { return locale; }
  372. protected:
  373. const char * locale;
  374. };
  375. struct ECLRTL_API RtlVarUnicodeTypeInfo final : public RtlTypeInfoBase
  376. {
  377. public:
  378. constexpr inline RtlVarUnicodeTypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  379. virtual void doDelete() const override { delete this; }
  380. virtual size32_t getMinSize() const override;
  381. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  382. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  383. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  384. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  385. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  386. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  387. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  388. virtual void readAhead(IRowPrefetcherSource & in) const override;
  389. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  390. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  391. virtual __int64 getInt(const void * ptr) const override;
  392. virtual int compare(const byte * left, const byte * right) const override;
  393. virtual unsigned hash(const byte * _self, unsigned inhash) const override;
  394. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  395. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  396. virtual const char * queryLocale() const override { return locale; }
  397. protected:
  398. const char * locale;
  399. };
  400. struct ECLRTL_API RtlUtf8TypeInfo final : public RtlTypeInfoBase
  401. {
  402. public:
  403. constexpr inline RtlUtf8TypeInfo(unsigned _fieldType, unsigned _length, const char * _locale) : RtlTypeInfoBase(_fieldType, _length), locale(_locale) {}
  404. virtual void doDelete() const override { delete this; }
  405. virtual size32_t getMinSize() const override;
  406. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  407. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  408. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  409. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  410. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  411. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  412. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  413. virtual void readAhead(IRowPrefetcherSource & in) const override;
  414. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  415. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  416. virtual __int64 getInt(const void * ptr) const override;
  417. virtual int compare(const byte * left, const byte * right) const override;
  418. virtual unsigned hash(const byte * self, unsigned inhash) const override;
  419. virtual int compareRange(size32_t lenLeft, const byte * left, size32_t lenRight, const byte * right) const override;
  420. virtual void setBound(void * buffer, const byte * value, size32_t subLength, byte fill, bool inclusive) const override;
  421. virtual const char * queryLocale() const override { return locale; }
  422. protected:
  423. const char * locale;
  424. };
  425. struct ECLRTL_API RtlRecordTypeInfo final : public RtlTypeInfoBase
  426. {
  427. constexpr inline RtlRecordTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields) : RtlTypeInfoBase(_fieldType, _length), fields(_fields) {}
  428. virtual void doDelete() const override { delete this; }
  429. const RtlFieldInfo * const * fields; // null terminated
  430. virtual size32_t getMinSize() const override;
  431. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  432. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  433. virtual size32_t buildNull(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field) const override;
  434. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  435. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  436. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  437. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  438. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  439. virtual void readAhead(IRowPrefetcherSource & in) const override;
  440. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  441. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  442. virtual __int64 getInt(const void * ptr) const override;
  443. virtual int compare(const byte * left, const byte * right) const override;
  444. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  445. virtual const RtlFieldInfo * const * queryFields() const override { return fields; }
  446. virtual bool isScalar() const override { return false; }
  447. };
  448. struct ECLRTL_API RtlCompoundTypeInfo : public RtlTypeInfoBase
  449. {
  450. constexpr inline RtlCompoundTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlTypeInfoBase(_fieldType, _length), child(_child) {}
  451. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  452. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  453. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  454. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  455. virtual __int64 getInt(const void * ptr) const override;
  456. virtual const RtlTypeInfo * queryChildType() const override { return child; }
  457. virtual bool isScalar() const override { return false; }
  458. const RtlTypeInfo * child;
  459. };
  460. struct ECLRTL_API RtlSetTypeInfo final : public RtlCompoundTypeInfo
  461. {
  462. constexpr inline RtlSetTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  463. virtual void doDelete() const override { delete this; }
  464. virtual size32_t getMinSize() const override;
  465. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  466. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  467. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  468. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  469. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  470. virtual void readAhead(IRowPrefetcherSource & in) const override;
  471. virtual int compare(const byte * left, const byte * right) const override;
  472. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  473. };
  474. struct ECLRTL_API RtlRowTypeInfo final : public RtlCompoundTypeInfo
  475. {
  476. constexpr inline RtlRowTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  477. virtual void doDelete() const override { delete this; }
  478. virtual size32_t getMinSize() const override;
  479. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  480. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  481. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  482. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  483. virtual void readAhead(IRowPrefetcherSource & in) const override;
  484. virtual int compare(const byte * left, const byte * right) const override;
  485. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  486. };
  487. struct ECLRTL_API RtlDatasetTypeInfo final : public RtlCompoundTypeInfo
  488. {
  489. constexpr inline RtlDatasetTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  490. virtual void doDelete() const override { delete this; }
  491. virtual size32_t getMinSize() const override;
  492. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  493. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  494. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  495. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  496. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  497. virtual void readAhead(IRowPrefetcherSource & in) const override;
  498. virtual int compare(const byte * left, const byte * right) const override;
  499. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  500. };
  501. struct ECLRTL_API RtlDictionaryTypeInfo final : public RtlCompoundTypeInfo
  502. {
  503. constexpr inline RtlDictionaryTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child)
  504. : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  505. virtual void doDelete() const override { delete this; }
  506. virtual size32_t getMinSize() const override;
  507. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  508. virtual size32_t build(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, IFieldSource &source) const override;
  509. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  510. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  511. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  512. virtual void readAhead(IRowPrefetcherSource & in) const override;
  513. virtual int compare(const byte * left, const byte * right) const override;
  514. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  515. };
  516. struct ECLRTL_API RtlIfBlockTypeInfo : public RtlTypeInfoBase
  517. {
  518. constexpr inline RtlIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields, const RtlRecordTypeInfo * _rowType)
  519. : RtlTypeInfoBase(_fieldType, _length), fields(_fields), rowType(_rowType) {}
  520. const RtlFieldInfo * const * fields; // null terminated
  521. const RtlRecordTypeInfo * rowType; // may be updated when parent deserialized
  522. virtual bool getCondition(const byte * selfrow) const = 0;
  523. virtual bool getCondition(const RtlRow & selfrow) const = 0;
  524. virtual size32_t getMinSize() const override;
  525. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  526. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  527. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  528. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  529. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  530. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  531. virtual void readAhead(IRowPrefetcherSource & in) const override;
  532. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  533. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  534. virtual __int64 getInt(const void * ptr) const override;
  535. virtual bool isScalar() const override { return false; }
  536. virtual int compare(const byte * left, const byte * right) const override;
  537. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  538. virtual const RtlFieldInfo * const * queryFields() const override { return fields; }
  539. };
  540. //Ifblock for complex conditions that cannot be serialized
  541. struct ECLRTL_API RtlComplexIfBlockTypeInfo : public RtlIfBlockTypeInfo
  542. {
  543. constexpr inline RtlComplexIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields, const RtlRecordTypeInfo * _rowType)
  544. : RtlIfBlockTypeInfo(_fieldType, _length, _fields, _rowType) {}
  545. using RtlIfBlockTypeInfo::getCondition;
  546. virtual bool getCondition(const RtlRow & selfrow) const override;
  547. };
  548. struct ECLRTL_API RtlSerialIfBlockTypeInfo : public RtlIfBlockTypeInfo
  549. {
  550. inline RtlSerialIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields, const RtlRecordTypeInfo * _rowType)
  551. : RtlIfBlockTypeInfo(_fieldType, _length, _fields, _rowType) {}
  552. ~RtlSerialIfBlockTypeInfo();
  553. virtual bool getCondition(const byte * selfrow) const override;
  554. virtual bool getCondition(const RtlRow & selfrow) const override;
  555. virtual IFieldFilter * createCondition() const = 0;
  556. virtual const IFieldFilter * queryFilter() const override;
  557. virtual void doCleanup() const override;
  558. protected:
  559. const IFieldFilter * resolveCondition() const;
  560. //The following are initialised on demand in resolveCondition()
  561. mutable const IFieldFilter * filter = nullptr;
  562. mutable RtlRecord * parentRecord = nullptr;
  563. mutable unsigned numPrevFields = 0;
  564. };
  565. struct ECLRTL_API RtlSimpleIfBlockTypeInfo : public RtlSerialIfBlockTypeInfo
  566. {
  567. inline RtlSimpleIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields, const RtlRecordTypeInfo * _rowType)
  568. : RtlSerialIfBlockTypeInfo(_fieldType, _length, _fields, _rowType) {}
  569. };
  570. struct ECLRTL_API RtlDynamicIfBlockTypeInfo final : public RtlSerialIfBlockTypeInfo
  571. {
  572. inline RtlDynamicIfBlockTypeInfo(unsigned _fieldType, unsigned _length, const RtlFieldInfo * const * _fields, const RtlRecordTypeInfo * _rowType, const IFieldFilter * ownedFilter)
  573. : RtlSerialIfBlockTypeInfo(_fieldType, _length, _fields, _rowType) { filter = ownedFilter; }
  574. virtual IFieldFilter * createCondition() const override;
  575. virtual void doDelete() const final override { delete this; }
  576. void setParent(const RtlRecordTypeInfo * _rowType) { rowType = _rowType; }
  577. };
  578. struct ECLRTL_API RtlBitfieldTypeInfo final : public RtlTypeInfoBase
  579. {
  580. constexpr inline RtlBitfieldTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  581. virtual void doDelete() const override { delete this; }
  582. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  583. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  584. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  585. virtual size32_t getMinSize() const override;
  586. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  587. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  588. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  589. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  590. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  591. virtual __int64 getInt(const void * ptr) const override;
  592. virtual int compare(const byte * left, const byte * right) const override;
  593. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  594. protected:
  595. size32_t getSize() const;
  596. __int64 signedValue(const void * self) const;
  597. unsigned __int64 unsignedValue(const void * self) const;
  598. };
  599. struct ECLRTL_API RtlUnimplementedTypeInfo final : public RtlTypeInfoBase
  600. {
  601. constexpr inline RtlUnimplementedTypeInfo(unsigned _fieldType, unsigned _length) : RtlTypeInfoBase(_fieldType, _length) {}
  602. virtual void doDelete() const override { delete this; }
  603. virtual size32_t getMinSize() const override;
  604. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  605. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  606. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  607. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  608. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  609. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  610. virtual void readAhead(IRowPrefetcherSource & in) const override;
  611. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  612. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  613. virtual __int64 getInt(const void * ptr) const override;
  614. virtual bool isScalar() const override { return false; }
  615. virtual int compare(const byte * left, const byte * right) const override;
  616. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  617. };
  618. struct ECLRTL_API RtlAlienTypeInfo final : public RtlCompoundTypeInfo
  619. {
  620. public:
  621. constexpr inline RtlAlienTypeInfo(unsigned _fieldType, unsigned _length, const RtlTypeInfo * _child) : RtlCompoundTypeInfo(_fieldType, _length, _child) {}
  622. virtual void doDelete() const override { delete this; }
  623. virtual size32_t buildInt(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, __int64 val) const override;
  624. virtual size32_t buildString(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t size, const char *value) const override;
  625. virtual size32_t buildUtf8(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, size32_t len, const char *value) const override;
  626. virtual size32_t getMinSize() const override;
  627. virtual size32_t size(const byte * self, const byte * selfrow) const override;
  628. virtual size32_t process(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IFieldProcessor & target) const override;
  629. virtual size32_t toXML(const byte * self, const byte * selfrow, const RtlFieldInfo * field, IXmlWriter & target) const override;
  630. virtual void getString(size32_t & resultLen, char * & result, const void * ptr) const override;
  631. virtual void getUtf8(size32_t & resultLen, char * & result, const void * ptr) const override;
  632. virtual __int64 getInt(const void * ptr) const override;
  633. virtual int compare(const byte * left, const byte * right) const override;
  634. virtual unsigned hash(const byte *self, unsigned inhash) const override;
  635. virtual size32_t deserialize(ARowBuilder & rowBuilder, IRowDeserializerSource & in, size32_t offset) const override;
  636. virtual void readAhead(IRowPrefetcherSource & in) const override;
  637. };
  638. //-------------------------------------------------------------------------------------------------------------------
  639. struct ECLRTL_API RtlFieldStrInfo : public RtlFieldInfo
  640. {
  641. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type);
  642. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type, unsigned _flags);
  643. RtlFieldStrInfo(const char * _name, const char * _xpath, const RtlTypeInfo * _type, unsigned _flags, const char * _initializer);
  644. 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.
  645. };
  646. extern unsigned ECLRTL_API countFields(const RtlFieldInfo * const * fields);
  647. extern int ECLRTL_API compareFields(const RtlFieldInfo * const * cur, const byte * left, const byte * right, bool excludePayload = false);
  648. extern unsigned ECLRTL_API hashFields(const RtlFieldInfo * const * cur, const byte *self, unsigned inhash, bool excludePayload = false);
  649. extern bool ECLRTL_API hasTrailingFileposition(const RtlFieldInfo * const * fields);
  650. extern bool ECLRTL_API hasTrailingFileposition(const RtlTypeInfo * type);
  651. extern bool ECLRTL_API containsKeyedSignedInt(const RtlTypeInfo * type);
  652. extern size32_t translateScalar(ARowBuilder &builder, size32_t offset, const RtlFieldInfo *field, const RtlTypeInfo &destType, const RtlTypeInfo &sourceType, const byte *source);
  653. #endif