github.com/xiyichan/dm8@v0.0.0-20211213021639-be727be3e136/l.go (about) 1 /* 2 * Copyright (c) 2000-2018, 达梦数据库有限公司. 3 * All rights reserved. 4 */ 5 6 package dm 7 8 type DmArray struct { 9 TypeData 10 m_arrDesc *ArrayDescriptor // 数组的描述信息 11 12 m_arrData []TypeData // 数组中各行数据值 13 14 m_objArray interface{} // 从服务端获取的 15 16 m_itemCount int // 本次获取的行数 17 18 m_itemSize int // 数组中一个数组项的大小,单位bytes 19 20 m_objCount int // 一个数组项中存在对象类型的个数(class、动态数组) 21 22 m_strCount int // 一个数组项中存在字符串类型的个数 23 24 m_objStrOffs []int // 对象在前,字符串在后 25 26 typeName string 27 28 elements []interface{} 29 } 30 31 func (da *DmArray) init() *DmArray { 32 da.initTypeData() 33 da.m_itemCount = 0 34 da.m_itemSize = 0 35 da.m_objCount = 0 36 da.m_strCount = 0 37 da.m_objStrOffs = nil 38 da.m_dumyData = nil 39 da.m_offset = 0 40 41 da.m_objArray = nil 42 return da 43 } 44 45 func NewDmArray(typeName string, elements []interface{}) *DmArray { 46 da := new(DmArray) 47 da.typeName = typeName 48 da.elements = elements 49 return da 50 } 51 52 func (da *DmArray) create(dc *DmConnection) (*DmArray, error) { 53 desc, err := newArrayDescriptor(da.typeName, dc) 54 if err != nil { 55 return nil, err 56 } 57 return da.createByArrayDescriptor(desc, dc) 58 } 59 60 func (da *DmArray) createByArrayDescriptor(arrDesc *ArrayDescriptor, conn *DmConnection) (*DmArray, error) { 61 62 if nil == arrDesc { 63 return nil, ECGO_INVALID_PARAMETER_VALUE.throw() 64 } 65 66 da.init() 67 68 da.m_arrDesc = arrDesc 69 if nil == da.elements { 70 da.m_arrData = make([]TypeData, 0) 71 } else { 72 // 若为静态数组,判断给定数组长度是否超过静态数组的上限 73 if arrDesc.getMDesc() == nil || (arrDesc.getMDesc().getDType() == SARRAY && len(da.elements) > arrDesc.getMDesc().getStaticArrayLength()) { 74 return nil, ECGO_INVALID_ARRAY_LEN.throw() 75 } 76 77 var err error 78 da.m_arrData, err = TypeDataSV.toArray(da.elements, da.m_arrDesc.getMDesc()) 79 if err != nil { 80 return nil, err 81 } 82 } 83 84 da.m_itemCount = len(da.m_arrData) 85 return da, nil 86 } 87 88 func newDmArrayByTypeData(atData []TypeData, desc *TypeDescriptor) *DmArray { 89 da := new(DmArray) 90 da.init() 91 da.m_arrDesc = newArrayDescriptorByTypeDescriptor(desc) 92 da.m_arrData = atData 93 return da 94 } 95 96 func (da *DmArray) checkIndex(index int64) error { 97 if index < 1 || index > int64(len(da.m_arrData)) { 98 return ECGO_INVALID_LENGTH_OR_OFFSET.throw() 99 } 100 return nil 101 } 102 103 func (da *DmArray) checkIndexAndCount(index int64, count int) error { 104 err := da.checkIndex(index) 105 if err != nil { 106 return err 107 } 108 109 if count <= 0 || index-int64(1)+int64(count) > int64(len(da.m_arrData)) { 110 return ECGO_INVALID_LENGTH_OR_OFFSET.throw() 111 } 112 return nil 113 } 114 115 func (da *DmArray) GetBaseTypeName() (string, error) { 116 return da.m_arrDesc.m_typeDesc.getFulName() 117 } 118 119 func (da *DmArray) GetObjArray(index int64, count int) (interface{}, error) { 120 da.checkIndexAndCount(index, count) 121 122 return TypeDataSV.toJavaArray(da, index, count, da.m_arrDesc.getItemDesc().getDType()) 123 } 124 125 func (da *DmArray) GetIntArray(index int64, count int) ([]int, error) { 126 da.checkIndexAndCount(index, count) 127 tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_INTEGER) 128 if err != nil { 129 return nil, err 130 } 131 return tmp.([]int), nil 132 } 133 134 func (da *DmArray) GetInt16Array(index int64, count int) ([]int16, error) { 135 da.checkIndexAndCount(index, count) 136 137 tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_SHORT) 138 if err != nil { 139 return nil, err 140 } 141 return tmp.([]int16), nil 142 } 143 144 func (da *DmArray) GetInt64Array(index int64, count int) ([]int64, error) { 145 da.checkIndexAndCount(index, count) 146 147 tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_LONG) 148 if err != nil { 149 return nil, err 150 } 151 152 return tmp.([]int64), nil 153 } 154 155 func (da *DmArray) GetFloatArray(index int64, count int) ([]float32, error) { 156 da.checkIndexAndCount(index, count) 157 158 tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_FLOAT) 159 if err != nil { 160 return nil, err 161 } 162 163 return tmp.([]float32), nil 164 } 165 166 func (da *DmArray) GetDoubleArray(index int64, count int) ([]float64, error) { 167 da.checkIndexAndCount(index, count) 168 169 tmp, err := TypeDataSV.toNumericArray(da, index, count, ARRAY_TYPE_DOUBLE) 170 if err != nil { 171 return nil, err 172 } 173 174 return tmp.([]float64), nil 175 } 176 177 func (dest *DmArray) Scan(src interface{}) error { 178 if dest == nil { 179 return ECGO_STORE_IN_NIL_POINTER.throw() 180 } 181 switch src := src.(type) { 182 case nil: 183 *dest = *new(DmArray) 184 return nil 185 case *DmArray: 186 *dest = *src 187 return nil 188 default: 189 return UNSUPPORTED_SCAN 190 } 191 }