j.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import "database/sql/driver"
  7. type DmArray struct {
  8. TypeData
  9. m_arrDesc *ArrayDescriptor // 数组的描述信息
  10. m_arrData []TypeData // 数组中各行数据值
  11. m_objArray interface{} // 从服务端获取的
  12. m_itemCount int // 本次获取的行数
  13. m_itemSize int // 数组中一个数组项的大小,单位bytes
  14. m_objCount int // 一个数组项中存在对象类型的个数(class、动态数组)
  15. m_strCount int // 一个数组项中存在字符串类型的个数
  16. m_objStrOffs []int // 对象在前,字符串在后
  17. typeName string
  18. elements []interface{}
  19. // Valid为false代表DmArray数据在数据库中为NULL
  20. Valid bool
  21. }
  22. func (da *DmArray) init() *DmArray {
  23. da.initTypeData()
  24. da.m_itemCount = 0
  25. da.m_itemSize = 0
  26. da.m_objCount = 0
  27. da.m_strCount = 0
  28. da.m_objStrOffs = nil
  29. da.m_dumyData = nil
  30. da.m_offset = 0
  31. da.m_objArray = nil
  32. da.Valid = true
  33. return da
  34. }
  35. // 数据库自定义数组Array构造函数,typeName为库中定义的数组类型名称,elements为该数组类型的每个值
  36. //
  37. // 例如,自定义数组类型语句为:create or replace type myArray is array int[];
  38. //
  39. // 则绑入绑出的go对象为: val := dm.NewDmArray("myArray", []interface{} {123, 456})
  40. func NewDmArray(typeName string, elements []interface{}) *DmArray {
  41. da := new(DmArray)
  42. da.typeName = typeName
  43. da.elements = elements
  44. da.Valid = true
  45. return da
  46. }
  47. func (da *DmArray) create(dc *DmConnection) (*DmArray, error) {
  48. desc, err := newArrayDescriptor(da.typeName, dc)
  49. if err != nil {
  50. return nil, err
  51. }
  52. return da.createByArrayDescriptor(desc, dc)
  53. }
  54. func (da *DmArray) createByArrayDescriptor(arrDesc *ArrayDescriptor, conn *DmConnection) (*DmArray, error) {
  55. if nil == arrDesc {
  56. return nil, ECGO_INVALID_PARAMETER_VALUE.throw()
  57. }
  58. da.init()
  59. da.m_arrDesc = arrDesc
  60. if nil == da.elements {
  61. da.m_arrData = make([]TypeData, 0)
  62. } else {
  63. // 若为静态数组,判断给定数组长度是否超过静态数组的上限
  64. if arrDesc.getMDesc() == nil || (arrDesc.getMDesc().getDType() == SARRAY && len(da.elements) > arrDesc.getMDesc().getStaticArrayLength()) {
  65. return nil, ECGO_INVALID_ARRAY_LEN.throw()
  66. }
  67. var err error
  68. da.m_arrData, err = TypeDataSV.toArray(da.elements, da.m_arrDesc.getMDesc())
  69. if err != nil {
  70. return nil, err
  71. }
  72. }
  73. da.m_itemCount = len(da.m_arrData)
  74. return da, nil
  75. }
  76. func newDmArrayByTypeData(atData []TypeData, desc *TypeDescriptor) *DmArray {
  77. da := new(DmArray)
  78. da.init()
  79. da.m_arrDesc = newArrayDescriptorByTypeDescriptor(desc)
  80. da.m_arrData = atData
  81. return da
  82. }
  83. func (da *DmArray) checkIndex(index int64) error {
  84. if index < 0 || index > int64(len(da.m_arrData)-1) {
  85. return ECGO_INVALID_LENGTH_OR_OFFSET.throw()
  86. }
  87. return nil
  88. }
  89. func (da *DmArray) checkIndexAndCount(index int64, count int) error {
  90. err := da.checkIndex(index)
  91. if err != nil {
  92. return err
  93. }
  94. if count <= 0 || index+int64(count) > int64(len(da.m_arrData)) {
  95. return ECGO_INVALID_LENGTH_OR_OFFSET.throw()
  96. }
  97. return nil
  98. }
  99. // 获取Array对象在数据库中的类型名称
  100. func (da *DmArray) GetBaseTypeName() (string, error) {
  101. if err := da.checkValid(); err != nil {
  102. return "", err
  103. }
  104. return da.m_arrDesc.m_typeDesc.getFulName()
  105. }
  106. // 获取Array对象的go数组对象
  107. func (da *DmArray) GetArray() (interface{}, error) {
  108. if da.m_arrData == nil || len(da.m_arrData) <= 0 {
  109. return nil, nil
  110. }
  111. return TypeDataSV.toJavaArray(da, 0, len(da.m_arrData), da.m_arrDesc.getItemDesc().getDType())
  112. }
  113. // 获取Array对象的指定偏移和执行长度go数据对象 index从0开始
  114. func (da *DmArray) GetObjArray(index int64, count int) (interface{}, error) {
  115. var err error
  116. if err = da.checkValid(); err != nil {
  117. return nil, err
  118. }
  119. if err = da.checkIndexAndCount(index, count); err != nil {
  120. return nil, err
  121. }
  122. return TypeDataSV.toJavaArray(da, index, count, da.m_arrDesc.getItemDesc().getDType())
  123. }
  124. func (da *DmArray) GetIntArray(index int64, count int) ([]int, error) {
  125. var err error
  126. if err = da.checkValid(); err != nil {
  127. return nil, err
  128. }
  129. if err = da.checkIndexAndCount(index, count); err != nil {
  130. return nil, err
  131. }
  132. tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_INTEGER)
  133. if err != nil {
  134. return nil, err
  135. }
  136. return tmp.([]int), nil
  137. }
  138. func (da *DmArray) GetInt16Array(index int64, count int) ([]int16, error) {
  139. var err error
  140. if err = da.checkValid(); err != nil {
  141. return nil, err
  142. }
  143. if err = da.checkIndexAndCount(index, count); err != nil {
  144. return nil, err
  145. }
  146. tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_SHORT)
  147. if err != nil {
  148. return nil, err
  149. }
  150. return tmp.([]int16), nil
  151. }
  152. func (da *DmArray) GetInt64Array(index int64, count int) ([]int64, error) {
  153. var err error
  154. if err = da.checkValid(); err != nil {
  155. return nil, err
  156. }
  157. if err = da.checkIndexAndCount(index, count); err != nil {
  158. return nil, err
  159. }
  160. tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_LONG)
  161. if err != nil {
  162. return nil, err
  163. }
  164. return tmp.([]int64), nil
  165. }
  166. func (da *DmArray) GetFloatArray(index int64, count int) ([]float32, error) {
  167. var err error
  168. if err = da.checkValid(); err != nil {
  169. return nil, err
  170. }
  171. if err = da.checkIndexAndCount(index, count); err != nil {
  172. return nil, err
  173. }
  174. tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_FLOAT)
  175. if err != nil {
  176. return nil, err
  177. }
  178. return tmp.([]float32), nil
  179. }
  180. func (da *DmArray) GetDoubleArray(index int64, count int) ([]float64, error) {
  181. var err error
  182. if err = da.checkValid(); err != nil {
  183. return nil, err
  184. }
  185. if err = da.checkIndexAndCount(index, count); err != nil {
  186. return nil, err
  187. }
  188. tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_DOUBLE)
  189. if err != nil {
  190. return nil, err
  191. }
  192. return tmp.([]float64), nil
  193. }
  194. func (dest *DmArray) Scan(src interface{}) error {
  195. if dest == nil {
  196. return ECGO_STORE_IN_NIL_POINTER.throw()
  197. }
  198. switch src := src.(type) {
  199. case nil:
  200. *dest = *new(DmArray)
  201. // 将Valid标志置false表示数据库中该列为NULL
  202. (*dest).Valid = false
  203. return nil
  204. case *DmArray:
  205. *dest = *src
  206. return nil
  207. default:
  208. return UNSUPPORTED_SCAN.throw()
  209. }
  210. }
  211. func (array DmArray) Value() (driver.Value, error) {
  212. if !array.Valid {
  213. return nil, nil
  214. }
  215. return array, nil
  216. }
  217. func (array *DmArray) checkValid() error {
  218. if !array.Valid {
  219. return ECGO_IS_NULL.throw()
  220. }
  221. return nil
  222. }