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