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  }