zr.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "io"
  8. )
  9. const (
  10. READ_LEN = Dm_build_1089
  11. )
  12. type iOffRowBinder interface {
  13. read(buf *Dm_build_283)
  14. isReadOver() bool
  15. getObj() interface{}
  16. }
  17. type offRowBinder struct {
  18. obj interface{}
  19. encoding string
  20. readOver bool
  21. buffer *Dm_build_283
  22. position int32
  23. offRow bool
  24. targetLength int64
  25. }
  26. func newOffRowBinder(obj interface{}, encoding string, targetLength int64) *offRowBinder {
  27. return &offRowBinder{
  28. obj: obj,
  29. encoding: encoding,
  30. targetLength: targetLength,
  31. readOver: false,
  32. buffer: Dm_build_287(),
  33. position: 0,
  34. }
  35. }
  36. type offRowBytesBinder struct {
  37. *offRowBinder
  38. }
  39. func newOffRowBytesBinder(obj []byte, encoding string) *offRowBytesBinder {
  40. var binder = &offRowBytesBinder{
  41. newOffRowBinder(obj, encoding, int64(IGNORE_TARGET_LENGTH)),
  42. }
  43. binder.read(binder.buffer)
  44. binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
  45. return binder
  46. }
  47. func (b *offRowBytesBinder) read(buf *Dm_build_283) {
  48. if b.buffer.Dm_build_288() > 0 {
  49. buf.Dm_build_320(b.buffer)
  50. } else if !b.readOver {
  51. var obj = b.obj.([]byte)
  52. buf.Dm_build_309(obj, 0, len(obj))
  53. b.readOver = true
  54. }
  55. }
  56. func (b *offRowBytesBinder) isReadOver() bool {
  57. return b.readOver
  58. }
  59. func (b *offRowBytesBinder) getObj() interface{} {
  60. return b.obj
  61. }
  62. type offRowBlobBinder struct {
  63. *offRowBinder
  64. }
  65. func newOffRowBlobBinder(blob DmBlob, encoding string) *offRowBlobBinder {
  66. var binder = &offRowBlobBinder{
  67. newOffRowBinder(blob, encoding, int64(IGNORE_TARGET_LENGTH)),
  68. }
  69. binder.read(binder.buffer)
  70. binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
  71. return binder
  72. }
  73. func (b *offRowBlobBinder) read(buf *Dm_build_283) {
  74. if b.buffer.Dm_build_288() > 0 {
  75. buf.Dm_build_320(b.buffer)
  76. } else if !b.readOver {
  77. var obj = b.obj.(DmBlob)
  78. var totalLen, _ = obj.GetLength()
  79. var leaveLen = totalLen - int64(b.position)
  80. var readLen = int32(leaveLen)
  81. if leaveLen > READ_LEN {
  82. readLen = READ_LEN
  83. }
  84. var bytes, _ = obj.getBytes(int64(b.position)+1, readLen)
  85. b.position += readLen
  86. if b.position == int32(totalLen) {
  87. b.readOver = true
  88. }
  89. buf.Dm_build_309(bytes, 0, len(bytes))
  90. }
  91. }
  92. func (b *offRowBlobBinder) isReadOver() bool {
  93. return b.readOver
  94. }
  95. func (b *offRowBlobBinder) getObj() interface{} {
  96. return b.obj
  97. }
  98. type offRowClobBinder struct {
  99. *offRowBinder
  100. }
  101. func newOffRowClobBinder(clob DmClob, encoding string) *offRowClobBinder {
  102. var binder = &offRowClobBinder{
  103. newOffRowBinder(clob, encoding, int64(IGNORE_TARGET_LENGTH)),
  104. }
  105. binder.read(binder.buffer)
  106. binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
  107. return binder
  108. }
  109. func (b *offRowClobBinder) read(buf *Dm_build_283) {
  110. if b.buffer.Dm_build_288() > 0 {
  111. buf.Dm_build_320(b.buffer)
  112. } else if !b.readOver {
  113. var obj = b.obj.(DmClob)
  114. var totalLen, _ = obj.GetLength()
  115. var leaveLen = totalLen - int64(b.position)
  116. var readLen = int32(leaveLen)
  117. if leaveLen > READ_LEN {
  118. readLen = READ_LEN
  119. }
  120. var str, _ = obj.getSubString(int64(b.position)+1, readLen)
  121. var bytes = Dm_build_1.Dm_build_217(str, b.encoding, nil)
  122. b.position += readLen
  123. if b.position == int32(totalLen) {
  124. b.readOver = true
  125. }
  126. buf.Dm_build_309(bytes, 0, len(bytes))
  127. }
  128. }
  129. func (b *offRowClobBinder) isReadOver() bool {
  130. return b.readOver
  131. }
  132. func (b *offRowClobBinder) getObj() interface{} {
  133. return b.obj
  134. }
  135. type offRowReaderBinder struct {
  136. *offRowBinder
  137. }
  138. func newOffRowReaderBinder(reader io.Reader, encoding string) *offRowReaderBinder {
  139. var binder = &offRowReaderBinder{
  140. newOffRowBinder(reader, encoding, int64(IGNORE_TARGET_LENGTH)),
  141. }
  142. binder.read(binder.buffer)
  143. binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
  144. return binder
  145. }
  146. func (b *offRowReaderBinder) read(buf *Dm_build_283) {
  147. if b.buffer.Dm_build_288() > 0 {
  148. buf.Dm_build_320(b.buffer)
  149. } else if !b.readOver {
  150. var err error
  151. var readLen = READ_LEN
  152. var reader = b.obj.(io.Reader)
  153. var bytes = make([]byte, readLen)
  154. readLen, err = reader.Read(bytes)
  155. if err == io.EOF {
  156. b.readOver = true
  157. return
  158. }
  159. b.position += int32(readLen)
  160. if readLen < len(bytes) || b.targetLength != int64(IGNORE_TARGET_LENGTH) && int64(b.position) == b.targetLength {
  161. b.readOver = true
  162. }
  163. buf.Dm_build_309(bytes[0:readLen], 0, readLen)
  164. }
  165. }
  166. func (b *offRowReaderBinder) readAll() []byte {
  167. var byteArray = Dm_build_287()
  168. b.read(byteArray)
  169. for !b.readOver {
  170. b.read(byteArray)
  171. }
  172. return byteArray.Dm_build_330()
  173. }
  174. func (b *offRowReaderBinder) isReadOver() bool {
  175. return b.readOver
  176. }
  177. func (b *offRowReaderBinder) getObj() interface{} {
  178. return b.obj
  179. }