zn.go 3.6 KB

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