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

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