github.com/wanlay/gorm-dm8@v1.0.5/dmr/zi.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  package dmr
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  	"math/big"
    11  	"strconv"
    12  	"strings"
    13  	"time"
    14  
    15  	"github.com/wanlay/gorm-dm8/dmr/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_1220.Dm_build_1398(byte(1)), nil
   110  		} else {
   111  			return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(byte(0)), nil
   123  		}
   124  
   125  		return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(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_1220.Dm_build_1401(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_1220.Dm_build_1404(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_1220.Dm_build_1407(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_1220.Dm_build_1410(float32(val)), nil
   167  	case DOUBLE:
   168  		return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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_1220.Dm_build_1398(0), nil
   212  		}
   213  		return Dm_build_1220.Dm_build_1398(1), nil
   214  	case TINYINT:
   215  		if err := G2DB.checkTinyint(float64(val)); err != nil {
   216  			return nil, err
   217  		}
   218  		return Dm_build_1220.Dm_build_1398(byte(val)), nil
   219  	case SMALLINT:
   220  		if err := G2DB.checkSmallint(float64(val)); err != nil {
   221  			return nil, err
   222  		}
   223  		return Dm_build_1220.Dm_build_1401(int16(val)), nil
   224  	case INT:
   225  		if err := G2DB.checkInt(float64(val)); err != nil {
   226  			return nil, err
   227  		}
   228  		return Dm_build_1220.Dm_build_1404(int32(val)), nil
   229  	case BIGINT:
   230  		if err := G2DB.checkBigint(float64(val)); err != nil {
   231  			return nil, err
   232  		}
   233  		return Dm_build_1220.Dm_build_1407(int64(val)), nil
   234  	case REAL:
   235  		if err := G2DB.checkReal(float64(val)); err != nil {
   236  			return nil, err
   237  		}
   238  		return Dm_build_1220.Dm_build_1410(val), nil
   239  	case DOUBLE:
   240  		return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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_1220.Dm_build_1398(0), nil
   259  		}
   260  		return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(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_1220.Dm_build_1401(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_1220.Dm_build_1404(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_1220.Dm_build_1407(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_1220.Dm_build_1410(float32(val)), nil
   302  	case DOUBLE:
   303  		return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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  		return G2DB.toVarchar(val)
   320  	case CLOB:
   321  		b, err := G2DB.toVarchar(val)
   322  		if err != nil {
   323  			return nil, err
   324  		}
   325  		return G2DB.changeOffRowData(param, b, conn.getServerEncoding())
   326  	case BINARY, VARBINARY:
   327  		return val, nil
   328  	case BLOB:
   329  		return G2DB.bytes2Blob(val, param, conn)
   330  	case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
   331  		if param.typeDescriptor == nil {
   332  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   333  		}
   334  		return TypeDataSV.objBlobToBytes(val, param.typeDescriptor)
   335  	}
   336  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   337  }
   338  
   339  func (G2DB g2db) toVarchar(bsArr []byte) ([]byte, error) {
   340  	if bsArr == nil || len(bsArr) == 0 {
   341  		return make([]byte, 0), nil
   342  	}
   343  
   344  	realLen := len(bsArr) * 2
   345  	bsRet := make([]byte, realLen)
   346  	for i := 0; i < len(bsArr); i++ {
   347  		bsTemp, err := G2DB.toChar(bsArr[i])
   348  		if err != nil {
   349  			return nil, err
   350  		}
   351  
   352  		bsRet[i*2] = bsTemp[0]
   353  		bsRet[i*2+1] = bsTemp[1]
   354  	}
   355  
   356  	return bsRet, nil
   357  }
   358  
   359  func (G2DB g2db) toChar(bt byte) ([]byte, error) {
   360  	bytes := make([]byte, 2)
   361  	var err error
   362  
   363  	bytes[0], err = G2DB.getCharByNumVal((bt >> 4) & 0x0F)
   364  	if err != nil {
   365  		return nil, err
   366  	}
   367  
   368  	bytes[1], err = G2DB.getCharByNumVal(bt & 0x0F)
   369  	if err != nil {
   370  		return nil, err
   371  	}
   372  
   373  	return bytes, nil
   374  }
   375  
   376  func (G2DB g2db) getCharByNumVal(val byte) (byte, error) {
   377  	if val >= 0 && val <= 9 {
   378  		return (byte)(val + '0'), nil
   379  	}
   380  
   381  	if val >= 0x0a && val <= 0x0F {
   382  		return (byte)(val + 'A' - 0x0a), nil
   383  	}
   384  	return 0, ECGO_INVALID_HEX.throw()
   385  }
   386  
   387  func (G2DB g2db) fromString(val string, param parameter, conn *DmConnection) (interface{}, error) {
   388  	switch param.colType {
   389  	case BOOLEAN, BIT:
   390  		ret, err := G2DB.toBool(val)
   391  		if err != nil {
   392  			return nil, err
   393  		}
   394  
   395  		if ret {
   396  			return Dm_build_1220.Dm_build_1398(byte(1)), nil
   397  		} else {
   398  			return Dm_build_1220.Dm_build_1398(byte(0)), nil
   399  		}
   400  
   401  	case TINYINT, SMALLINT, INT, BIGINT:
   402  		f, ok := new(big.Float).SetString(val)
   403  		if !ok {
   404  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   405  		}
   406  		if f.Sign() < 0 {
   407  			f.Sub(f, big.NewFloat(0.5))
   408  		} else {
   409  			f.Add(f, big.NewFloat(0.5))
   410  		}
   411  		z, _ := f.Int(nil)
   412  		return G2DB.fromBigInt(z, param, conn)
   413  	case REAL, DOUBLE, DECIMAL:
   414  		f, ok := new(big.Float).SetString(val)
   415  		if ok {
   416  			return G2DB.fromBigFloat(f, param, conn)
   417  		} else {
   418  			return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   419  		}
   420  
   421  	case CHAR, VARCHAR2, VARCHAR:
   422  		if isBFile(int(param.colType), int(param.prec), int(param.scale)) && !checkBFileStr(val) {
   423  			return nil, ECGO_INVALID_BFILE_STR.throw()
   424  		}
   425  		return Dm_build_1220.Dm_build_1433(val, conn.getServerEncoding(), conn), nil
   426  	case CLOB:
   427  		return G2DB.string2Clob(val, param, conn)
   428  	case BINARY, VARBINARY:
   429  		return util.StringUtil.HexStringToBytes(val), nil
   430  	case BLOB:
   431  		return G2DB.bytes2Blob(util.StringUtil.HexStringToBytes(val), param, conn)
   432  	case DATE:
   433  		if conn.FormatDate != "" {
   434  			dt, err := parse(val, conn.FormatDate, int(conn.OracleDateLanguage))
   435  			if err != nil {
   436  				return nil, err
   437  			}
   438  
   439  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   440  		}
   441  
   442  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   443  	case TIME:
   444  		if conn.FormatTime != "" {
   445  			dt, err := parse(val, conn.FormatTime, int(conn.OracleDateLanguage))
   446  			if err != nil {
   447  				return nil, err
   448  			}
   449  
   450  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   451  		}
   452  
   453  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   454  	case DATETIME:
   455  		if conn.FormatTimestamp != "" {
   456  			dt, err := parse(val, conn.FormatTimestamp, int(conn.OracleDateLanguage))
   457  			if err != nil {
   458  				return nil, err
   459  			}
   460  
   461  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   462  		}
   463  
   464  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   465  	case TIME_TZ:
   466  		dt, err := parse(val, conn.FormatTimeTZ, int(conn.OracleDateLanguage))
   467  		if err != nil {
   468  			return nil, err
   469  		}
   470  
   471  		if conn.FormatTimeTZ != "" {
   472  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   473  		}
   474  
   475  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   476  	case DATETIME_TZ:
   477  		if conn.FormatTimestampTZ != "" {
   478  			dt, err := parse(val, conn.FormatTimestampTZ, int(conn.OracleDateLanguage))
   479  			if err != nil {
   480  				return nil, err
   481  			}
   482  
   483  			return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone))
   484  		}
   485  
   486  		return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   487  	case INTERVAL_DT:
   488  		dt, err := NewDmIntervalDTByString(val)
   489  		if err != nil {
   490  			return nil, err
   491  		}
   492  		return dt.encode(int(param.scale))
   493  
   494  	case INTERVAL_YM:
   495  		ym, err := NewDmIntervalYMByString(val)
   496  		if err != nil {
   497  			return nil, err
   498  		}
   499  		return ym.encode(int(param.scale))
   500  	}
   501  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   502  }
   503  
   504  func (G2DB g2db) toBool(str string) (bool, error) {
   505  	str = strings.TrimSpace(str)
   506  	if util.StringUtil.Equals(str, "0") {
   507  		return false, nil
   508  	} else if util.StringUtil.Equals(str, "1") {
   509  		return true, nil
   510  	}
   511  
   512  	return strings.ToLower(str) == "true", nil
   513  }
   514  
   515  func (G2DB g2db) fromBigInt(val *big.Int, param parameter, conn *DmConnection) ([]byte, error) {
   516  	var ret []byte
   517  	switch param.colType {
   518  	case BOOLEAN, BIT:
   519  		if val.Sign() == 0 {
   520  			ret = Dm_build_1220.Dm_build_1398(0)
   521  		} else {
   522  			ret = Dm_build_1220.Dm_build_1398(1)
   523  		}
   524  	case TINYINT:
   525  		err := G2DB.checkTinyint(float64(val.Int64()))
   526  
   527  		if err != nil {
   528  			return nil, err
   529  		}
   530  
   531  		ret = Dm_build_1220.Dm_build_1398(byte(val.Int64()))
   532  	case SMALLINT:
   533  		err := G2DB.checkSmallint(float64(val.Int64()))
   534  
   535  		if err != nil {
   536  			return nil, err
   537  		}
   538  
   539  		ret = Dm_build_1220.Dm_build_1401(int16(val.Int64()))
   540  	case INT:
   541  		err := G2DB.checkInt(float64(val.Int64()))
   542  
   543  		if err != nil {
   544  			return nil, err
   545  		}
   546  
   547  		ret = Dm_build_1220.Dm_build_1404(int32(val.Int64()))
   548  	case BIGINT:
   549  		err := G2DB.checkBigint(float64(val.Int64()))
   550  
   551  		if err != nil {
   552  			return nil, err
   553  		}
   554  
   555  		ret = Dm_build_1220.Dm_build_1407(val.Int64())
   556  	case REAL:
   557  		err := G2DB.checkReal(float64(val.Int64()))
   558  
   559  		if err != nil {
   560  			return nil, err
   561  		}
   562  
   563  		ret = Dm_build_1220.Dm_build_1410(float32(val.Int64()))
   564  	case DOUBLE:
   565  		ret = Dm_build_1220.Dm_build_1413(float64(val.Int64()))
   566  	case DECIMAL, BINARY, VARBINARY, BLOB:
   567  		d, err := newDecimal(val, int(param.prec), int(param.scale))
   568  		if err != nil {
   569  			return nil, err
   570  		}
   571  		ret, err = d.encodeDecimal()
   572  		if err != nil {
   573  			return nil, err
   574  		}
   575  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   576  		ret = Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn)
   577  	default:
   578  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   579  	}
   580  	return ret, nil
   581  }
   582  
   583  func (G2DB g2db) fromBigFloat(val *big.Float, param parameter, conn *DmConnection) ([]byte, error) {
   584  	var ret []byte
   585  	switch param.colType {
   586  	case BOOLEAN, BIT:
   587  		if val.Sign() == 0 {
   588  			ret = Dm_build_1220.Dm_build_1398(0)
   589  		} else {
   590  			ret = Dm_build_1220.Dm_build_1398(1)
   591  		}
   592  	case TINYINT:
   593  		f, _ := val.Float64()
   594  
   595  		err := G2DB.checkTinyint(f)
   596  
   597  		if err != nil {
   598  			return nil, err
   599  		}
   600  
   601  		ret = Dm_build_1220.Dm_build_1398(byte(f))
   602  	case SMALLINT:
   603  		f, _ := val.Float64()
   604  
   605  		err := G2DB.checkSmallint(f)
   606  
   607  		if err != nil {
   608  			return nil, err
   609  		}
   610  
   611  		ret = Dm_build_1220.Dm_build_1401(int16(f))
   612  	case INT:
   613  		f, _ := val.Float64()
   614  
   615  		err := G2DB.checkInt(f)
   616  
   617  		if err != nil {
   618  			return nil, err
   619  		}
   620  
   621  		ret = Dm_build_1220.Dm_build_1404(int32(f))
   622  	case BIGINT:
   623  		f, _ := val.Float64()
   624  
   625  		err := G2DB.checkBigint(f)
   626  
   627  		if err != nil {
   628  			return nil, err
   629  		}
   630  
   631  		ret = Dm_build_1220.Dm_build_1407(int64(f))
   632  	case REAL:
   633  		f, _ := val.Float64()
   634  
   635  		err := G2DB.checkReal(f)
   636  
   637  		if err != nil {
   638  			return nil, err
   639  		}
   640  
   641  		ret = Dm_build_1220.Dm_build_1410(float32(f))
   642  	case DOUBLE:
   643  		f, _ := val.Float64()
   644  		ret = Dm_build_1220.Dm_build_1413(f)
   645  	case DECIMAL:
   646  		d, err := newDecimal(val, int(param.prec), int(param.scale))
   647  		if err != nil {
   648  			return nil, err
   649  		}
   650  		ret, err = d.encodeDecimal()
   651  		if err != nil {
   652  			return nil, err
   653  		}
   654  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   655  		ret = Dm_build_1220.Dm_build_1433(val.Text('f', int(param.scale)), conn.getServerEncoding(), conn)
   656  	default:
   657  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   658  	}
   659  	return ret, nil
   660  }
   661  
   662  func (G2DB g2db) fromDecimal(val DmDecimal, param parameter, conn *DmConnection) ([]byte, error) {
   663  	var ret []byte
   664  	switch param.colType {
   665  	case BOOLEAN, BIT:
   666  		if val.Sign() == 0 {
   667  			ret = Dm_build_1220.Dm_build_1398(0)
   668  		} else {
   669  			ret = Dm_build_1220.Dm_build_1398(1)
   670  		}
   671  	case TINYINT:
   672  		if err := G2DB.checkTinyint(val); err != nil {
   673  			return nil, err
   674  		}
   675  		ret = Dm_build_1220.Dm_build_1398(byte(val.ToBigInt().Int64()))
   676  	case SMALLINT:
   677  		if err := G2DB.checkSmallint(val); err != nil {
   678  			return nil, err
   679  		}
   680  		ret = Dm_build_1220.Dm_build_1401(int16(val.ToBigInt().Int64()))
   681  	case INT:
   682  		if err := G2DB.checkInt(val); err != nil {
   683  			return nil, err
   684  		}
   685  		ret = Dm_build_1220.Dm_build_1404(int32(val.ToBigInt().Int64()))
   686  	case BIGINT:
   687  		if err := G2DB.checkBigint(val); err != nil {
   688  			return nil, err
   689  		}
   690  		ret = Dm_build_1220.Dm_build_1407(int64(val.ToBigInt().Int64()))
   691  	case REAL:
   692  		if err := G2DB.checkReal(val); err != nil {
   693  			return nil, err
   694  		}
   695  		f, _ := val.ToBigFloat().Float32()
   696  		ret = Dm_build_1220.Dm_build_1410(f)
   697  	case DOUBLE:
   698  		f, _ := val.ToBigFloat().Float64()
   699  		ret = Dm_build_1220.Dm_build_1413(f)
   700  	case DECIMAL:
   701  		var err error
   702  		ret, err = val.encodeDecimal()
   703  		if err != nil {
   704  			return nil, err
   705  		}
   706  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   707  		ret = Dm_build_1220.Dm_build_1433(val.ToBigFloat().Text('f', -1), conn.getServerEncoding(), conn)
   708  	default:
   709  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   710  	}
   711  	return ret, nil
   712  }
   713  
   714  func (G2DB g2db) fromTime(val time.Time, param parameter, conn *DmConnection) ([]byte, error) {
   715  
   716  	switch param.colType {
   717  	case DATE, DATETIME, DATETIME_TZ, TIME, TIME_TZ:
   718  		return encodeByTime(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
   719  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   720  		return Dm_build_1220.Dm_build_1433(val.Format("2006-01-02 15:04:05.999999999 -07:00"), conn.getServerEncoding(), conn), nil
   721  	}
   722  
   723  	return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   724  }
   725  
   726  func (G2DB g2db) fromDmIntervalDT(val DmIntervalDT, param parameter, conn *DmConnection) ([]byte, error) {
   727  	switch param.colType {
   728  	case CHAR, VARCHAR2, VARCHAR, CLOB:
   729  		return Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn), nil
   730  	case INTERVAL_DT:
   731  		return val.encode(int(param.scale))
   732  	default:
   733  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   734  	}
   735  }
   736  
   737  func (G2DB g2db) fromDmdbIntervalYM(val DmIntervalYM, param parameter, conn *DmConnection) ([]byte, error) {
   738  
   739  	switch param.colType {
   740  	case CHAR, VARCHAR, VARCHAR2, CLOB:
   741  		return Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn), nil
   742  	case INTERVAL_YM:
   743  		return val.encode(int(param.scale))
   744  	default:
   745  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   746  	}
   747  }
   748  
   749  func (G2DB g2db) fromBlob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
   750  	var ret interface{}
   751  	switch param.colType {
   752  	case BINARY, VARBINARY:
   753  		len, err := val.GetLength()
   754  		if err != nil {
   755  			return nil, err
   756  		}
   757  		ret, err = val.getBytes(1, int32(len))
   758  		if err != nil {
   759  			return nil, err
   760  		}
   761  	case BLOB:
   762  		var err error
   763  		ret, err = G2DB.blob2Blob(val, param, conn)
   764  		if err != nil {
   765  			return nil, err
   766  		}
   767  	case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
   768  
   769  	default:
   770  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   771  	}
   772  	return ret, nil
   773  }
   774  
   775  func (G2DB g2db) fromClob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
   776  	var ret interface{}
   777  	switch param.colType {
   778  	case CHAR, VARCHAR, VARCHAR2:
   779  		var len int64
   780  		var s string
   781  		var err error
   782  		len, err = val.GetLength()
   783  		if err != nil {
   784  			return nil, err
   785  		}
   786  		s, err = val.getSubString(1, int32(len))
   787  		if err != nil {
   788  			return nil, err
   789  		}
   790  		ret = []byte(s)
   791  	case CLOB:
   792  		var err error
   793  		ret, err = G2DB.clob2Clob(val, param, conn)
   794  		if err != nil {
   795  			return nil, err
   796  		}
   797  	default:
   798  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   799  	}
   800  	return ret, nil
   801  }
   802  
   803  func (G2DB g2db) fromReader(val io.Reader, param parameter, conn *DmConnection) (interface{}, error) {
   804  	var ret interface{}
   805  	switch param.colType {
   806  	case CHAR, VARCHAR2, VARCHAR:
   807  		var bytesBuf = new(bytes.Buffer)
   808  		if _, err := bytesBuf.ReadFrom(val); err != nil {
   809  			return nil, err
   810  		}
   811  		return Dm_build_1220.Dm_build_1433(string(bytesBuf.Bytes()), conn.getServerEncoding(), conn), nil
   812  	case BINARY, VARBINARY:
   813  		var bytesBuf = new(bytes.Buffer)
   814  		if _, err := bytesBuf.ReadFrom(val); err != nil {
   815  			return nil, err
   816  		}
   817  		return util.StringUtil.HexStringToBytes(string(bytesBuf.Bytes())), nil
   818  	case BLOB, CLOB:
   819  		var binder = newOffRowReaderBinder(val, conn.getServerEncoding())
   820  		if binder.offRow {
   821  			ret = binder
   822  		} else {
   823  			ret = binder.readAll()
   824  		}
   825  	default:
   826  		return nil, ECGO_DATA_CONVERTION_ERROR.throw()
   827  	}
   828  	return ret, nil
   829  }
   830  
   831  func (G2DB g2db) string2Clob(val string, param parameter, conn *DmConnection) (interface{}, error) {
   832  	return G2DB.changeOffRowData(param, Dm_build_1220.Dm_build_1433(val, conn.getServerEncoding(), conn), conn.getServerEncoding())
   833  }
   834  
   835  func (G2DB g2db) bytes2Blob(val []byte, param parameter, conn *DmConnection) (interface{}, error) {
   836  	return G2DB.changeOffRowData(param, val, conn.getServerEncoding())
   837  }
   838  
   839  func (G2DB g2db) clob2Clob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
   840  	var clobLen int64
   841  	var err error
   842  	if clobLen, err = val.GetLength(); err != nil {
   843  		return nil, err
   844  	}
   845  	if G2DB.isOffRow(param.colType, clobLen) {
   846  		return newOffRowClobBinder(val, conn.getServerEncoding()), nil
   847  	} else {
   848  		var length int64
   849  		var str string
   850  		if length, err = val.GetLength(); err != nil {
   851  			return nil, err
   852  		}
   853  		if str, err = val.getSubString(1, int32(length)); err != nil {
   854  			return nil, err
   855  		}
   856  		return Dm_build_1220.Dm_build_1433(str, conn.getServerEncoding(), conn), nil
   857  	}
   858  }
   859  
   860  func (G2DB g2db) blob2Blob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
   861  	var clobLen int64
   862  	var err error
   863  	if clobLen, err = val.GetLength(); err != nil {
   864  		return nil, err
   865  	}
   866  	if G2DB.isOffRow(param.colType, clobLen) {
   867  		return newOffRowBlobBinder(val, conn.getServerEncoding()), nil
   868  	} else {
   869  		var length int64
   870  		if length, err = val.GetLength(); err != nil {
   871  			return nil, err
   872  		}
   873  		return val.getBytes(1, int32(length))
   874  	}
   875  }
   876  
   877  func (G2DB g2db) changeOffRowData(paramDesc parameter, paramData []byte, encoding string) (interface{}, error) {
   878  	if G2DB.isOffRow(paramDesc.colType, int64(len(paramData))) {
   879  		return newOffRowBytesBinder(paramData, encoding), nil
   880  	} else {
   881  		return paramData, nil
   882  	}
   883  }
   884  
   885  func (G2DB g2db) isOffRow(dtype int32, length int64) bool {
   886  	return (dtype == BLOB || dtype == CLOB) && length > Dm_build_714
   887  }
   888  
   889  func (G2DB g2db) fromObject(mem interface{}, param parameter, conn *DmConnection) ([]byte, error) {
   890  	switch v := mem.(type) {
   891  	case bool:
   892  		return G2DB.fromBool(v, param, conn)
   893  	case rune:
   894  		val, err := G2DB.fromString(string(v), param, conn)
   895  		return val.([]byte), err
   896  	case string:
   897  		val, err := G2DB.fromString(v, param, conn)
   898  		return val.([]byte), err
   899  	case byte:
   900  		return G2DB.fromInt64(int64(v), param, conn)
   901  	case int:
   902  		return G2DB.fromInt64(int64(v), param, conn)
   903  	case int16:
   904  		return G2DB.fromInt64(int64(v), param, conn)
   905  	case int64:
   906  		return G2DB.fromInt64(v, param, conn)
   907  	case float32:
   908  		return G2DB.fromFloat64(float64(v), param, conn)
   909  	case float64:
   910  		return G2DB.fromFloat64(v, param, conn)
   911  	case time.Time:
   912  		return G2DB.fromTime(v, param, conn)
   913  	case DmDecimal:
   914  		return G2DB.fromDecimal(v, param, conn)
   915  	case DmIntervalDT:
   916  		return G2DB.fromDmIntervalDT(v, param, conn)
   917  	case DmIntervalYM:
   918  		return G2DB.fromDmdbIntervalYM(v, param, conn)
   919  	case DmBlob:
   920  		length, _ := v.GetLength()
   921  		return v.getBytes(1, int32(length))
   922  	case DmClob:
   923  		length, _ := v.GetLength()
   924  		str, err := v.getSubString(1, int32(length))
   925  		if err != nil {
   926  			return nil, err
   927  		}
   928  		return Dm_build_1220.Dm_build_1433(str, conn.getServerEncoding(), conn), nil
   929  	default:
   930  		return nil, ECGO_UNSUPPORTED_TYPE.throw()
   931  	}
   932  
   933  }
   934  
   935  func (G2DB g2db) toInt32(val int32) []byte {
   936  	bytes := make([]byte, 4)
   937  	Dm_build_1220.Dm_build_1236(bytes, 0, val)
   938  	return bytes
   939  }
   940  
   941  func (G2DB g2db) toInt64(val int64) []byte {
   942  	bytes := make([]byte, 8)
   943  	Dm_build_1220.Dm_build_1241(bytes, 0, val)
   944  	return bytes
   945  }
   946  
   947  func (G2DB g2db) toFloat32(val float32) []byte {
   948  	bytes := make([]byte, 4)
   949  	Dm_build_1220.Dm_build_1246(bytes, 0, val)
   950  	return bytes
   951  }
   952  
   953  func (G2DB g2db) toFloat64(val float64) []byte {
   954  	bytes := make([]byte, 8)
   955  	Dm_build_1220.Dm_build_1251(bytes, 0, val)
   956  	return bytes
   957  }
   958  
   959  func (G2DB g2db) toDecimal(val string, prec int, scale int) ([]byte, error) {
   960  	d, err := decodeDecimal([]byte(val), prec, scale)
   961  	if err != nil {
   962  		return nil, err
   963  	}
   964  	return d.encodeDecimal()
   965  }
   966  
   967  func (G2DB g2db) fromArray(x *DmArray, param parameter, connection *DmConnection) (interface{}, error) {
   968  	var ret interface{}
   969  	var err error
   970  	switch param.colType {
   971  	case SARRAY:
   972  		ret, err = TypeDataSV.sarrayToBytes(x, param.typeDescriptor)
   973  	case CLASS, ARRAY:
   974  		ret, err = TypeDataSV.arrayToBytes(x, param.typeDescriptor)
   975  	case BLOB:
   976  		ret, err = TypeDataSV.toBytesFromDmArray(x, param.typeDescriptor)
   977  		if err == nil {
   978  			ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
   979  		}
   980  	default:
   981  		err = ECGO_DATA_CONVERTION_ERROR.throw()
   982  	}
   983  	return ret, err
   984  }
   985  
   986  func (G2DB g2db) fromStruct(x *DmStruct, param parameter, connection *DmConnection) (interface{}, error) {
   987  	var ret interface{}
   988  	var err error
   989  	switch param.colType {
   990  	case CLASS:
   991  		ret, err = TypeDataSV.structToBytes(x, param.typeDescriptor)
   992  	case PLTYPE_RECORD:
   993  		ret, err = TypeDataSV.recordToBytes(x, param.typeDescriptor)
   994  	case BLOB:
   995  		ret, err = TypeDataSV.toBytesFromDmStruct(x, param.typeDescriptor)
   996  		if err == nil {
   997  			ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
   998  		}
   999  
  1000  	default:
  1001  		err = ECGO_DATA_CONVERTION_ERROR.throw()
  1002  	}
  1003  	return ret, err
  1004  }
  1005  
  1006  func checkBFileStr(s string) bool {
  1007  	strs := strings.Split(strings.TrimSpace(s), ":")
  1008  	if len(strs) != 2 {
  1009  		return false
  1010  	}
  1011  	if len(strs[0]) > 128 || len(strs[1]) > 256 {
  1012  		return false
  1013  	}
  1014  	return true
  1015  }