7f7b585ffb
- 在应用程序中新增对达梦数据库(DM)的配置和连接支持 - 实现 SetDmDB 函数以配置达梦数据库连接 - 更新数据库操作逻辑,支持达梦特有的 SQL 语法和功能 - 在相关文件中添加达梦数据库的处理逻辑,包括表创建、数据插入和查询 - 更新 go.mod 和 go.sum 文件以引入达梦数据库驱动 - 增强文档,详细说明达梦数据库的配置和使用方法
206 lines
4.6 KiB
Go
206 lines
4.6 KiB
Go
/*
|
|
* Copyright (c) 2000-2018, 达梦数据库有限公司.
|
|
* All rights reserved.
|
|
*/
|
|
package dm
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
const (
|
|
READ_LEN = Dm_build_820
|
|
)
|
|
|
|
type iOffRowBinder interface {
|
|
read(buf *Dm_build_0)
|
|
isReadOver() bool
|
|
getObj() interface{}
|
|
}
|
|
|
|
type offRowBinder struct {
|
|
obj interface{}
|
|
encoding string
|
|
readOver bool
|
|
buffer *Dm_build_0
|
|
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_4(),
|
|
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_5() > Dm_build_817
|
|
return binder
|
|
}
|
|
|
|
func (b *offRowBytesBinder) read(buf *Dm_build_0) {
|
|
if b.buffer.Dm_build_5() > 0 {
|
|
buf.Dm_build_37(b.buffer)
|
|
} else if !b.readOver {
|
|
var obj = b.obj.([]byte)
|
|
buf.Dm_build_26(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_5() > Dm_build_817
|
|
return binder
|
|
}
|
|
|
|
func (b *offRowBlobBinder) read(buf *Dm_build_0) {
|
|
if b.buffer.Dm_build_5() > 0 {
|
|
buf.Dm_build_37(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_26(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_5() > Dm_build_817
|
|
return binder
|
|
}
|
|
|
|
func (b *offRowClobBinder) read(buf *Dm_build_0) {
|
|
if b.buffer.Dm_build_5() > 0 {
|
|
buf.Dm_build_37(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_1346.Dm_build_1562(str, b.encoding, nil)
|
|
b.position += readLen
|
|
if b.position == int32(totalLen) {
|
|
b.readOver = true
|
|
}
|
|
buf.Dm_build_26(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_5() > Dm_build_817
|
|
return binder
|
|
}
|
|
|
|
func (b *offRowReaderBinder) read(buf *Dm_build_0) {
|
|
if b.buffer.Dm_build_5() > 0 {
|
|
buf.Dm_build_37(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_26(bytes[0:readLen], 0, readLen)
|
|
}
|
|
}
|
|
|
|
func (b *offRowReaderBinder) readAll() []byte {
|
|
var byteArray = Dm_build_4()
|
|
b.read(byteArray)
|
|
for !b.readOver {
|
|
b.read(byteArray)
|
|
}
|
|
return byteArray.Dm_build_47()
|
|
}
|
|
|
|
func (b *offRowReaderBinder) isReadOver() bool {
|
|
return b.readOver
|
|
}
|
|
|
|
func (b *offRowReaderBinder) getObj() interface{} {
|
|
return b.obj
|
|
}
|