@ -1,7 +1,6 @@
package db
package db
import (
import (
"encoding/base64"
"fmt"
"fmt"
"math/big"
"math/big"
"reflect"
"reflect"
@ -95,14 +94,8 @@ func (b BigIntMeddler) PostRead(fieldPtr, scanTarget interface{}) error {
if ptr == nil {
if ptr == nil {
return fmt . Errorf ( "BigIntMeddler.PostRead: nil pointer" )
return fmt . Errorf ( "BigIntMeddler.PostRead: nil pointer" )
}
}
data , err := base64 . StdEncoding . DecodeString ( * ptr )
if err != nil {
return fmt . Errorf ( "big.Int decode error: %v" , err )
}
field := fieldPtr . ( * * big . Int )
field := fieldPtr . ( * * big . Int )
* field = new ( big . Int ) . SetBytes ( data )
* field = new ( big . Int ) . SetBytes ( [ ] byte ( * ptr ) )
return nil
return nil
}
}
@ -110,9 +103,7 @@ func (b BigIntMeddler) PostRead(fieldPtr, scanTarget interface{}) error {
func ( b BigIntMeddler ) PreWrite ( fieldPtr interface { } ) ( saveValue interface { } , err error ) {
func ( b BigIntMeddler ) PreWrite ( fieldPtr interface { } ) ( saveValue interface { } , err error ) {
field := fieldPtr . ( * big . Int )
field := fieldPtr . ( * big . Int )
str := base64 . StdEncoding . EncodeToString ( field . Bytes ( ) )
return str , nil
return field . Bytes ( ) , nil
}
}
// BigIntNullMeddler encodes or decodes the field value to or from JSON
// BigIntNullMeddler encodes or decodes the field value to or from JSON
@ -125,23 +116,19 @@ func (b BigIntNullMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{
// PostRead is called after a Scan operation for fields that have the BigIntNullMeddler
// PostRead is called after a Scan operation for fields that have the BigIntNullMeddler
func ( b BigIntNullMeddler ) PostRead ( fieldPtr , scanTarget interface { } ) error {
func ( b BigIntNullMeddler ) PostRead ( fieldPtr , scanTarget interface { } ) error {
sv := reflect . ValueOf ( scanTarget )
if sv . Elem ( ) . IsNil ( ) {
field := fieldPtr . ( * * big . Int )
ptrPtr := scanTarget . ( * interface { } )
if * ptrPtr == nil {
// null column, so set target to be zero value
// null column, so set target to be zero value
fv := reflect . ValueOf ( fieldPtr )
fv . Elem ( ) . Set ( reflect . Zero ( fv . Elem ( ) . Type ( ) ) )
* field = nil
return nil
return nil
}
}
// not null
// not null
encoded := new ( [ ] byte )
refEnc := reflect . ValueOf ( encoded )
refEnc . Elem ( ) . Set ( sv . Elem ( ) . Elem ( ) )
data , err := base64 . StdEncoding . DecodeString ( string ( * encoded ) )
if err != nil {
return fmt . Errorf ( "big.Int decode error: %v" , err )
ptr := ( * ptrPtr ) . ( [ ] byte )
if ptr == nil {
return fmt . Errorf ( "BigIntMeddler.PostRead: nil pointer" )
}
}
field := fieldPtr . ( * * big . Int )
* field = new ( big . Int ) . SetBytes ( data )
* field = new ( big . Int ) . SetBytes ( ptr )
return nil
return nil
}
}
@ -151,7 +138,7 @@ func (b BigIntNullMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}
if field == nil {
if field == nil {
return nil , nil
return nil , nil
}
}
return base64 . StdEncoding . EncodeToString ( field . Bytes ( ) ) , nil
return field . Bytes ( ) , nil
}
}
// SliceToSlicePtrs converts any []Foo to []*Foo
// SliceToSlicePtrs converts any []Foo to []*Foo