diff options
author | Meng-Ying Yang <garfield@dexon.org> | 2018-12-25 16:51:08 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 13:49:59 +0800 |
commit | 8be317885f3cbd2acf35173e4b1a473eb3f058d6 (patch) | |
tree | 41564d2de3b801bdc468f0cd79f772975a447f03 /common/big.go | |
parent | c567bf15df92e0c1188ebfc9ff09ca0cb057b67a (diff) | |
download | dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar.gz dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar.bz2 dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar.lz dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar.xz dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.tar.zst dexon-8be317885f3cbd2acf35173e4b1a473eb3f058d6.zip |
core: add database/sql support for more types (#102)
* core: types: add database/sql support for BlockNonce
* common: add database/sql support with Big
New Big type is declared to let big.Int support database/sql by
implementing Scan() and Value() on new type.
Diffstat (limited to 'common/big.go')
-rw-r--r-- | common/big.go | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/common/big.go b/common/big.go index 65d4377bf..dcc5269a7 100644 --- a/common/big.go +++ b/common/big.go @@ -16,7 +16,11 @@ package common -import "math/big" +import ( + "database/sql/driver" + "fmt" + "math/big" +) // Common big integers often used var ( @@ -28,3 +32,34 @@ var ( Big256 = big.NewInt(256) Big257 = big.NewInt(257) ) + +// Big support database/sql Scan and Value. +type Big big.Int + +// Scan implements Scanner for database/sql. +func (b *Big) Scan(src interface{}) error { + newB := new(big.Int) + switch t := src.(type) { + case int64: + *b = Big(*newB.SetInt64(t)) + case uint64: + *b = Big(*newB.SetUint64(t)) + case []byte: + *b = Big(*newB.SetBytes(t)) + case string: + v, ok := newB.SetString(t, 10) + if !ok { + return fmt.Errorf("invalid string format %v", src) + } + *b = Big(*v) + default: + return fmt.Errorf("can't scan %T into Big", src) + } + return nil +} + +// Value implements valuer for database/sql. +func (b Big) Value() (driver.Value, error) { + b2 := big.Int(b) + return (&b2).String(), nil +} |