mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 19:36:44 +01:00
Update SQL schemas
This commit is contained in:
40
db/utils.go
40
db/utils.go
@@ -13,6 +13,7 @@ import (
|
||||
// InitMeddler registers tags to be used to read/write from SQL DBs using meddler
|
||||
func InitMeddler() {
|
||||
meddler.Register("bigint", BigIntMeddler{})
|
||||
meddler.Register("bigintnull", BigIntNullMeddler{})
|
||||
}
|
||||
|
||||
// BulkInsert performs a bulk insert with a single statement into the specified table. Example:
|
||||
@@ -76,3 +77,42 @@ func (b BigIntMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, er
|
||||
|
||||
return str, nil
|
||||
}
|
||||
|
||||
// BigIntNullMeddler encodes or decodes the field value to or from JSON
|
||||
type BigIntNullMeddler struct{}
|
||||
|
||||
// PreRead is called before a Scan operation for fields that have the BigIntNullMeddler
|
||||
func (b BigIntNullMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{}, err error) {
|
||||
return &fieldAddr, nil
|
||||
}
|
||||
|
||||
// PostRead is called after a Scan operation for fields that have the BigIntNullMeddler
|
||||
func (b BigIntNullMeddler) PostRead(fieldPtr, scanTarget interface{}) error {
|
||||
sv := reflect.ValueOf(scanTarget)
|
||||
if sv.Elem().IsNil() {
|
||||
// null column, so set target to be zero value
|
||||
fv := reflect.ValueOf(fieldPtr)
|
||||
fv.Elem().Set(reflect.Zero(fv.Elem().Type()))
|
||||
return nil
|
||||
}
|
||||
// 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)
|
||||
}
|
||||
field := fieldPtr.(**big.Int)
|
||||
*field = new(big.Int).SetBytes(data)
|
||||
return nil
|
||||
}
|
||||
|
||||
// PreWrite is called before an Insert or Update operation for fields that have the BigIntNullMeddler
|
||||
func (b BigIntNullMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, err error) {
|
||||
field := fieldPtr.(*big.Int)
|
||||
if field == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return base64.StdEncoding.EncodeToString(field.Bytes()), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user