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