| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /*
- * Copyright (c) 2000-2018, 达梦数据库有限公司.
- * All rights reserved.
- */
- package dm
- import (
- "io"
- )
- const (
- READ_LEN = Dm_build_1089
- )
- type iOffRowBinder interface {
- read(buf *Dm_build_283)
- isReadOver() bool
- getObj() interface{}
- }
- type offRowBinder struct {
- obj interface{}
- encoding string
- readOver bool
- buffer *Dm_build_283
- position int32
- offRow bool
- targetLength int64
- }
- func newOffRowBinder(obj interface{}, encoding string, targetLength int64) *offRowBinder {
- return &offRowBinder{
- obj: obj,
- encoding: encoding,
- targetLength: targetLength,
- readOver: false,
- buffer: Dm_build_287(),
- position: 0,
- }
- }
- type offRowBytesBinder struct {
- *offRowBinder
- }
- func newOffRowBytesBinder(obj []byte, encoding string) *offRowBytesBinder {
- var binder = &offRowBytesBinder{
- newOffRowBinder(obj, encoding, int64(IGNORE_TARGET_LENGTH)),
- }
- binder.read(binder.buffer)
- binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
- return binder
- }
- func (b *offRowBytesBinder) read(buf *Dm_build_283) {
- if b.buffer.Dm_build_288() > 0 {
- buf.Dm_build_320(b.buffer)
- } else if !b.readOver {
- var obj = b.obj.([]byte)
- buf.Dm_build_309(obj, 0, len(obj))
- b.readOver = true
- }
- }
- func (b *offRowBytesBinder) isReadOver() bool {
- return b.readOver
- }
- func (b *offRowBytesBinder) getObj() interface{} {
- return b.obj
- }
- type offRowBlobBinder struct {
- *offRowBinder
- }
- func newOffRowBlobBinder(blob DmBlob, encoding string) *offRowBlobBinder {
- var binder = &offRowBlobBinder{
- newOffRowBinder(blob, encoding, int64(IGNORE_TARGET_LENGTH)),
- }
- binder.read(binder.buffer)
- binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
- return binder
- }
- func (b *offRowBlobBinder) read(buf *Dm_build_283) {
- if b.buffer.Dm_build_288() > 0 {
- buf.Dm_build_320(b.buffer)
- } else if !b.readOver {
- var obj = b.obj.(DmBlob)
- var totalLen, _ = obj.GetLength()
- var leaveLen = totalLen - int64(b.position)
- var readLen = int32(leaveLen)
- if leaveLen > READ_LEN {
- readLen = READ_LEN
- }
- var bytes, _ = obj.getBytes(int64(b.position)+1, readLen)
- b.position += readLen
- if b.position == int32(totalLen) {
- b.readOver = true
- }
- buf.Dm_build_309(bytes, 0, len(bytes))
- }
- }
- func (b *offRowBlobBinder) isReadOver() bool {
- return b.readOver
- }
- func (b *offRowBlobBinder) getObj() interface{} {
- return b.obj
- }
- type offRowClobBinder struct {
- *offRowBinder
- }
- func newOffRowClobBinder(clob DmClob, encoding string) *offRowClobBinder {
- var binder = &offRowClobBinder{
- newOffRowBinder(clob, encoding, int64(IGNORE_TARGET_LENGTH)),
- }
- binder.read(binder.buffer)
- binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
- return binder
- }
- func (b *offRowClobBinder) read(buf *Dm_build_283) {
- if b.buffer.Dm_build_288() > 0 {
- buf.Dm_build_320(b.buffer)
- } else if !b.readOver {
- var obj = b.obj.(DmClob)
- var totalLen, _ = obj.GetLength()
- var leaveLen = totalLen - int64(b.position)
- var readLen = int32(leaveLen)
- if leaveLen > READ_LEN {
- readLen = READ_LEN
- }
- var str, _ = obj.getSubString(int64(b.position)+1, readLen)
- var bytes = Dm_build_1.Dm_build_217(str, b.encoding, nil)
- b.position += readLen
- if b.position == int32(totalLen) {
- b.readOver = true
- }
- buf.Dm_build_309(bytes, 0, len(bytes))
- }
- }
- func (b *offRowClobBinder) isReadOver() bool {
- return b.readOver
- }
- func (b *offRowClobBinder) getObj() interface{} {
- return b.obj
- }
- type offRowReaderBinder struct {
- *offRowBinder
- }
- func newOffRowReaderBinder(reader io.Reader, encoding string) *offRowReaderBinder {
- var binder = &offRowReaderBinder{
- newOffRowBinder(reader, encoding, int64(IGNORE_TARGET_LENGTH)),
- }
- binder.read(binder.buffer)
- binder.offRow = binder.buffer.Dm_build_288() > Dm_build_1086
- return binder
- }
- func (b *offRowReaderBinder) read(buf *Dm_build_283) {
- if b.buffer.Dm_build_288() > 0 {
- buf.Dm_build_320(b.buffer)
- } else if !b.readOver {
- var err error
- var readLen = READ_LEN
- var reader = b.obj.(io.Reader)
- var bytes = make([]byte, readLen)
- readLen, err = reader.Read(bytes)
- if err == io.EOF {
- b.readOver = true
- return
- }
- b.position += int32(readLen)
- if readLen < len(bytes) || b.targetLength != int64(IGNORE_TARGET_LENGTH) && int64(b.position) == b.targetLength {
- b.readOver = true
- }
- buf.Dm_build_309(bytes[0:readLen], 0, readLen)
- }
- }
- func (b *offRowReaderBinder) readAll() []byte {
- var byteArray = Dm_build_287()
- b.read(byteArray)
- for !b.readOver {
- b.read(byteArray)
- }
- return byteArray.Dm_build_330()
- }
- func (b *offRowReaderBinder) isReadOver() bool {
- return b.readOver
- }
- func (b *offRowReaderBinder) getObj() interface{} {
- return b.obj
- }
|