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  }