gitee.com/runner.mei/dm@v0.0.0-20220207044607-a9ba0dc20bf7/zi.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  package dm
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  	"math/big"
    11  	"strconv"
    12  	"strings"
    13  	"time"
    14  
    15  	"gitee.com/runner.mei/dm/util"
    16  )
    17  
    18  var G2DB g2db
    19  
    20  type g2db struct {
    21  }
    22  
    23  func (G2DB g2db) checkTinyint(val interface{}) error {
    24  	switch v := val.(type) {
    25  	case float64:
    26  		if v < float64(INT8_MIN) || v > float64(INT8_MAX) {
    27  			return ECGO_DATA_OVERFLOW.throw()
    28  		}
    29  	case DmDecimal:
    30  		if v.ToBigInt().Cmp(big.NewInt(int64(INT8_MIN))) < 0 ||
    31  			v.ToBigInt().Cmp(big.NewInt(int64(INT8_MAX))) > 0 {
    32  			return ECGO_DATA_OVERFLOW.throw()
    33  		}
    34  	}
    35  	return nil
    36  }
    37  
    38  func (G2DB g2db) checkSmallint(val interface{}) error {
    39  	switch v := val.(type) {
    40  	case float64:
    41  		if v < float64(INT16_MIN) || v > float64(INT16_MAX) {
    42  			return ECGO_DATA_OVERFLOW.throw()
    43  		}
    44  	case DmDecimal:
    45  		if v.ToBigInt().Cmp(big.NewInt(int64(INT16_MIN))) < 0 ||
    46  			v.ToBigInt().Cmp(big.NewInt(int64(INT16_MAX))) > 0 {
    47  			return ECGO_DATA_OVERFLOW.throw()
    48  		}
    49  	}
    50  	return nil
    51  }
    52  
    53  func (G2DB g2db) checkInt(val interface{}) error {
    54  	switch v := val.(type) {
    55  	case float64:
    56  		if v < float64(INT32_MIN) || v > float64(INT32_MAX) {
    57  			return ECGO_DATA_OVERFLOW.throw()
    58  		}
    59  	case DmDecimal:
    60  		if v.ToBigInt().Cmp(big.NewInt(int64(INT32_MIN))) < 0 ||
    61  			v.ToBigInt().Cmp(big.NewInt(int64(INT32_MAX))) > 0 {
    62  			return ECGO_DATA_OVERFLOW.throw()
    63  		}
    64  	}
    65  	return nil
    66  }
    67  
    68  func (G2DB g2db) checkBigint(val interface{}) error {
    69  	switch v := val.(type) {
    70  	case float64:
    71  		if v < float64(INT64_MIN) || v > float64(INT64_MAX) {
    72  			return ECGO_DATA_OVERFLOW.throw()
    73  		}
    74  	case DmDecimal:
    75  		if v.ToBigInt().Cmp(big.NewInt(INT64_MIN)) < 0 ||
    76  			v.ToBigInt().Cmp(big.NewInt(INT64_MAX)) > 0 {
    77  			return ECGO_DATA_OVERFLOW.throw()
    78  		}
    79  	}
    80  	return nil
    81  }
    82  
    83  func (G2DB g2db) checkReal(val interface{}) error {
    84  	switch v := val.(type) {
    85  	case float64:
    86  		if v < float64(FLOAT32_MIN) || v > float64(FLOAT32_MAX) {
    87  			return ECGO_DATA_OVERFLOW.throw()
    88  		}
    89  	case DmDecimal:
    90  		if v.ToBigFloat().Cmp(big.NewFloat(float64(FLOAT32_MIN))) < 0 ||
    91  			v.ToBigFloat().Cmp(big.NewFloat(float64(FLOAT32_MAX))) > 0 {
    92  			return ECGO_DATA_OVERFLOW.throw()
    93  		}
    94  	}
    95  	return nil
    96  }
    97  
    98  func (G2DB g2db) fromBool(val bool, param parameter, conn *DmConnection) ([]byte, error) {
    99  	switch param.colType {
   100  	case BOOLEAN, BIT, TINYINT, SMALLINT, INT, BIGINT, REAL, DOUBLE, DECIMAL, CHAR,
   101  		VARCHAR2, VARCHAR, CLOB:
   102  		if val {
   103  			return G2DB.fromInt64(1, param, conn)
   104  		} else {
   105  			return G2DB.fromInt64(0, param, conn)
   106  		}
   107  	case BINARY, VARBINARY, BLOB:
   108  		if val {
   109  			return Dm_build_623.Dm_build_801(byte(1)), nil
   110  		} else {
   111  			return Dm_build_623.Dm_build_801(byte(0)), nil
   112  		}
   113  	}
   114  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   115  }
   116  
   117  func (G2DB g2db) fromInt64(val int64, param parameter, conn *DmConnection) ([]byte, error) {
   118  
   119  	switch param.colType {
   120  	case BOOLEAN, BIT:
   121  		if val == 0 {
   122  			return Dm_build_623.Dm_build_801(byte(0)), nil
   123  		}
   124  
   125  		return Dm_build_623.Dm_build_801(byte(1)), nil
   126  
   127  	case TINYINT:
   128  		err := G2DB.checkTinyint(float64(val))
   129  
   130  		if err != nil {
   131  			return nil, err
   132  		}
   133  
   134  		return Dm_build_623.Dm_build_801(byte(val)), nil
   135  	case SMALLINT:
   136  		err := G2DB.checkSmallint(float64(val))
   137  
   138  		if err != nil {
   139  			return nil, err
   140  		}
   141  
   142  		return Dm_build_623.Dm_build_804(int16(val)), nil
   143  	case INT:
   144  		err := G2DB.checkInt(float64(val))
   145  
   146  		if err != nil {
   147  			return nil, err
   148  		}
   149  
   150  		return Dm_build_623.Dm_build_807(int32(val)), nil
   151  	case BIGINT:
   152  		err := G2DB.checkBigint(float64(val))
   153  
   154  		if err != nil {
   155  			return nil, err
   156  		}
   157  
   158  		return Dm_build_623.Dm_build_810(int64(val)), nil
   159  	case REAL:
   160  		err := G2DB.checkReal(float64(val))
   161  
   162  		if err != nil {
   163  			return nil, err
   164  		}
   165  
   166  		return Dm_build_623.Dm_build_813(float32(val)), nil
   167  	case DOUBLE:
   168  		return Dm_build_623.Dm_build_816(float64(val)), nil
   169  	case DECIMAL:
   170  		d, err := newDecimal(big.NewInt(val), int(param.prec), int(param.scale))
   171  		if err != nil {
   172  			return nil, err
   173  		}
   174  		return d.encodeDecimal()
   175  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   176  		return Dm_build_623.Dm_build_836(strconv.FormatInt(val, 10), conn.getServerEncoding(), conn), nil
   177  	case BINARY, VARBINARY, BLOB:
   178  		return G2DB.ToBinary(val, int(param.prec)), nil
   179  	case DATE, TIME, DATETIME:
   180  		if err := G2DB.checkInt(float64(val)); err != nil {
   181  			return nil, err
   182  		}
   183  		return encodeByDateNumber(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), conn.DbTimezone)
   184  	}
   185  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   186  }
   187  
   188  func (G2DB g2db) ToBinary(x int64, prec int) []byte {
   189  	b := make([]byte, 8)
   190  	b[7] = byte(x)
   191  	b[6] = byte(x >> 8)
   192  	b[5] = byte(x >> 16)
   193  	b[4] = byte(x >> 24)
   194  	b[3] = byte(x >> 32)
   195  	b[2] = byte(x >> 40)
   196  	b[1] = byte(x >> 48)
   197  	b[0] = byte(x >> 56)
   198  
   199  	if prec > 0 && prec < len(b) {
   200  		dest := make([]byte, prec)
   201  		copy(dest, b[len(b)-prec:])
   202  		return dest
   203  	}
   204  	return b
   205  }
   206  
   207  func (G2DB g2db) fromFloat32(val float32, param parameter, conn *DmConnection) ([]byte, error) {
   208  	switch param.colType {
   209  	case BOOLEAN, BIT:
   210  		if val == 0.0 {
   211  			return Dm_build_623.Dm_build_801(0), nil
   212  		}
   213  		return Dm_build_623.Dm_build_801(1), nil
   214  	case TINYINT:
   215  		if err := G2DB.checkTinyint(float64(val)); err != nil {
   216  			return nil, err
   217  		}
   218  		return Dm_build_623.Dm_build_801(byte(val)), nil
   219  	case SMALLINT:
   220  		if err := G2DB.checkSmallint(float64(val)); err != nil {
   221  			return nil, err
   222  		}
   223  		return Dm_build_623.Dm_build_804(int16(val)), nil
   224  	case INT:
   225  		if err := G2DB.checkInt(float64(val)); err != nil {
   226  			return nil, err
   227  		}
   228  		return Dm_build_623.Dm_build_807(int32(val)), nil
   229  	case BIGINT:
   230  		if err := G2DB.checkBigint(float64(val)); err != nil {
   231  			return nil, err
   232  		}
   233  		return Dm_build_623.Dm_build_810(int64(val)), nil
   234  	case REAL:
   235  		if err := G2DB.checkReal(float64(val)); err != nil {
   236  			return nil, err
   237  		}
   238  		return Dm_build_623.Dm_build_813(val), nil
   239  	case DOUBLE:
   240  		return Dm_build_623.Dm_build_816(float64(val)), nil
   241  	case DECIMAL:
   242  		d, err := newDecimal(big.NewFloat(float64(val)), int(param.prec), int(param.scale))
   243  		if err != nil {
   244  			return nil, err
   245  		}
   246  		return d.encodeDecimal()
   247  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   248  		return Dm_build_623.Dm_build_836(strconv.FormatFloat(float64(val), 'f', -1, 32), conn.getServerEncoding(), conn), nil
   249  	}
   250  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   251  }
   252  
   253  func (G2DB g2db) fromFloat64(val float64, param parameter, conn *DmConnection) ([]byte, error) {
   254  
   255  	switch param.colType {
   256  	case BOOLEAN, BIT:
   257  		if val == 0.0 {
   258  			return Dm_build_623.Dm_build_801(0), nil
   259  		}
   260  		return Dm_build_623.Dm_build_801(1), nil
   261  
   262  	case TINYINT:
   263  		err := G2DB.checkTinyint(val)
   264  
   265  		if err != nil {
   266  			return nil, err
   267  		}
   268  
   269  		return Dm_build_623.Dm_build_801(byte(val)), nil
   270  	case SMALLINT:
   271  		err := G2DB.checkSmallint(val)
   272  
   273  		if err != nil {
   274  			return nil, err
   275  		}
   276  
   277  		return Dm_build_623.Dm_build_804(int16(val)), nil
   278  	case INT:
   279  		err := G2DB.checkInt(val)
   280  
   281  		if err != nil {
   282  			return nil, err
   283  		}
   284  
   285  		return Dm_build_623.Dm_build_807(int32(val)), nil
   286  	case BIGINT:
   287  		err := G2DB.checkBigint(val)
   288  
   289  		if err != nil {
   290  			return nil, err
   291  		}
   292  
   293  		return Dm_build_623.Dm_build_810(int64(val)), nil
   294  	case REAL:
   295  		err := G2DB.checkReal(val)
   296  
   297  		if err != nil {
   298  			return nil, err
   299  		}
   300  
   301  		return Dm_build_623.Dm_build_813(float32(val)), nil
   302  	case DOUBLE:
   303  		return Dm_build_623.Dm_build_816(float64(val)), nil
   304  	case DECIMAL:
   305  		d, err := newDecimal(big.NewFloat(val), int(param.prec), int(param.scale))
   306  		if err != nil {
   307  			return nil, err
   308  		}
   309  		return d.encodeDecimal()
   310  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   311  		return Dm_build_623.Dm_build_836(strconv.FormatFloat(val, 'f', -1, 64), conn.getServerEncoding(), conn), nil
   312  	}
   313  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   314  }
   315  
   316  func (G2DB g2db) fromBytes(val []byte, param parameter, conn *DmConnection) (interface{}, error) {
   317  	switch param.colType {
   318  	case CHAR, VARCHAR2, VARCHAR:
   319  		if conn.dmConnector.noConvertToHex {
   320  			if isBFile(int(param.colType), int(param.prec), int(param.scale)) && !checkBFileStr(string(val)) {
   321  				return nil, ECGO_INVALID_BFILE_STR.throw()
   322  			}
   323  			return Dm_build_623.Dm_build_836_bytes(val, conn.getServerEncoding(), conn), nil
   324  		}
   325  		return G2DB.toVarchar(val)
   326  	case CLOB:
   327  		b, err := G2DB.toVarchar(val)
   328  		if err != nil {
   329  			return nil, err
   330  		}
   331  		return G2DB.changeOffRowData(param, b, conn.getServerEncoding())
   332  	case BINARY, VARBINARY:
   333  		return val, nil
   334  	case BLOB:
   335  		return G2DB.bytes2Blob(val, param, conn)
   336  	case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
   337  		if param.typeDescriptor == nil {
   338  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   339  		}
   340  		return TypeDataSV.objBlobToBytes(val, param.typeDescriptor)
   341  	}
   342  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   343  }
   344  
   345  func (G2DB g2db) toVarchar(bsArr []byte) ([]byte, error) {
   346  	if bsArr == nil || len(bsArr) == 0 {
   347  		return make([]byte, 0), nil
   348  	}
   349  
   350  	realLen := len(bsArr) * 2
   351  	bsRet := make([]byte, realLen)
   352  	for i := 0; i < len(bsArr); i++ {
   353  		bsTemp, err := G2DB.toChar(bsArr[i])
   354  		if err != nil {
   355  			return nil, err
   356  		}
   357  
   358  		bsRet[i*2] = bsTemp[0]
   359  		bsRet[i*2+1] = bsTemp[1]
   360  	}
   361  
   362  	return bsRet, nil
   363  }
   364  
   365  func (G2DB g2db) toChar(bt byte) ([]byte, error) {
   366  	bytes := make([]byte, 2)
   367  	var err error
   368  
   369  	bytes[0], err = G2DB.getCharByNumVal((bt >> 4) & 0x0F)
   370  	if err != nil {
   371  		return nil, err
   372  	}
   373  
   374  	bytes[1], err = G2DB.getCharByNumVal(bt & 0x0F)
   375  	if err != nil {
   376  		return nil, err
   377  	}
   378  
   379  	return bytes, nil
   380  }
   381  
   382  func (G2DB g2db) getCharByNumVal(val byte) (byte, error) {
   383  	if val >= 0 && val <= 9 {
   384  		return (byte)(val + '0'), nil
   385  	}
   386  
   387  	if val >= 0x0a && val <= 0x0F {
   388  		return (byte)(val + 'A' - 0x0a), nil
   389  	}
   390  	return 0, ECGO_INVALID_HEX.throw()
   391  }
   392  
   393  func (G2DB g2db) fromString(val string, param parameter, conn *DmConnection) (interface{}, error) {
   394  	switch param.colType {
   395  	case BOOLEAN, BIT:
   396  		ret, err := G2DB.toBool(val)
   397  		if err != nil {
   398  			return nil, err
   399  		}
   400  
   401  		if ret {
   402  			return Dm_build_623.Dm_build_801(byte(1)), nil
   403  		} else {
   404  			return Dm_build_623.Dm_build_801(byte(0)), nil
   405  		}
   406  
   407  	case TINYINT, SMALLINT, INT, BIGINT:
   408  		f, ok := new(big.Float).SetString(val)
   409  		if !ok {
   410  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   411  		}
   412  		if f.Sign() < 0 {
   413  			f.Sub(f, big.NewFloat(0.5))
   414  		} else {
   415  			f.Add(f, big.NewFloat(0.5))
   416  		}
   417  		z, _ := f.Int(nil)
   418  		return G2DB.fromBigInt(z, param, conn)
   419  	case REAL, DOUBLE, DECIMAL:
   420  		f, ok := new(big.Float).SetString(val)
   421  		if ok {
   422  			return G2DB.fromBigFloat(f, param, conn)
   423  		} else {
   424  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   425  		}
   426  
   427  	case CHAR, VARCHAR2, VARCHAR:
   428  		if isBFile(int(param.colType), int(param.prec), int(param.scale)) && !checkBFileStr(val) {
   429  			return nil, ECGO_INVALID_BFILE_STR.throw()
   430  		}
   431  		return Dm_build_623.Dm_build_836(val, conn.getServerEncoding(), conn), nil
   432  	case CLOB:
   433  		return G2DB.string2Clob(val, param, conn)
   434  	case BINARY, VARBINARY:
   435  		return util.StringUtil.HexStringToBytes(val), nil
   436  	case BLOB:
   437  		return G2DB.bytes2Blob(util.StringUtil.HexStringToBytes(val), param, conn)
   438  	case DATE:
   439  		if conn.FormatDate != "" {
   440  			dt, err := parse(val, conn.FormatDate, int(conn.OracleDateLanguage))
   441  			if err != nil {
   442  				return nil, err
   443  			}
   444  
   445  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   446  		}
   447  
   448  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   449  	case TIME:
   450  		if conn.FormatTime != "" {
   451  			dt, err := parse(val, conn.FormatTime, int(conn.OracleDateLanguage))
   452  			if err != nil {
   453  				return nil, err
   454  			}
   455  
   456  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   457  		}
   458  
   459  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   460  	case DATETIME:
   461  		if conn.FormatTimestamp != "" {
   462  			dt, err := parse(val, conn.FormatTimestamp, int(conn.OracleDateLanguage))
   463  			if err != nil {
   464  				return nil, err
   465  			}
   466  
   467  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   468  		}
   469  
   470  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   471  	case TIME_TZ:
   472  		dt, err := parse(val, conn.FormatTimeTZ, int(conn.OracleDateLanguage))
   473  		if err != nil {
   474  			return nil, err
   475  		}
   476  
   477  		if conn.FormatTimeTZ != "" {
   478  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   479  		}
   480  
   481  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   482  	case DATETIME_TZ:
   483  		if conn.FormatTimestampTZ != "" {
   484  			dt, err := parse(val, conn.FormatTimestampTZ, int(conn.OracleDateLanguage))
   485  			if err != nil {
   486  				return nil, err
   487  			}
   488  
   489  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   490  		}
   491  
   492  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   493  	case INTERVAL_DT:
   494  		dt, err := NewDmIntervalDTByString(val)
   495  		if err != nil {
   496  			return nil, err
   497  		}
   498  		return dt.encode(int(param.scale))
   499  
   500  	case INTERVAL_YM:
   501  		ym, err := NewDmIntervalYMByString(val)
   502  		if err != nil {
   503  			return nil, err
   504  		}
   505  		return ym.encode(int(param.scale))
   506  	}
   507  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   508  }
   509  
   510  func (G2DB g2db) toBool(str string) (bool, error) {
   511  	str = strings.TrimSpace(str)
   512  	if util.StringUtil.Equals(str, "0") {
   513  		return false, nil
   514  	} else if util.StringUtil.Equals(str, "1") {
   515  		return true, nil
   516  	}
   517  
   518  	return strings.ToLower(str) == "true", nil
   519  }
   520  
   521  func (G2DB g2db) fromBigInt(val *big.Int, param parameter, conn *DmConnection) ([]byte, error) {
   522  	var ret []byte
   523  	switch param.colType {
   524  	case BOOLEAN, BIT:
   525  		if val.Sign() == 0 {
   526  			ret = Dm_build_623.Dm_build_801(0)
   527  		} else {
   528  			ret = Dm_build_623.Dm_build_801(1)
   529  		}
   530  	case TINYINT:
   531  		err := G2DB.checkTinyint(float64(val.Int64()))
   532  
   533  		if err != nil {
   534  			return nil, err
   535  		}
   536  
   537  		ret = Dm_build_623.Dm_build_801(byte(val.Int64()))
   538  	case SMALLINT:
   539  		err := G2DB.checkSmallint(float64(val.Int64()))
   540  
   541  		if err != nil {
   542  			return nil, err
   543  		}
   544  
   545  		ret = Dm_build_623.Dm_build_804(int16(val.Int64()))
   546  	case INT:
   547  		err := G2DB.checkInt(float64(val.Int64()))
   548  
   549  		if err != nil {
   550  			return nil, err
   551  		}
   552  
   553  		ret = Dm_build_623.Dm_build_807(int32(val.Int64()))
   554  	case BIGINT:
   555  		err := G2DB.checkBigint(float64(val.Int64()))
   556  
   557  		if err != nil {
   558  			return nil, err
   559  		}
   560  
   561  		ret = Dm_build_623.Dm_build_810(val.Int64())
   562  	case REAL:
   563  		err := G2DB.checkReal(float64(val.Int64()))
   564  
   565  		if err != nil {
   566  			return nil, err
   567  		}
   568  
   569  		ret = Dm_build_623.Dm_build_813(float32(val.Int64()))
   570  	case DOUBLE:
   571  		ret = Dm_build_623.Dm_build_816(float64(val.Int64()))
   572  	case DECIMAL, BINARY, VARBINARY, BLOB:
   573  		d, err := newDecimal(val, int(param.prec), int(param.scale))
   574  		if err != nil {
   575  			return nil, err
   576  		}
   577  		ret, err = d.encodeDecimal()
   578  		if err != nil {
   579  			return nil, err
   580  		}
   581  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   582  		ret = Dm_build_623.Dm_build_836(val.String(), conn.getServerEncoding(), conn)
   583  	default:
   584  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   585  	}
   586  	return ret, nil
   587  }
   588  
   589  func (G2DB g2db) fromBigFloat(val *big.Float, param parameter, conn *DmConnection) ([]byte, error) {
   590  	var ret []byte
   591  	switch param.colType {
   592  	case BOOLEAN, BIT:
   593  		if val.Sign() == 0 {
   594  			ret = Dm_build_623.Dm_build_801(0)
   595  		} else {
   596  			ret = Dm_build_623.Dm_build_801(1)
   597  		}
   598  	case TINYINT:
   599  		f, _ := val.Float64()
   600  
   601  		err := G2DB.checkTinyint(f)
   602  
   603  		if err != nil {
   604  			return nil, err
   605  		}
   606  
   607  		ret = Dm_build_623.Dm_build_801(byte(f))
   608  	case SMALLINT:
   609  		f, _ := val.Float64()
   610  
   611  		err := G2DB.checkSmallint(f)
   612  
   613  		if err != nil {
   614  			return nil, err
   615  		}
   616  
   617  		ret = Dm_build_623.Dm_build_804(int16(f))
   618  	case INT:
   619  		f, _ := val.Float64()
   620  
   621  		err := G2DB.checkInt(f)
   622  
   623  		if err != nil {
   624  			return nil, err
   625  		}
   626  
   627  		ret = Dm_build_623.Dm_build_807(int32(f))
   628  	case BIGINT:
   629  		f, _ := val.Float64()
   630  
   631  		err := G2DB.checkBigint(f)
   632  
   633  		if err != nil {
   634  			return nil, err
   635  		}
   636  
   637  		ret = Dm_build_623.Dm_build_810(int64(f))
   638  	case REAL:
   639  		f, _ := val.Float64()
   640  
   641  		err := G2DB.checkReal(f)
   642  
   643  		if err != nil {
   644  			return nil, err
   645  		}
   646  
   647  		ret = Dm_build_623.Dm_build_813(float32(f))
   648  	case DOUBLE:
   649  		f, _ := val.Float64()
   650  		ret = Dm_build_623.Dm_build_816(f)
   651  	case DECIMAL:
   652  		d, err := newDecimal(val, int(param.prec), int(param.scale))
   653  		if err != nil {
   654  			return nil, err
   655  		}
   656  		ret, err = d.encodeDecimal()
   657  		if err != nil {
   658  			return nil, err
   659  		}
   660  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   661  		ret = Dm_build_623.Dm_build_836(val.Text('f', int(param.scale)), conn.getServerEncoding(), conn)
   662  	default:
   663  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   664  	}
   665  	return ret, nil
   666  }
   667  
   668  func (G2DB g2db) fromDecimal(val DmDecimal, param parameter, conn *DmConnection) ([]byte, error) {
   669  	var ret []byte
   670  	switch param.colType {
   671  	case BOOLEAN, BIT:
   672  		if val.Sign() == 0 {
   673  			ret = Dm_build_623.Dm_build_801(0)
   674  		} else {
   675  			ret = Dm_build_623.Dm_build_801(1)
   676  		}
   677  	case TINYINT:
   678  		if err := G2DB.checkTinyint(val); err != nil {
   679  			return nil, err
   680  		}
   681  		ret = Dm_build_623.Dm_build_801(byte(val.ToBigInt().Int64()))
   682  	case SMALLINT:
   683  		if err := G2DB.checkSmallint(val); err != nil {
   684  			return nil, err
   685  		}
   686  		ret = Dm_build_623.Dm_build_804(int16(val.ToBigInt().Int64()))
   687  	case INT:
   688  		if err := G2DB.checkInt(val); err != nil {
   689  			return nil, err
   690  		}
   691  		ret = Dm_build_623.Dm_build_807(int32(val.ToBigInt().Int64()))
   692  	case BIGINT:
   693  		if err := G2DB.checkBigint(val); err != nil {
   694  			return nil, err
   695  		}
   696  		ret = Dm_build_623.Dm_build_810(int64(val.ToBigInt().Int64()))
   697  	case REAL:
   698  		if err := G2DB.checkReal(val); err != nil {
   699  			return nil, err
   700  		}
   701  		f, _ := val.ToBigFloat().Float32()
   702  		ret = Dm_build_623.Dm_build_813(f)
   703  	case DOUBLE:
   704  		f, _ := val.ToBigFloat().Float64()
   705  		ret = Dm_build_623.Dm_build_816(f)
   706  	case DECIMAL:
   707  		var err error
   708  		ret, err = val.encodeDecimal()
   709  		if err != nil {
   710  			return nil, err
   711  		}
   712  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   713  		ret = Dm_build_623.Dm_build_836(val.ToBigFloat().Text('f', -1), conn.getServerEncoding(), conn)
   714  	default:
   715  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   716  	}
   717  	return ret, nil
   718  }
   719  
   720  func (G2DB g2db) fromTime(val time.Time, param parameter, conn *DmConnection) ([]byte, error) {
   721  
   722  	switch param.colType {
   723  	case DATE, DATETIME, DATETIME_TZ, TIME, TIME_TZ:
   724  		return encodeByTime(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   725  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   726  		return Dm_build_623.Dm_build_836(val.Format("2006-01-02 15:04:05.999999999 -07:00"), conn.getServerEncoding(), conn), nil
   727  	}
   728  
   729  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   730  }
   731  
   732  func (G2DB g2db) fromDmIntervalDT(val DmIntervalDT, param parameter, conn *DmConnection) ([]byte, error) {
   733  	switch param.colType {
   734  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   735  		return Dm_build_623.Dm_build_836(val.String(), conn.getServerEncoding(), conn), nil
   736  	case INTERVAL_DT:
   737  		return val.encode(int(param.scale))
   738  	default:
   739  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   740  	}
   741  }
   742  
   743  func (G2DB g2db) fromDmdbIntervalYM(val DmIntervalYM, param parameter, conn *DmConnection) ([]byte, error) {
   744  
   745  	switch param.colType {
   746  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   747  		return Dm_build_623.Dm_build_836(val.String(), conn.getServerEncoding(), conn), nil
   748  	case INTERVAL_YM:
   749  		return val.encode(int(param.scale))
   750  	default:
   751  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   752  	}
   753  }
   754  
   755  func (G2DB g2db) fromBlob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
   756  	var ret interface{}
   757  	switch param.colType {
   758  	case BINARY, VARBINARY:
   759  		len, err := val.GetLength()
   760  		if err != nil {
   761  			return nil, err
   762  		}
   763  		ret, err = val.getBytes(1, int32(len))
   764  		if err != nil {
   765  			return nil, err
   766  		}
   767  	case BLOB:
   768  		var err error
   769  		ret, err = G2DB.blob2Blob(val, param, conn)
   770  		if err != nil {
   771  			return nil, err
   772  		}
   773  	case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
   774  
   775  	default:
   776  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   777  	}
   778  	return ret, nil
   779  }
   780  
   781  func (G2DB g2db) fromClob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
   782  	var ret interface{}
   783  	switch param.colType {
   784  	case CHAR, VARCHAR, VARCHAR2:
   785  		var len int64
   786  		var s string
   787  		var err error
   788  		len, err = val.GetLength()
   789  		if err != nil {
   790  			return nil, err
   791  		}
   792  		s, err = val.getSubString(1, int32(len))
   793  		if err != nil {
   794  			return nil, err
   795  		}
   796  		ret = []byte(s)
   797  	case CLOB:
   798  		var err error
   799  		ret, err = G2DB.clob2Clob(val, param, conn)
   800  		if err != nil {
   801  			return nil, err
   802  		}
   803  	default:
   804  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   805  	}
   806  	return ret, nil
   807  }
   808  
   809  func (G2DB g2db) fromReader(val io.Reader, param parameter, conn *DmConnection) (interface{}, error) {
   810  	var ret interface{}
   811  	switch param.colType {
   812  	case CHAR, VARCHAR2, VARCHAR:
   813  		var bytesBuf = new(bytes.Buffer)
   814  		if _, err := bytesBuf.ReadFrom(val); err != nil {
   815  			return nil, err
   816  		}
   817  		return Dm_build_623.Dm_build_836(string(bytesBuf.Bytes()), conn.getServerEncoding(), conn), nil
   818  	case BINARY, VARBINARY:
   819  		var bytesBuf = new(bytes.Buffer)
   820  		if _, err := bytesBuf.ReadFrom(val); err != nil {
   821  			return nil, err
   822  		}
   823  		return util.StringUtil.HexStringToBytes(string(bytesBuf.Bytes())), nil
   824  	case BLOB, CLOB:
   825  		var binder = newOffRowReaderBinder(val, conn.getServerEncoding())
   826  		if binder.offRow {
   827  			ret = binder
   828  		} else {
   829  			ret = binder.readAll()
   830  		}
   831  	default:
   832  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   833  	}
   834  	return ret, nil
   835  }
   836  
   837  func (G2DB g2db) string2Clob(val string, param parameter, conn *DmConnection) (interface{}, error) {
   838  	return G2DB.changeOffRowData(param, Dm_build_623.Dm_build_836(val, conn.getServerEncoding(), conn), conn.getServerEncoding())
   839  }
   840  
   841  func (G2DB g2db) bytes2Blob(val []byte, param parameter, conn *DmConnection) (interface{}, error) {
   842  	return G2DB.changeOffRowData(param, val, conn.getServerEncoding())
   843  }
   844  
   845  func (G2DB g2db) clob2Clob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
   846  	var clobLen int64
   847  	var err error
   848  	if clobLen, err = val.GetLength(); err != nil {
   849  		return nil, err
   850  	}
   851  	if G2DB.isOffRow(param.colType, clobLen) {
   852  		return newOffRowClobBinder(val, conn.getServerEncoding()), nil
   853  	} else {
   854  		var length int64
   855  		var str string
   856  		if length, err = val.GetLength(); err != nil {
   857  			return nil, err
   858  		}
   859  		if str, err = val.getSubString(1, int32(length)); err != nil {
   860  			return nil, err
   861  		}
   862  		return Dm_build_623.Dm_build_836(str, conn.getServerEncoding(), conn), nil
   863  	}
   864  }
   865  
   866  func (G2DB g2db) blob2Blob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
   867  	var clobLen int64
   868  	var err error
   869  	if clobLen, err = val.GetLength(); err != nil {
   870  		return nil, err
   871  	}
   872  	if G2DB.isOffRow(param.colType, clobLen) {
   873  		return newOffRowBlobBinder(val, conn.getServerEncoding()), nil
   874  	} else {
   875  		var length int64
   876  		if length, err = val.GetLength(); err != nil {
   877  			return nil, err
   878  		}
   879  		return val.getBytes(1, int32(length))
   880  	}
   881  }
   882  
   883  func (G2DB g2db) changeOffRowData(paramDesc parameter, paramData []byte, encoding string) (interface{}, error) {
   884  	if G2DB.isOffRow(paramDesc.colType, int64(len(paramData))) {
   885  		return newOffRowBytesBinder(paramData, encoding), nil
   886  	} else {
   887  		return paramData, nil
   888  	}
   889  }
   890  
   891  func (G2DB g2db) isOffRow(dtype int32, length int64) bool {
   892  	return (dtype == BLOB || dtype == CLOB) && length > Dm_build_117
   893  }
   894  
   895  func (G2DB g2db) fromObject(mem interface{}, param parameter, conn *DmConnection) ([]byte, error) {
   896  	switch v := mem.(type) {
   897  	case bool:
   898  		return G2DB.fromBool(v, param, conn)
   899  	case rune:
   900  		val, err := G2DB.fromString(string(v), param, conn)
   901  		return val.([]byte), err
   902  	case string:
   903  		val, err := G2DB.fromString(v, param, conn)
   904  		return val.([]byte), err
   905  	case byte:
   906  		return G2DB.fromInt64(int64(v), param, conn)
   907  	case int:
   908  		return G2DB.fromInt64(int64(v), param, conn)
   909  	case int16:
   910  		return G2DB.fromInt64(int64(v), param, conn)
   911  	case int64:
   912  		return G2DB.fromInt64(v, param, conn)
   913  	case float32:
   914  		return G2DB.fromFloat64(float64(v), param, conn)
   915  	case float64:
   916  		return G2DB.fromFloat64(v, param, conn)
   917  	case time.Time:
   918  		return G2DB.fromTime(v, param, conn)
   919  	case DmDecimal:
   920  		return G2DB.fromDecimal(v, param, conn)
   921  	case DmIntervalDT:
   922  		return G2DB.fromDmIntervalDT(v, param, conn)
   923  	case DmIntervalYM:
   924  		return G2DB.fromDmdbIntervalYM(v, param, conn)
   925  	case DmBlob:
   926  		length, _ := v.GetLength()
   927  		return v.getBytes(1, int32(length))
   928  	case DmClob:
   929  		length, _ := v.GetLength()
   930  		str, err := v.getSubString(1, int32(length))
   931  		if err != nil {
   932  			return nil, err
   933  		}
   934  		return Dm_build_623.Dm_build_836(str, conn.getServerEncoding(), conn), nil
   935  	default:
   936  		return nil, ECGO_UNSUPPORTED_TYPE.throw()
   937  	}
   938  
   939  }
   940  
   941  func (G2DB g2db) toInt32(val int32) []byte {
   942  	bytes := make([]byte, 4)
   943  	Dm_build_623.Dm_build_639(bytes, 0, val)
   944  	return bytes
   945  }
   946  
   947  func (G2DB g2db) toInt64(val int64) []byte {
   948  	bytes := make([]byte, 8)
   949  	Dm_build_623.Dm_build_644(bytes, 0, val)
   950  	return bytes
   951  }
   952  
   953  func (G2DB g2db) toFloat32(val float32) []byte {
   954  	bytes := make([]byte, 4)
   955  	Dm_build_623.Dm_build_649(bytes, 0, val)
   956  	return bytes
   957  }
   958  
   959  func (G2DB g2db) toFloat64(val float64) []byte {
   960  	bytes := make([]byte, 8)
   961  	Dm_build_623.Dm_build_654(bytes, 0, val)
   962  	return bytes
   963  }
   964  
   965  func (G2DB g2db) toDecimal(val string, prec int, scale int) ([]byte, error) {
   966  	d, err := decodeDecimal([]byte(val), prec, scale)
   967  	if err != nil {
   968  		return nil, err
   969  	}
   970  	return d.encodeDecimal()
   971  }
   972  
   973  func (G2DB g2db) fromArray(x *DmArray, param parameter, connection *DmConnection) (interface{}, error) {
   974  	var ret interface{}
   975  	var err error
   976  	switch param.colType {
   977  	case SARRAY:
   978  		ret, err = TypeDataSV.sarrayToBytes(x, param.typeDescriptor)
   979  	case CLASS, ARRAY:
   980  		ret, err = TypeDataSV.arrayToBytes(x, param.typeDescriptor)
   981  	case BLOB:
   982  		ret, err = TypeDataSV.toBytesFromDmArray(x, param.typeDescriptor)
   983  		if err == nil {
   984  			ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
   985  		}
   986  	default:
   987  		err = ECGO_DATA_CONVERTION_ERROR.throw()
   988  	}
   989  	return ret, err
   990  }
   991  
   992  func (G2DB g2db) fromStruct(x *DmStruct, param parameter, connection *DmConnection) (interface{}, error) {
   993  	var ret interface{}
   994  	var err error
   995  	switch param.colType {
   996  	case CLASS:
   997  		ret, err = TypeDataSV.structToBytes(x, param.typeDescriptor)
   998  	case PLTYPE_RECORD:
   999  		ret, err = TypeDataSV.recordToBytes(x, param.typeDescriptor)
  1000  	case BLOB:
  1001  		ret, err = TypeDataSV.toBytesFromDmStruct(x, param.typeDescriptor)
  1002  		if err == nil {
  1003  			ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
  1004  		}
  1005  
  1006  	default:
  1007  		err = ECGO_DATA_CONVERTION_ERROR.throw()
  1008  	}
  1009  	return ret, err
  1010  }
  1011  
  1012  func checkBFileStr(s string) bool {
  1013  	strs := strings.Split(strings.TrimSpace(s), ":")
  1014  	if len(strs) != 2 {
  1015  		return false
  1016  	}
  1017  	if len(strs[0]) > 128 || len(strs[1]) > 256 {
  1018  		return false
  1019  	}
  1020  	return true
  1021  }