5 Star 36 Fork 19

springrain / dm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
zb.go 5.13 KB
一键复制 编辑 原始数据 按行查看 历史
springrain 提交于 2023-02-03 12:01 . v1.8.11 来自 达梦8.1.2.192
/*
* Copyright (c) 2000-2018, 达梦数据库有限公司.
* All rights reserved.
*/
package dm
const (
PARAM_COUNT_LIMIT int32 = 65536
IGNORE_TARGET_LENGTH int32 = -1
IGNORE_TARGET_SCALE int32 = -1
IGNORE_TARGET_TYPE = INT32_MIN
TYPE_FLAG_UNKNOWN byte = 0 // 未知类型
TYPE_FLAG_EXACT byte = 1 // 精确类型
TYPE_FLAG_RECOMMEND byte = 2 // 推荐类型
IO_TYPE_UNKNOWN int8 = -1
IO_TYPE_IN int8 = 0
IO_TYPE_OUT int8 = 1
IO_TYPE_INOUT int8 = 2
MASK_ORACLE_DATE int32 = 1
MASK_ORACLE_FLOAT int32 = 2
MASK_BFILE int32 = 3
MASK_LOCAL_DATETIME int32 = 4
)
type execRetInfo struct {
// param
outParamDatas [][]byte
// rs
hasResultSet bool
rsDatas [][][]byte
rsSizeof int // 结果集数据占用多少空间,(消息中结果集起始位置到 rsCacheOffset
// 的空间大小,这和实际的rsDatas占用空间大小有一定出入,这里粗略估算,用于结果集缓存时的空间管理)
rsCacheOffset int32 // 缓存信息,在响应消息体中的偏移,0表示不存在,仅结果集缓存中可以用
rsBdta bool
rsUpdatable bool
rsRowIds []int64
// rs cache
tbIds []int32
tbTss []int64
// print
printLen int32
printMsg string
// explain
explain string
// 影响行数
updateCount int64 // Insert/Update/Delet影响行数, select结果集的总行数
updateCounts []int64 // 批量影响行数
// 键
rowid int64
lastInsertId int64
// other
retSqlType int16 // 执行返回的语句类型
execId int32
}
type column struct {
typeName string
colType int32
prec int32
scale int32
name string
tableName string
schemaName string
nullable bool
identity bool
readonly bool // 是否只读
baseName string
// lob info
lob bool
lobTabId int32
lobColId int16
// 用于描述ARRAY、STRUCT类型的特有描述信息
typeDescriptor *TypeDescriptor
isBdta bool
mask int32
}
type parameter struct {
column
typeFlag byte
ioType int8
outJType int32
outScale int32
outObjectName string
cursorStmt *DmStatement
hasDefault bool
}
func (column *column) InitColumn() *column {
column.typeName = ""
column.colType = 0
column.prec = 0
column.scale = 0
column.name = ""
column.tableName = ""
column.schemaName = ""
column.nullable = false
column.identity = false
column.readonly = false
column.baseName = ""
// lob info
column.lob = false
column.lobTabId = 0
column.lobColId = 0
// 用于描述ARRAY、STRUCT类型的特有描述信息
column.typeDescriptor = nil
column.isBdta = false
return column
}
func (parameter *parameter) InitParameter() *parameter {
parameter.InitColumn()
parameter.typeFlag = TYPE_FLAG_UNKNOWN
parameter.ioType = IO_TYPE_UNKNOWN
parameter.outJType = IGNORE_TARGET_TYPE
parameter.outScale = IGNORE_TARGET_SCALE
parameter.outObjectName = ""
parameter.cursorStmt = nil
return parameter
}
func (parameter *parameter) resetType(colType int32) {
parameter.colType = colType
parameter.scale = 0
switch colType {
case BIT, BOOLEAN:
parameter.prec = BIT_PREC
case TINYINT:
parameter.prec = TINYINT_PREC
case SMALLINT:
parameter.prec = SMALLINT_PREC
case INT:
parameter.prec = INT_PREC
case BIGINT:
parameter.prec = BIGINT_PREC
case CHAR, VARCHAR, VARCHAR2:
parameter.prec = VARCHAR_PREC
case CLOB:
parameter.prec = CLOB_PREC
case BINARY, VARBINARY:
parameter.prec = VARBINARY_PREC
case BLOB:
parameter.prec = BLOB_PREC
case DATE:
parameter.prec = DATE_PREC
case TIME:
parameter.prec = TIME_PREC
parameter.scale = 6
case TIME_TZ:
parameter.prec = TIME_TZ_PREC
parameter.scale = 6
case DATETIME:
parameter.prec = DATETIME_PREC
parameter.scale = 6
case DATETIME_TZ:
parameter.prec = DATETIME_TZ_PREC
parameter.scale = 6
case DATETIME2:
parameter.prec = DATETIME2_PREC
parameter.scale = 9
case DATETIME2_TZ:
parameter.prec = DATETIME2_TZ_PREC
parameter.scale = 9
case REAL,DOUBLE,DECIMAL,INTERVAL_YM,INTERVAL_DT,ARRAY,CLASS,PLTYPE_RECORD,SARRAY:
parameter.prec = 0
case UNKNOWN, NULL:
// UNKNOWN 导致服务器断言 // setNull导致服务器报错“字符转换失败”
parameter.colType = VARCHAR
parameter.prec = VARCHAR_PREC
default:
}
}
func (execInfo *execRetInfo) union(other *execRetInfo, startRow int, count int) {
if count == 1 {
execInfo.updateCounts[startRow] = other.updateCount
} else if execInfo.updateCounts != nil {
copy(execInfo.updateCounts[startRow:startRow+count], other.updateCounts[0:count])
}
if execInfo.outParamDatas != nil {
execInfo.outParamDatas = append(execInfo.outParamDatas, other.outParamDatas...)
}
}
func NewExceInfo() *execRetInfo {
execInfo := execRetInfo{}
execInfo.outParamDatas = nil
execInfo.hasResultSet = false
execInfo.rsDatas = nil
execInfo.rsSizeof = 0
execInfo.rsCacheOffset = 0
execInfo.rsBdta = false
execInfo.rsUpdatable = false
execInfo.rsRowIds = nil
execInfo.tbIds = nil
execInfo.tbTss = nil
execInfo.printLen = 0
execInfo.printMsg = ""
execInfo.explain = ""
execInfo.updateCount = 0
execInfo.updateCounts = nil
execInfo.rowid = -1
execInfo.lastInsertId = 0
// other
execInfo.retSqlType = -1 // 执行返回的语句类型
execInfo.execId = 0
return &execInfo
}
Go
1
https://gitee.com/chunanyong/dm.git
git@gitee.com:chunanyong/dm.git
chunanyong
dm
dm
master

搜索帮助