rtlcommon.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "jiface.hpp"
  2. #include "jbuff.hpp"
  3. #include "jstring.hpp"
  4. #include "junicode.hpp"
  5. #include "rtlcommon.hpp"
  6. CThorContiguousRowBuffer::CThorContiguousRowBuffer(ISerialStream * _in) : in(_in)
  7. {
  8. buffer = NULL;
  9. maxOffset = 0;
  10. readOffset = 0;
  11. }
  12. void CThorContiguousRowBuffer::doRead(size32_t len, void * ptr)
  13. {
  14. ensureAccessible(readOffset + len);
  15. memcpy(ptr, buffer+readOffset, len);
  16. readOffset += len;
  17. }
  18. size32_t CThorContiguousRowBuffer::read(size32_t len, void * ptr)
  19. {
  20. doRead(len, ptr);
  21. return len;
  22. }
  23. size32_t CThorContiguousRowBuffer::readSize()
  24. {
  25. size32_t value;
  26. doRead(sizeof(value), &value);
  27. return value;
  28. }
  29. size32_t CThorContiguousRowBuffer::readPackedInt(void * ptr)
  30. {
  31. size32_t size = sizePackedInt();
  32. doRead(size, ptr);
  33. return size;
  34. }
  35. size32_t CThorContiguousRowBuffer::readUtf8(ARowBuilder & target, size32_t offset, size32_t fixedSize, size32_t len)
  36. {
  37. if (len == 0)
  38. return 0;
  39. size32_t size = sizeUtf8(len);
  40. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  41. doRead(size, self+offset);
  42. return size;
  43. }
  44. size32_t CThorContiguousRowBuffer::readVStr(ARowBuilder & target, size32_t offset, size32_t fixedSize)
  45. {
  46. size32_t size = sizeVStr();
  47. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  48. doRead(size, self+offset);
  49. return size;
  50. }
  51. size32_t CThorContiguousRowBuffer::readVUni(ARowBuilder & target, size32_t offset, size32_t fixedSize)
  52. {
  53. size32_t size = sizeVUni();
  54. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  55. doRead(size, self+offset);
  56. return size;
  57. }
  58. size32_t CThorContiguousRowBuffer::sizePackedInt()
  59. {
  60. ensureAccessible(readOffset+1);
  61. return rtlGetPackedSizeFromFirst(buffer[readOffset]);
  62. }
  63. size32_t CThorContiguousRowBuffer::sizeUtf8(size32_t len)
  64. {
  65. if (len == 0)
  66. return 0;
  67. //The len is the number of utf characters, size depends on which characters are included.
  68. size32_t nextOffset = readOffset;
  69. while (len)
  70. {
  71. ensureAccessible(nextOffset+1);
  72. for (;nextOffset < maxOffset;)
  73. {
  74. nextOffset += readUtf8Size(buffer+nextOffset); // This function only accesses the first byte
  75. if (--len == 0)
  76. break;
  77. }
  78. }
  79. return nextOffset - readOffset;
  80. }
  81. size32_t CThorContiguousRowBuffer::sizeVStr()
  82. {
  83. size32_t nextOffset = readOffset;
  84. for (;;)
  85. {
  86. ensureAccessible(nextOffset+1);
  87. for (; nextOffset < maxOffset; nextOffset++)
  88. {
  89. if (buffer[nextOffset] == 0)
  90. return (nextOffset + 1) - readOffset;
  91. }
  92. }
  93. }
  94. size32_t CThorContiguousRowBuffer::sizeVUni()
  95. {
  96. size32_t nextOffset = readOffset;
  97. const size32_t sizeOfUChar = 2;
  98. for (;;)
  99. {
  100. ensureAccessible(nextOffset+sizeOfUChar);
  101. for (; nextOffset+1 < maxOffset; nextOffset += sizeOfUChar)
  102. {
  103. if (buffer[nextOffset] == 0 && buffer[nextOffset+1] == 0)
  104. return (nextOffset + sizeOfUChar) - readOffset;
  105. }
  106. }
  107. }
  108. void CThorContiguousRowBuffer::reportReadFail()
  109. {
  110. throwUnexpected();
  111. }
  112. const byte * CThorContiguousRowBuffer::peek(size32_t maxSize)
  113. {
  114. if (maxSize+readOffset > maxOffset)
  115. doPeek(maxSize+readOffset);
  116. return buffer + readOffset;
  117. }
  118. offset_t CThorContiguousRowBuffer::beginNested()
  119. {
  120. size32_t len = readSize();
  121. //Currently nested datasets are readahead by skipping the number of bytes in the datasets, rather than calling
  122. //beginNested(). If this function was ever called from readAhead() then it would need to call noteStartChild()
  123. //so that the self pointer is correct for the child rows
  124. return len+readOffset;
  125. }
  126. bool CThorContiguousRowBuffer::finishedNested(offset_t & endPos)
  127. {
  128. //See note above, if this was ever called from readAhead() then it would need to call noteFinishChild() and noteStartChild() if incomplete;
  129. return readOffset >= endPos;
  130. }
  131. void CThorContiguousRowBuffer::skip(size32_t size)
  132. {
  133. ensureAccessible(readOffset+size);
  134. readOffset += size;
  135. }
  136. void CThorContiguousRowBuffer::skipPackedInt()
  137. {
  138. size32_t size = sizePackedInt();
  139. ensureAccessible(readOffset+size);
  140. readOffset += size;
  141. }
  142. void CThorContiguousRowBuffer::skipUtf8(size32_t len)
  143. {
  144. size32_t size = sizeUtf8(len);
  145. ensureAccessible(readOffset+size);
  146. readOffset += size;
  147. }
  148. void CThorContiguousRowBuffer::skipVStr()
  149. {
  150. size32_t size = sizeVStr();
  151. ensureAccessible(readOffset+size);
  152. readOffset += size;
  153. }
  154. void CThorContiguousRowBuffer::skipVUni()
  155. {
  156. size32_t size = sizeVUni();
  157. ensureAccessible(readOffset+size);
  158. readOffset += size;
  159. }
  160. const byte * CThorContiguousRowBuffer::querySelf()
  161. {
  162. if (maxOffset == 0)
  163. doPeek(0);
  164. if (childStartOffsets.ordinality())
  165. return buffer + childStartOffsets.tos();
  166. return buffer;
  167. }
  168. void CThorContiguousRowBuffer::noteStartChild()
  169. {
  170. childStartOffsets.append(readOffset);
  171. }
  172. void CThorContiguousRowBuffer::noteFinishChild()
  173. {
  174. childStartOffsets.pop();
  175. }