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  }