feat(db): 添加对达梦数据库的支持
- 在应用程序中新增对达梦数据库(DM)的配置和连接支持 - 实现 SetDmDB 函数以配置达梦数据库连接 - 更新数据库操作逻辑,支持达梦特有的 SQL 语法和功能 - 在相关文件中添加达梦数据库的处理逻辑,包括表创建、数据插入和查询 - 更新 go.mod 和 go.sum 文件以引入达梦数据库驱动 - 增强文档,详细说明达梦数据库的配置和使用方法
This commit is contained in:
+137
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2018, 达梦数据库有限公司.
|
||||
* All rights reserved.
|
||||
*/
|
||||
package dm
|
||||
|
||||
const (
|
||||
LOB_FLAG_BYTE = 0
|
||||
LOB_FLAG_CHAR = 1
|
||||
|
||||
LOB_IN_ROW = 0x1
|
||||
LOB_OFF_ROW = 0x2
|
||||
|
||||
NBLOB_HEAD_IN_ROW_FLAG = 0
|
||||
NBLOB_HEAD_BLOBID = NBLOB_HEAD_IN_ROW_FLAG + BYTE_SIZE
|
||||
NBLOB_HEAD_BLOB_LEN = NBLOB_HEAD_BLOBID + DDWORD_SIZE
|
||||
|
||||
NBLOB_HEAD_OUTROW_GROUPID = NBLOB_HEAD_BLOB_LEN + ULINT_SIZE
|
||||
NBLOB_HEAD_OUTROW_FILEID = NBLOB_HEAD_OUTROW_GROUPID + USINT_SIZE
|
||||
NBLOB_HEAD_OUTROW_PAGENO = NBLOB_HEAD_OUTROW_FILEID + USINT_SIZE
|
||||
|
||||
NBLOB_EX_HEAD_TABLE_ID = NBLOB_HEAD_OUTROW_PAGENO + ULINT_SIZE
|
||||
NBLOB_EX_HEAD_COL_ID = NBLOB_EX_HEAD_TABLE_ID + ULINT_SIZE
|
||||
NBLOB_EX_HEAD_ROW_ID = NBLOB_EX_HEAD_COL_ID + USINT_SIZE
|
||||
NBLOB_EX_HEAD_FPA_GRPID = NBLOB_EX_HEAD_ROW_ID + LINT64_SIZE
|
||||
NBLOB_EX_HEAD_FPA_FILEID = NBLOB_EX_HEAD_FPA_GRPID + USINT_SIZE
|
||||
NBLOB_EX_HEAD_FPA_PAGENO = NBLOB_EX_HEAD_FPA_FILEID + USINT_SIZE
|
||||
NBLOB_EX_HEAD_SIZE = NBLOB_EX_HEAD_FPA_PAGENO + ULINT_SIZE
|
||||
|
||||
NBLOB_OUTROW_HEAD_SIZE = NBLOB_HEAD_OUTROW_PAGENO + ULINT_SIZE
|
||||
|
||||
NBLOB_INROW_HEAD_SIZE = NBLOB_HEAD_BLOB_LEN + ULINT_SIZE
|
||||
)
|
||||
|
||||
type lob struct {
|
||||
blobId int64
|
||||
inRow bool
|
||||
|
||||
groupId int16
|
||||
fileId int16
|
||||
pageNo int32
|
||||
tabId int32
|
||||
colId int16
|
||||
rowId int64
|
||||
exGroupId int16
|
||||
exFileId int16
|
||||
exPageNo int32
|
||||
|
||||
curFileId int16
|
||||
curPageNo int32
|
||||
curPageOffset int16
|
||||
totalOffset int32
|
||||
readOver bool
|
||||
|
||||
connection *DmConnection
|
||||
local bool
|
||||
updateable bool
|
||||
lobFlag int8
|
||||
length int64
|
||||
compatibleOracle bool
|
||||
fetchAll bool
|
||||
freed bool
|
||||
modify bool
|
||||
|
||||
Valid bool
|
||||
}
|
||||
|
||||
func (lob *lob) GetLength() (int64, error) {
|
||||
var err error
|
||||
if err = lob.checkValid(); err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if err = lob.checkFreed(); err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if lob.length == -1 {
|
||||
|
||||
if lob.length, err = lob.connection.Access.dm_build_585(lob); err != nil {
|
||||
return -1, err
|
||||
}
|
||||
}
|
||||
return lob.length, nil
|
||||
}
|
||||
|
||||
func (lob *lob) resetCurrentInfo() {
|
||||
lob.curFileId = lob.fileId
|
||||
lob.curPageNo = lob.pageNo
|
||||
lob.totalOffset = 0
|
||||
lob.curPageOffset = 0
|
||||
}
|
||||
|
||||
func (lob *lob) getLengthFromHead(head []byte) int64 {
|
||||
return int64(Dm_build_1346.Dm_build_1448(head, NBLOB_HEAD_BLOB_LEN))
|
||||
}
|
||||
|
||||
func (lob *lob) canOptimized(connection *DmConnection) bool {
|
||||
return !(lob.inRow || lob.fetchAll || lob.local || connection != lob.connection)
|
||||
}
|
||||
|
||||
func (lob *lob) buildCtlData() (bytes []byte) {
|
||||
if lob.connection.NewLobFlag {
|
||||
bytes = make([]byte, NBLOB_EX_HEAD_SIZE, NBLOB_EX_HEAD_SIZE)
|
||||
} else {
|
||||
bytes = make([]byte, NBLOB_OUTROW_HEAD_SIZE, NBLOB_OUTROW_HEAD_SIZE)
|
||||
}
|
||||
Dm_build_1346.Dm_build_1347(bytes, NBLOB_HEAD_IN_ROW_FLAG, LOB_OFF_ROW)
|
||||
Dm_build_1346.Dm_build_1367(bytes, NBLOB_HEAD_BLOBID, lob.blobId)
|
||||
Dm_build_1346.Dm_build_1362(bytes, NBLOB_HEAD_BLOB_LEN, -1)
|
||||
|
||||
Dm_build_1346.Dm_build_1357(bytes, NBLOB_HEAD_OUTROW_GROUPID, lob.groupId)
|
||||
Dm_build_1346.Dm_build_1357(bytes, NBLOB_HEAD_OUTROW_FILEID, lob.fileId)
|
||||
Dm_build_1346.Dm_build_1362(bytes, NBLOB_HEAD_OUTROW_PAGENO, lob.pageNo)
|
||||
|
||||
if lob.connection.NewLobFlag {
|
||||
Dm_build_1346.Dm_build_1362(bytes, NBLOB_EX_HEAD_TABLE_ID, lob.tabId)
|
||||
Dm_build_1346.Dm_build_1357(bytes, NBLOB_EX_HEAD_COL_ID, lob.colId)
|
||||
Dm_build_1346.Dm_build_1367(bytes, NBLOB_EX_HEAD_ROW_ID, lob.rowId)
|
||||
Dm_build_1346.Dm_build_1357(bytes, NBLOB_EX_HEAD_FPA_GRPID, lob.exGroupId)
|
||||
Dm_build_1346.Dm_build_1357(bytes, NBLOB_EX_HEAD_FPA_FILEID, lob.exFileId)
|
||||
Dm_build_1346.Dm_build_1362(bytes, NBLOB_EX_HEAD_FPA_PAGENO, lob.exPageNo)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (lob *lob) checkFreed() (err error) {
|
||||
if lob.freed {
|
||||
err = ECGO_LOB_FREED.throw()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (lob *lob) checkValid() error {
|
||||
if !lob.Valid {
|
||||
return ECGO_IS_NULL.throw()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user