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  }