gitee.com/curryzheng/dm@v0.0.1/j.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  package dm
     6  
     7  import (
     8  	"gitee.com/curryzheng/dm/util"
     9  	"strconv"
    10  	"time"
    11  )
    12  
    13  var DB2G db2g
    14  
    15  type db2g struct {
    16  }
    17  
    18  func (DB2G db2g) processVarchar2(bytes []byte, prec int) []byte {
    19  	rbytes := make([]byte, prec)
    20  	copy(rbytes[:len(bytes)], bytes[:])
    21  	for i := len(bytes); i < len(rbytes); i++ {
    22  		rbytes[i] = ' '
    23  	}
    24  	return rbytes
    25  }
    26  
    27  func (DB2G db2g) charToString(bytes []byte, column *column, conn *DmConnection) string {
    28  	if column.colType == VARCHAR2 {
    29  		bytes = DB2G.processVarchar2(bytes, int(column.prec))
    30  	} else if column.colType == CLOB {
    31  		clob := newClobFromDB(bytes, conn, column, true)
    32  		clobLen, _ := clob.GetLength()
    33  		clobStr, _ := clob.getSubString(1, int32(clobLen))
    34  		return clobStr
    35  	}
    36  	return Dm_build_1.Dm_build_251(bytes, conn.serverEncoding, conn)
    37  }
    38  
    39  func (DB2G db2g) charToFloat64(bytes []byte, column *column, conn *DmConnection) (float64, error) {
    40  	str := DB2G.charToString(bytes, column, conn)
    41  	val, err := strconv.ParseFloat(str, 64)
    42  	if err != nil {
    43  		return 0, ECGO_DATA_CONVERTION_ERROR.throw()
    44  	}
    45  
    46  	return val, nil
    47  }
    48  
    49  func (DB2G db2g) charToDeciaml(bytes []byte, column *column, conn *DmConnection) (*DmDecimal, error) {
    50  	str := DB2G.charToString(bytes, column, conn)
    51  	return NewDecimalFromString(str)
    52  }
    53  
    54  func (DB2G db2g) BinaryToInt64(bytes []byte, column *column, conn *DmConnection) (int64, error) {
    55  	if column.colType == BLOB {
    56  		blob := newBlobFromDB(bytes, conn, column, true)
    57  		blobLen, err := blob.GetLength()
    58  		if err != nil {
    59  			return 0, err
    60  		}
    61  		bytes, err = blob.getBytes(1, int32(blobLen))
    62  		if err != nil {
    63  			return 0, err
    64  		}
    65  	}
    66  	var n, b int64 = 0, 0
    67  
    68  	startIndex := 0
    69  	var length int
    70  	if len(bytes) > 8 {
    71  		length = 8
    72  		for j := 0; j < len(bytes)-8; j++ {
    73  			if bytes[j] != 0 {
    74  				return 0, ECGO_DATA_CONVERTION_ERROR.throw()
    75  			}
    76  
    77  			startIndex = len(bytes) - 8
    78  			length = 8
    79  		}
    80  	} else {
    81  		length = len(bytes)
    82  	}
    83  
    84  	for j := startIndex; j < startIndex+length; j++ {
    85  		b = int64(0xff & bytes[j])
    86  		n = b | (n << 8)
    87  	}
    88  
    89  	return n, nil
    90  }
    91  
    92  func (DB2G db2g) decToDecimal(bytes []byte, prec int, scale int, compatibleOracle bool) (*DmDecimal, error) {
    93  
    94  	if compatibleOracle {
    95  		prec = -1
    96  		scale = -1
    97  	}
    98  	return newDecimal(bytes, prec, scale)
    99  }
   100  
   101  func (DB2G db2g) toBytes(bytes []byte, column *column, conn *DmConnection) ([]byte, error) {
   102  	retBytes := Dm_build_1.Dm_build_152(bytes, 0, len(bytes))
   103  	switch column.colType {
   104  	case CLOB:
   105  		clob := newClobFromDB(retBytes, conn, column, true)
   106  		str, err := clob.getSubString(1, int32(clob.length))
   107  		if err != nil {
   108  			return nil, err
   109  		}
   110  
   111  		return Dm_build_1.Dm_build_214(str, conn.getServerEncoding(), conn), nil
   112  	case BLOB:
   113  		blob := newBlobFromDB(retBytes, conn, column, true)
   114  		bs, err := blob.getBytes(1, int32(blob.length))
   115  		if err != nil {
   116  			return nil, err
   117  		}
   118  
   119  		return bs, nil
   120  	}
   121  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   122  }
   123  
   124  func (DB2G db2g) toString(bytes []byte, column *column, conn *DmConnection) string {
   125  	switch column.colType {
   126  	case CHAR, VARCHAR, VARCHAR2:
   127  		return DB2G.charToString(bytes, column, conn)
   128  	case BIT, BOOLEAN, TINYINT:
   129  		return strconv.FormatInt(int64(bytes[0]), 10)
   130  	case SMALLINT:
   131  		return strconv.FormatInt(int64(Dm_build_1.Dm_build_222(bytes)), 10)
   132  	case INT:
   133  		return strconv.FormatInt(int64(Dm_build_1.Dm_build_225(bytes)), 10)
   134  	case BIGINT:
   135  		return strconv.FormatInt(int64(Dm_build_1.Dm_build_228(bytes)), 10)
   136  	case REAL:
   137  		return strconv.FormatFloat(float64(Dm_build_1.Dm_build_231(bytes)), 'f', -1, 32)
   138  	case DOUBLE:
   139  		return strconv.FormatFloat(float64(Dm_build_1.Dm_build_234(bytes)), 'f', -1, 64)
   140  	case DECIMAL:
   141  
   142  	case BINARY, VARBINARY:
   143  		util.StringUtil.BytesToHexString(bytes, false)
   144  	case BLOB:
   145  
   146  	case CLOB:
   147  
   148  	case DATE:
   149  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   150  		if conn.FormatDate != "" {
   151  			return dtToStringByOracleFormat(dt, conn.FormatDate, int(conn.OracleDateLanguage))
   152  		}
   153  	case TIME:
   154  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   155  		if conn.FormatTime != "" {
   156  			return dtToStringByOracleFormat(dt, conn.FormatTime, int(conn.OracleDateLanguage))
   157  		}
   158  	case DATETIME:
   159  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   160  		if conn.FormatTimestamp != "" {
   161  			return dtToStringByOracleFormat(dt, conn.FormatTimestamp, int(conn.OracleDateLanguage))
   162  		}
   163  	case TIME_TZ:
   164  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   165  		if conn.FormatTimeTZ != "" {
   166  			return dtToStringByOracleFormat(dt, conn.FormatTimeTZ, int(conn.OracleDateLanguage))
   167  		}
   168  	case DATETIME_TZ:
   169  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   170  		if conn.FormatTimestampTZ != "" {
   171  			return dtToStringByOracleFormat(dt, conn.FormatTimestampTZ, int(conn.OracleDateLanguage))
   172  		}
   173  	case INTERVAL_DT:
   174  		return newDmIntervalDTByBytes(bytes).String()
   175  	case INTERVAL_YM:
   176  		return newDmIntervalYMByBytes(bytes).String()
   177  	case ARRAY:
   178  
   179  	case SARRAY:
   180  
   181  	case CLASS:
   182  
   183  	case PLTYPE_RECORD:
   184  
   185  	}
   186  	return ""
   187  }
   188  
   189  func (DB2G db2g) toBool(bytes []byte, column *column, conn *DmConnection) (bool, error) {
   190  	switch column.colType {
   191  	case BIT, BOOLEAN, TINYINT:
   192  		return bytes[0] != 0, nil
   193  	case SMALLINT:
   194  		return Dm_build_1.Dm_build_98(bytes, 0) != 0, nil
   195  	case INT:
   196  		return Dm_build_1.Dm_build_103(bytes, 0) != 0, nil
   197  	case BIGINT:
   198  		return Dm_build_1.Dm_build_108(bytes, 0) != 0, nil
   199  	case REAL:
   200  		return Dm_build_1.Dm_build_113(bytes, 0) != 0, nil
   201  	case DOUBLE:
   202  		return Dm_build_1.Dm_build_117(bytes, 0) != 0, nil
   203  	case DECIMAL:
   204  
   205  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   206  		return G2DB.toBool(DB2G.charToString(bytes, column, conn))
   207  	}
   208  
   209  	return false, ECGO_DATA_CONVERTION_ERROR.throw()
   210  }
   211  
   212  func (DB2G db2g) toByte(bytes []byte, column *column, conn *DmConnection) (byte, error) {
   213  	switch column.colType {
   214  	case BIT, BOOLEAN, TINYINT:
   215  
   216  		if bytes == nil || len(bytes) == 0 {
   217  			return 0, nil
   218  		} else {
   219  			return bytes[0], nil
   220  		}
   221  	case SMALLINT:
   222  		tval := Dm_build_1.Dm_build_98(bytes, 0)
   223  		if tval < int16(BYTE_MIN) || tval > int16(BYTE_MAX) {
   224  			return 0, ECGO_DATA_OVERFLOW.throw()
   225  		}
   226  		return byte(tval), nil
   227  	case INT:
   228  		tval := Dm_build_1.Dm_build_103(bytes, 0)
   229  		if tval < int32(BYTE_MIN) || tval > int32(BYTE_MAX) {
   230  			return 0, ECGO_DATA_OVERFLOW.throw()
   231  		}
   232  		return byte(tval), nil
   233  	case BIGINT:
   234  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   235  		if tval < int64(BYTE_MIN) || tval > int64(BYTE_MAX) {
   236  			return 0, ECGO_DATA_OVERFLOW.throw()
   237  		}
   238  		return byte(tval), nil
   239  	case REAL:
   240  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   241  		if tval < float32(BYTE_MIN) || tval > float32(BYTE_MAX) {
   242  			return 0, ECGO_DATA_OVERFLOW.throw()
   243  		}
   244  		return byte(tval), nil
   245  	case DOUBLE:
   246  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   247  		if tval < float64(BYTE_MIN) || tval > float64(BYTE_MAX) {
   248  			return 0, ECGO_DATA_OVERFLOW.throw()
   249  		}
   250  		return byte(tval), nil
   251  	case DECIMAL:
   252  
   253  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   254  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   255  		if err != nil {
   256  			return 0, err
   257  		}
   258  
   259  		if tval < float64(BYTE_MIN) || tval > float64(BYTE_MAX) {
   260  			return 0, ECGO_DATA_OVERFLOW.throw()
   261  		}
   262  		return byte(tval), nil
   263  	case BINARY, VARBINARY, BLOB:
   264  		{
   265  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   266  			if err != nil {
   267  				return 0, err
   268  			}
   269  
   270  			if tval < int64(BYTE_MIN) || tval > int64(BYTE_MAX) {
   271  				return 0, ECGO_DATA_OVERFLOW.throw()
   272  			}
   273  			return byte(tval), nil
   274  		}
   275  	}
   276  
   277  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   278  }
   279  
   280  func (DB2G db2g) toInt8(bytes []byte, column *column, conn *DmConnection) (int8, error) {
   281  	switch column.colType {
   282  	case BIT, BOOLEAN, TINYINT:
   283  		if bytes == nil || len(bytes) == 0 {
   284  			return 0, nil
   285  		}
   286  
   287  		return int8(bytes[0]), nil
   288  	case SMALLINT:
   289  		tval := Dm_build_1.Dm_build_98(bytes, 0)
   290  		if tval < int16(INT8_MIN) || tval < int16(INT8_MAX) {
   291  			return 0, ECGO_DATA_OVERFLOW.throw()
   292  		}
   293  		return int8(tval), nil
   294  	case INT:
   295  
   296  		tval := Dm_build_1.Dm_build_103(bytes, 0)
   297  		if tval < int32(INT8_MIN) || tval > int32(INT8_MAX) {
   298  			return 0, ECGO_DATA_OVERFLOW.throw()
   299  		}
   300  		return int8(tval), nil
   301  	case BIGINT:
   302  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   303  		if tval < int64(INT8_MIN) || tval > int64(INT8_MAX) {
   304  			return 0, ECGO_DATA_OVERFLOW.throw()
   305  		}
   306  		return int8(tval), nil
   307  	case REAL:
   308  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   309  		if tval < float32(INT8_MIN) || tval > float32(INT8_MAX) {
   310  			return 0, ECGO_DATA_OVERFLOW.throw()
   311  		}
   312  		return int8(tval), nil
   313  	case DOUBLE:
   314  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   315  		if tval < float64(INT8_MIN) || tval > float64(INT8_MAX) {
   316  			return 0, ECGO_DATA_OVERFLOW.throw()
   317  		}
   318  		return int8(tval), nil
   319  	case DECIMAL:
   320  
   321  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   322  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   323  		if err != nil {
   324  			return 0, err
   325  		}
   326  
   327  		if tval < float64(INT8_MIN) || tval > float64(INT8_MAX) {
   328  			return 0, ECGO_DATA_OVERFLOW.throw()
   329  		}
   330  		return int8(tval), nil
   331  	case BINARY, VARBINARY, BLOB:
   332  		{
   333  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   334  			if err != nil {
   335  				return 0, err
   336  			}
   337  
   338  			if tval < int64(INT8_MIN) || tval > int64(INT8_MAX) {
   339  				return 0, ECGO_DATA_OVERFLOW.throw()
   340  			}
   341  			return int8(tval), nil
   342  		}
   343  	}
   344  
   345  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   346  }
   347  
   348  func (DB2G db2g) toInt16(bytes []byte, column *column, conn *DmConnection) (int16, error) {
   349  	switch column.colType {
   350  	case BIT, BOOLEAN, TINYINT:
   351  		if bytes == nil || len(bytes) == 0 {
   352  			return 0, nil
   353  		}
   354  
   355  		return int16(bytes[0]), nil
   356  	case SMALLINT:
   357  		return Dm_build_1.Dm_build_98(bytes, 0), nil
   358  	case INT:
   359  
   360  		tval := Dm_build_1.Dm_build_103(bytes, 0)
   361  		if tval < int32(INT16_MIN) || tval > int32(INT16_MAX) {
   362  			return 0, ECGO_DATA_OVERFLOW.throw()
   363  		}
   364  		return int16(tval), nil
   365  	case BIGINT:
   366  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   367  		if tval < int64(INT16_MIN) || tval > int64(INT16_MAX) {
   368  			return 0, ECGO_DATA_OVERFLOW.throw()
   369  		}
   370  		return int16(tval), nil
   371  	case REAL:
   372  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   373  		if tval < float32(INT16_MIN) || tval > float32(INT16_MAX) {
   374  			return 0, ECGO_DATA_OVERFLOW.throw()
   375  		}
   376  		return int16(tval), nil
   377  	case DOUBLE:
   378  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   379  		if tval < float64(INT16_MIN) || tval > float64(INT16_MAX) {
   380  			return 0, ECGO_DATA_OVERFLOW.throw()
   381  		}
   382  		return int16(tval), nil
   383  	case DECIMAL:
   384  
   385  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   386  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   387  		if err != nil {
   388  			return 0, err
   389  		}
   390  
   391  		if tval < float64(INT16_MIN) || tval > float64(INT16_MAX) {
   392  			return 0, ECGO_DATA_OVERFLOW.throw()
   393  		}
   394  		return int16(tval), nil
   395  	case BINARY, VARBINARY, BLOB:
   396  		{
   397  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   398  			if err != nil {
   399  				return 0, err
   400  			}
   401  
   402  			if tval < int64(INT16_MIN) || tval > int64(INT16_MAX) {
   403  				return 0, ECGO_DATA_OVERFLOW.throw()
   404  			}
   405  			return int16(tval), nil
   406  		}
   407  	}
   408  
   409  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   410  }
   411  
   412  func (DB2G db2g) toUInt16(bytes []byte, column *column, conn *DmConnection) (uint16, error) {
   413  	switch column.colType {
   414  	case BIT, BOOLEAN, TINYINT:
   415  		if bytes == nil || len(bytes) == 0 {
   416  			return 0, nil
   417  		}
   418  
   419  		return uint16(bytes[0]), nil
   420  	case SMALLINT:
   421  		return uint16(Dm_build_1.Dm_build_98(bytes, 0)), nil
   422  	case INT:
   423  		tval := Dm_build_1.Dm_build_103(bytes, 0)
   424  		if tval < int32(UINT16_MIN) || tval > int32(UINT16_MAX) {
   425  			return 0, ECGO_DATA_OVERFLOW.throw()
   426  		}
   427  		return uint16(tval), nil
   428  	case BIGINT:
   429  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   430  		if tval < int64(UINT16_MIN) || tval > int64(UINT16_MAX) {
   431  			return 0, ECGO_DATA_OVERFLOW.throw()
   432  		}
   433  		return uint16(tval), nil
   434  	case REAL:
   435  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   436  		if tval < float32(UINT16_MIN) || tval > float32(UINT16_MAX) {
   437  			return 0, ECGO_DATA_OVERFLOW.throw()
   438  		}
   439  		return uint16(tval), nil
   440  	case DOUBLE:
   441  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   442  		if tval < float64(UINT16_MIN) || tval > float64(UINT16_MAX) {
   443  			return 0, ECGO_DATA_OVERFLOW.throw()
   444  		}
   445  		return uint16(tval), nil
   446  	case DECIMAL:
   447  
   448  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   449  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   450  		if err != nil {
   451  			return 0, err
   452  		}
   453  
   454  		if tval < float64(UINT16_MIN) || tval > float64(UINT16_MAX) {
   455  			return 0, ECGO_DATA_OVERFLOW.throw()
   456  		}
   457  		return uint16(tval), nil
   458  	case BINARY, VARBINARY, BLOB:
   459  		{
   460  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   461  			if err != nil {
   462  				return 0, err
   463  			}
   464  
   465  			if tval < int64(UINT16_MIN) || tval > int64(UINT16_MAX) {
   466  				return 0, ECGO_DATA_OVERFLOW.throw()
   467  			}
   468  			return uint16(tval), nil
   469  		}
   470  	}
   471  
   472  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   473  }
   474  
   475  func (DB2G db2g) toInt32(bytes []byte, column *column, conn *DmConnection) (int32, error) {
   476  	switch column.colType {
   477  	case BIT, BOOLEAN, TINYINT:
   478  		if bytes == nil || len(bytes) == 0 {
   479  			return 0, nil
   480  		}
   481  
   482  		return int32(bytes[0]), nil
   483  	case SMALLINT:
   484  		return int32(Dm_build_1.Dm_build_98(bytes, 0)), nil
   485  	case INT:
   486  		return Dm_build_1.Dm_build_103(bytes, 0), nil
   487  	case BIGINT:
   488  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   489  		if tval < int64(INT32_MIN) || tval > int64(INT32_MAX) {
   490  			return 0, ECGO_DATA_OVERFLOW.throw()
   491  		}
   492  		return int32(tval), nil
   493  	case REAL:
   494  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   495  		if tval < float32(INT32_MIN) || tval > float32(INT32_MAX) {
   496  			return 0, ECGO_DATA_OVERFLOW.throw()
   497  		}
   498  		return int32(tval), nil
   499  	case DOUBLE:
   500  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   501  		if tval < float64(INT32_MIN) || tval > float64(INT32_MAX) {
   502  			return 0, ECGO_DATA_OVERFLOW.throw()
   503  		}
   504  		return int32(tval), nil
   505  	case DECIMAL:
   506  
   507  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   508  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   509  		if err != nil {
   510  			return 0, err
   511  		}
   512  
   513  		if tval < float64(INT32_MIN) || tval > float64(INT32_MAX) {
   514  			return 0, ECGO_DATA_OVERFLOW.throw()
   515  		}
   516  		return int32(tval), nil
   517  	case BINARY, VARBINARY, BLOB:
   518  		{
   519  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   520  			if err != nil {
   521  				return 0, err
   522  			}
   523  
   524  			if tval < int64(INT32_MIN) || tval > int64(INT32_MAX) {
   525  				return 0, ECGO_DATA_OVERFLOW.throw()
   526  			}
   527  			return int32(tval), nil
   528  		}
   529  	}
   530  
   531  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   532  }
   533  
   534  func (DB2G db2g) toUInt32(bytes []byte, column *column, conn *DmConnection) (uint32, error) {
   535  	switch column.colType {
   536  	case BIT, BOOLEAN, TINYINT:
   537  		if bytes == nil || len(bytes) == 0 {
   538  			return 0, nil
   539  		}
   540  
   541  		return uint32(bytes[0]), nil
   542  	case SMALLINT:
   543  		return uint32(Dm_build_1.Dm_build_98(bytes, 0)), nil
   544  	case INT:
   545  		return uint32(Dm_build_1.Dm_build_103(bytes, 0)), nil
   546  	case BIGINT:
   547  		tval := Dm_build_1.Dm_build_108(bytes, 0)
   548  		if tval < int64(UINT32_MIN) || tval > int64(UINT32_MAX) {
   549  			return 0, ECGO_DATA_OVERFLOW.throw()
   550  		}
   551  		return uint32(tval), nil
   552  	case REAL:
   553  		tval := Dm_build_1.Dm_build_113(bytes, 0)
   554  		if tval < float32(UINT32_MIN) || tval > float32(UINT32_MAX) {
   555  			return 0, ECGO_DATA_OVERFLOW.throw()
   556  		}
   557  		return uint32(tval), nil
   558  	case DOUBLE:
   559  		tval := Dm_build_1.Dm_build_117(bytes, 0)
   560  		if tval < float64(UINT32_MIN) || tval > float64(UINT32_MAX) {
   561  			return 0, ECGO_DATA_OVERFLOW.throw()
   562  		}
   563  		return uint32(tval), nil
   564  	case DECIMAL:
   565  
   566  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   567  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   568  		if err != nil {
   569  			return 0, err
   570  		}
   571  
   572  		if tval < float64(UINT32_MIN) || tval > float64(UINT32_MAX) {
   573  			return 0, ECGO_DATA_OVERFLOW.throw()
   574  		}
   575  		return uint32(tval), nil
   576  	case BINARY, VARBINARY, BLOB:
   577  		{
   578  			tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   579  			if err != nil {
   580  				return 0, err
   581  			}
   582  
   583  			if tval < int64(UINT32_MIN) || tval > int64(UINT32_MAX) {
   584  				return 0, ECGO_DATA_OVERFLOW.throw()
   585  			}
   586  			return uint32(tval), nil
   587  		}
   588  	}
   589  
   590  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   591  }
   592  
   593  func (DB2G db2g) toInt64(bytes []byte, column *column, conn *DmConnection) (int64, error) {
   594  	switch column.colType {
   595  	case BOOLEAN, BIT, TINYINT:
   596  		if bytes == nil || len(bytes) == 0 {
   597  			return int64(0), nil
   598  		} else {
   599  			return int64(bytes[0]), nil
   600  		}
   601  	case SMALLINT:
   602  		return int64(Dm_build_1.Dm_build_222(bytes)), nil
   603  	case INT:
   604  		return int64(Dm_build_1.Dm_build_225(bytes)), nil
   605  	case BIGINT:
   606  		return int64(Dm_build_1.Dm_build_228(bytes)), nil
   607  	case REAL:
   608  		return int64(Dm_build_1.Dm_build_231(bytes)), nil
   609  	case DOUBLE:
   610  		return int64(Dm_build_1.Dm_build_234(bytes)), nil
   611  
   612  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   613  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   614  		if err != nil {
   615  			return 0, err
   616  		}
   617  
   618  		if int64(tval) < INT64_MIN || int64(tval) > INT64_MAX {
   619  			return 0, ECGO_DATA_OVERFLOW.throw()
   620  		}
   621  		return int64(tval), nil
   622  	case BINARY, VARBINARY, BLOB:
   623  		tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   624  		if err != nil {
   625  			return 0, err
   626  		}
   627  
   628  		return tval, nil
   629  	}
   630  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   631  }
   632  
   633  func (DB2G db2g) toUInt64(bytes []byte, column *column, conn *DmConnection) (uint64, error) {
   634  	switch column.colType {
   635  	case BOOLEAN, BIT, TINYINT:
   636  		if bytes == nil || len(bytes) == 0 {
   637  			return uint64(0), nil
   638  		} else {
   639  			return uint64(bytes[0]), nil
   640  		}
   641  	case SMALLINT:
   642  		return uint64(Dm_build_1.Dm_build_222(bytes)), nil
   643  	case INT:
   644  		return uint64(Dm_build_1.Dm_build_225(bytes)), nil
   645  	case BIGINT:
   646  		return uint64(Dm_build_1.Dm_build_228(bytes)), nil
   647  	case REAL:
   648  		return uint64(Dm_build_1.Dm_build_231(bytes)), nil
   649  	case DOUBLE:
   650  		return uint64(Dm_build_1.Dm_build_234(bytes)), nil
   651  
   652  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   653  		tval, err := DB2G.charToFloat64(bytes, column, conn)
   654  		if err != nil {
   655  			return 0, err
   656  		}
   657  
   658  		if uint64(tval) < UINT64_MIN || uint64(tval) > UINT64_MAX {
   659  			return 0, ECGO_DATA_OVERFLOW.throw()
   660  		}
   661  		return uint64(tval), nil
   662  	case BINARY, VARBINARY, BLOB:
   663  		tval, err := DB2G.BinaryToInt64(bytes, column, conn)
   664  		if err != nil {
   665  			return 0, err
   666  		}
   667  
   668  		return uint64(tval), nil
   669  	}
   670  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   671  }
   672  
   673  func (DB2G db2g) toInt(bytes []byte, column *column, conn *DmConnection) (int, error) {
   674  	if strconv.IntSize == 32 {
   675  		tmp, err := DB2G.toInt32(bytes, column, conn)
   676  		return int(tmp), err
   677  	} else {
   678  		tmp, err := DB2G.toInt64(bytes, column, conn)
   679  		return int(tmp), err
   680  	}
   681  }
   682  
   683  func (DB2G db2g) toUInt(bytes []byte, column *column, conn *DmConnection) (uint, error) {
   684  	if strconv.IntSize == 32 {
   685  		tmp, err := DB2G.toUInt32(bytes, column, conn)
   686  		return uint(tmp), err
   687  	} else {
   688  		tmp, err := DB2G.toUInt64(bytes, column, conn)
   689  		return uint(tmp), err
   690  	}
   691  }
   692  
   693  func (DB2G db2g) toFloat32(bytes []byte, column *column, conn *DmConnection) (float32, error) {
   694  	switch column.colType {
   695  	case BIT, BOOLEAN, TINYINT:
   696  		if bytes == nil || len(bytes) == 0 {
   697  			return 0, nil
   698  		}
   699  		return float32(bytes[0]), nil
   700  	case SMALLINT:
   701  		return float32(Dm_build_1.Dm_build_98(bytes, 0)), nil
   702  	case INT:
   703  		return float32(Dm_build_1.Dm_build_103(bytes, 0)), nil
   704  	case BIGINT:
   705  		return float32(Dm_build_1.Dm_build_108(bytes, 0)), nil
   706  	case REAL:
   707  		return Dm_build_1.Dm_build_113(bytes, 0), nil
   708  	case DOUBLE:
   709  		dval := Dm_build_1.Dm_build_117(bytes, 0)
   710  		return float32(dval), nil
   711  	case DECIMAL:
   712  		dval, err := DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
   713  		if err != nil {
   714  			return 0, err
   715  		}
   716  		return float32(dval.ToFloat64()), nil
   717  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   718  		dval, err := DB2G.charToDeciaml(bytes, column, conn)
   719  		if err != nil {
   720  			return 0, err
   721  		}
   722  		return float32(dval.ToFloat64()), nil
   723  	}
   724  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   725  }
   726  
   727  func (DB2G db2g) toFloat64(bytes []byte, column *column, conn *DmConnection) (float64, error) {
   728  	switch column.colType {
   729  	case BIT, BOOLEAN, TINYINT:
   730  		if bytes == nil || len(bytes) == 0 {
   731  			return 0, nil
   732  		}
   733  		return float64(bytes[0]), nil
   734  	case SMALLINT:
   735  		return float64(Dm_build_1.Dm_build_98(bytes, 0)), nil
   736  	case INT:
   737  		return float64(Dm_build_1.Dm_build_103(bytes, 0)), nil
   738  	case BIGINT:
   739  		return float64(Dm_build_1.Dm_build_108(bytes, 0)), nil
   740  	case REAL:
   741  		return float64(Dm_build_1.Dm_build_113(bytes, 0)), nil
   742  	case DOUBLE:
   743  		return Dm_build_1.Dm_build_117(bytes, 0), nil
   744  	case DECIMAL:
   745  		dval, err := DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
   746  		if err != nil {
   747  			return 0, err
   748  		}
   749  		return dval.ToFloat64(), nil
   750  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   751  		dval, err := DB2G.charToDeciaml(bytes, column, conn)
   752  		if err != nil {
   753  			return 0, err
   754  		}
   755  		return dval.ToFloat64(), nil
   756  	}
   757  
   758  	return 0, ECGO_DATA_CONVERTION_ERROR.throw()
   759  }
   760  
   761  func (DB2G db2g) toDmBlob(value []byte, column *column, conn *DmConnection) *DmBlob {
   762  
   763  	switch column.colType {
   764  	case BLOB:
   765  		return newBlobFromDB(value, conn, column, conn.lobFetchAll())
   766  	default:
   767  		return newBlobOfLocal(value, conn)
   768  	}
   769  }
   770  
   771  func (DB2G db2g) toDmClob(value []byte, conn *DmConnection, column *column) *DmClob {
   772  
   773  	switch column.colType {
   774  	case CLOB:
   775  		return newClobFromDB(value, conn, column, conn.lobFetchAll())
   776  	default:
   777  		return newClobOfLocal(DB2G.toString(value, column, conn), conn)
   778  	}
   779  }
   780  
   781  func (DB2G db2g) toDmDecimal(value []byte, column *column, conn *DmConnection) (*DmDecimal, error) {
   782  
   783  	switch column.colType {
   784  	case BIT, BOOLEAN, TINYINT:
   785  		if value == nil || len(value) == 0 {
   786  			return NewDecimalFromInt64(0)
   787  		} else {
   788  			return NewDecimalFromInt64(int64(value[0]))
   789  		}
   790  	case SMALLINT:
   791  		return NewDecimalFromInt64(int64(Dm_build_1.Dm_build_98(value, 0)))
   792  	case INT:
   793  		return NewDecimalFromInt64(int64(Dm_build_1.Dm_build_103(value, 0)))
   794  	case BIGINT:
   795  		return NewDecimalFromInt64(Dm_build_1.Dm_build_108(value, 0))
   796  	case REAL:
   797  		return NewDecimalFromFloat64(float64(Dm_build_1.Dm_build_113(value, 0)))
   798  	case DOUBLE:
   799  		return NewDecimalFromFloat64(Dm_build_1.Dm_build_117(value, 0))
   800  	case DECIMAL:
   801  		return decodeDecimal(value, int(column.prec), int(column.scale))
   802  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   803  		return DB2G.charToDeciaml(value, column, conn)
   804  	}
   805  
   806  	return nil, ECGO_DATA_CONVERTION_ERROR
   807  }
   808  
   809  func (DB2G db2g) toTime(bytes []byte, column *column, conn *DmConnection) (time.Time, error) {
   810  	switch column.colType {
   811  	case DATE, TIME, TIME_TZ, DATETIME_TZ, DATETIME:
   812  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   813  		return toTimeFromDT(dt, int(conn.dmConnector.localTimezone)), nil
   814  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   815  		return toTimeFromString(DB2G.charToString(bytes, column, conn), int(conn.dmConnector.localTimezone)), nil
   816  	}
   817  	return time.Now(), ECGO_DATA_CONVERTION_ERROR.throw()
   818  }
   819  
   820  func (DB2G db2g) toObject(bytes []byte, column *column, conn *DmConnection) (interface{}, error) {
   821  
   822  	switch column.colType {
   823  	case BIT, BOOLEAN:
   824  		return bytes[0] != 0, nil
   825  
   826  	case TINYINT:
   827  
   828  		return Dm_build_1.Dm_build_94(bytes, 0), nil
   829  	case SMALLINT:
   830  		return Dm_build_1.Dm_build_98(bytes, 0), nil
   831  	case INT:
   832  		return Dm_build_1.Dm_build_103(bytes, 0), nil
   833  	case BIGINT:
   834  		return Dm_build_1.Dm_build_108(bytes, 0), nil
   835  	case DECIMAL:
   836  		return DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
   837  	case REAL:
   838  		return Dm_build_1.Dm_build_113(bytes, 0), nil
   839  	case DOUBLE:
   840  		return Dm_build_1.Dm_build_117(bytes, 0), nil
   841  	case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ:
   842  		dt := decode(bytes, column.isBdta, int(column.colType), int(column.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   843  		return toTimeFromDT(dt, int(conn.dmConnector.localTimezone)), nil
   844  	case BINARY, VARBINARY:
   845  		return bytes, nil
   846  	case BLOB:
   847  		blob := newBlobFromDB(bytes, conn, column, conn.lobFetchAll())
   848  
   849  		if util.StringUtil.EqualsIgnoreCase(column.typeName, "LONGVARBINARY") {
   850  
   851  			l, err := blob.GetLength()
   852  			if err != nil {
   853  				return nil, err
   854  			}
   855  			return blob.getBytes(1, int32(l))
   856  		} else {
   857  			return blob, nil
   858  		}
   859  	case CHAR, VARCHAR, VARCHAR2:
   860  		val := DB2G.charToString(bytes, column, conn)
   861  		if isBFile(int(column.colType), int(column.prec), int(column.scale)) {
   862  
   863  		}
   864  
   865  		return val, nil
   866  	case CLOB:
   867  		clob := newClobFromDB(bytes, conn, column, conn.lobFetchAll())
   868  		if util.StringUtil.EqualsIgnoreCase(column.typeName, "LONGVARCHAR") {
   869  
   870  			l, err := clob.GetLength()
   871  			if err != nil {
   872  				return nil, err
   873  			}
   874  			return clob.getSubString(1, int32(l))
   875  		} else {
   876  			return clob, nil
   877  		}
   878  	case INTERVAL_YM:
   879  		return newDmIntervalYMByBytes(bytes), nil
   880  	case INTERVAL_DT:
   881  		return newDmIntervalDTByBytes(bytes), nil
   882  	case ARRAY:
   883  		return TypeDataSV.bytesToArray(bytes, nil, column.typeDescriptor)
   884  	case SARRAY:
   885  		return TypeDataSV.bytesToSArray(bytes, nil, column.typeDescriptor)
   886  	case CLASS:
   887  
   888  	case PLTYPE_RECORD:
   889  
   890  	default:
   891  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   892  	}
   893  
   894  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   895  }