package sqlmock import ( "database/sql/driver" "fmt" "strconv" "time" ) type NullTime struct { Time time.Time Valid bool // Valid is true if Time is not NULL } type NullInt struct { Integer int Valid bool } // Satisfy sql.Scanner interface func (ni *NullInt) Scan(value interface{}) (err error) { if value == nil { ni.Integer, ni.Valid = 0, false return } switch v := value.(type) { case int, int8, int16, int32, int64: ni.Integer, ni.Valid = v.(int), true return case []byte: ni.Integer, err = strconv.Atoi(string(v)) ni.Valid = (err == nil) return case string: ni.Integer, err = strconv.Atoi(v) ni.Valid = (err == nil) return } ni.Valid = false return fmt.Errorf("Can't convert %T to integer", value) } // Satisfy sql.Valuer interface. func (ni NullInt) Value() (driver.Value, error) { if !ni.Valid { return nil, nil } return ni.Integer, nil } // Satisfy sql.Scanner interface func (nt *NullTime) Scan(value interface{}) (err error) { if value == nil { nt.Time, nt.Valid = time.Time{}, false return } switch v := value.(type) { case time.Time: nt.Time, nt.Valid = v, true return } nt.Valid = false return fmt.Errorf("Can't convert %T to time.Time", value) } // Satisfy sql.Valuer interface. func (nt NullTime) Value() (driver.Value, error) { if !nt.Valid { return nil, nil } return nt.Time, nil }