github.com/xiyichan/dm8@v0.0.0-20211213021639-be727be3e136/zm.go (about) 1 /* 2 * Copyright (c) 2000-2018, 达梦数据库有限公司. 3 * All rights reserved. 4 */ 5 package dm 6 7 const ( 8 LOB_FLAG_BYTE = 0 9 LOB_FLAG_CHAR = 1 10 11 LOB_IN_ROW = 0x1 12 LOB_OFF_ROW = 0x2 13 14 NBLOB_HEAD_IN_ROW_FLAG = 0 15 NBLOB_HEAD_BLOBID = NBLOB_HEAD_IN_ROW_FLAG + BYTE_SIZE 16 NBLOB_HEAD_BLOB_LEN = NBLOB_HEAD_BLOBID + DDWORD_SIZE 17 18 NBLOB_HEAD_OUTROW_GROUPID = NBLOB_HEAD_BLOB_LEN + ULINT_SIZE 19 NBLOB_HEAD_OUTROW_FILEID = NBLOB_HEAD_OUTROW_GROUPID + USINT_SIZE 20 NBLOB_HEAD_OUTROW_PAGENO = NBLOB_HEAD_OUTROW_FILEID + USINT_SIZE 21 22 NBLOB_EX_HEAD_TABLE_ID = NBLOB_HEAD_OUTROW_PAGENO + ULINT_SIZE 23 NBLOB_EX_HEAD_COL_ID = NBLOB_EX_HEAD_TABLE_ID + ULINT_SIZE 24 NBLOB_EX_HEAD_ROW_ID = NBLOB_EX_HEAD_COL_ID + USINT_SIZE 25 NBLOB_EX_HEAD_FPA_GRPID = NBLOB_EX_HEAD_ROW_ID + LINT64_SIZE 26 NBLOB_EX_HEAD_FPA_FILEID = NBLOB_EX_HEAD_FPA_GRPID + USINT_SIZE 27 NBLOB_EX_HEAD_FPA_PAGENO = NBLOB_EX_HEAD_FPA_FILEID + USINT_SIZE 28 NBLOB_EX_HEAD_SIZE = NBLOB_EX_HEAD_FPA_PAGENO + ULINT_SIZE 29 30 NBLOB_OUTROW_HEAD_SIZE = NBLOB_HEAD_OUTROW_PAGENO + ULINT_SIZE 31 32 NBLOB_INROW_HEAD_SIZE = NBLOB_HEAD_BLOB_LEN + ULINT_SIZE 33 ) 34 35 type lob struct { 36 blobId int64 37 inRow bool 38 39 groupId int16 40 fileId int16 41 pageNo int32 42 tabId int32 43 colId int16 44 rowId int64 45 exGroupId int16 46 exFileId int16 47 exPageNo int32 48 49 curFileId int16 50 curPageNo int32 51 curPageOffset int16 52 totalOffset int32 53 readOver bool 54 55 connection *DmConnection 56 local bool 57 updateable bool 58 lobFlag int8 59 length int64 60 compatibleOracle bool 61 fetchAll bool 62 freed bool 63 modify bool 64 } 65 66 func (lob *lob) checkFreed() (err error) { 67 if lob.freed { 68 err = ECGO_LOB_FREED.throw() 69 } 70 return 71 } 72 73 func (lob *lob) GetLength() (int64, error) { 74 var err error 75 if err := lob.checkFreed(); err != nil { 76 return -1, err 77 } 78 if lob.length == -1 { 79 80 if lob.length, err = lob.connection.Access.dm_build_1443(lob); err != nil { 81 return -1, err 82 } 83 } 84 return lob.length, nil 85 } 86 87 func (lob *lob) resetCurrentInfo() { 88 lob.curFileId = lob.fileId 89 lob.curPageNo = lob.pageNo 90 lob.totalOffset = 0 91 lob.curPageOffset = 0 92 } 93 94 func (lob *lob) getLengthFromHead(head []byte) int64 { 95 return int64(Dm_build_599.Dm_build_701(head, NBLOB_HEAD_BLOB_LEN)) 96 } 97 98 func (lob *lob) canOptimized(connection *DmConnection) bool { 99 return !(lob.inRow || lob.fetchAll || lob.local || connection != lob.connection) 100 } 101 102 func (lob *lob) buildCtlData() (bytes []byte) { 103 if lob.connection.NewLobFlag { 104 bytes = make([]byte, NBLOB_EX_HEAD_SIZE, NBLOB_EX_HEAD_SIZE) 105 } else { 106 bytes = make([]byte, NBLOB_OUTROW_HEAD_SIZE, NBLOB_OUTROW_HEAD_SIZE) 107 } 108 Dm_build_599.Dm_build_600(bytes, NBLOB_HEAD_IN_ROW_FLAG, LOB_OFF_ROW) 109 Dm_build_599.Dm_build_620(bytes, NBLOB_HEAD_BLOBID, lob.blobId) 110 Dm_build_599.Dm_build_615(bytes, NBLOB_HEAD_BLOB_LEN, -1) 111 112 Dm_build_599.Dm_build_610(bytes, NBLOB_HEAD_OUTROW_GROUPID, lob.groupId) 113 Dm_build_599.Dm_build_610(bytes, NBLOB_HEAD_OUTROW_FILEID, lob.fileId) 114 Dm_build_599.Dm_build_615(bytes, NBLOB_HEAD_OUTROW_PAGENO, lob.pageNo) 115 116 if lob.connection.NewLobFlag { 117 Dm_build_599.Dm_build_615(bytes, NBLOB_EX_HEAD_TABLE_ID, lob.tabId) 118 Dm_build_599.Dm_build_610(bytes, NBLOB_EX_HEAD_COL_ID, lob.colId) 119 Dm_build_599.Dm_build_620(bytes, NBLOB_EX_HEAD_ROW_ID, lob.rowId) 120 Dm_build_599.Dm_build_610(bytes, NBLOB_EX_HEAD_FPA_GRPID, lob.exGroupId) 121 Dm_build_599.Dm_build_610(bytes, NBLOB_EX_HEAD_FPA_FILEID, lob.exFileId) 122 Dm_build_599.Dm_build_615(bytes, NBLOB_EX_HEAD_FPA_PAGENO, lob.exPageNo) 123 } 124 return 125 }