// Copyright 2019 The Xorm Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package core import ( "database/sql/driver" "fmt" "time" ) type NullTime time.Time var ( _ driver.Valuer = NullTime{} ) func (ns *NullTime) Scan(value interface{}) error { if value == nil { return nil } return convertTime(ns, value) } // Value implements the driver Valuer interface. func (ns NullTime) Value() (driver.Value, error) { if (time.Time)(ns).IsZero() { return nil, nil } return (time.Time)(ns).Format("2006-01-02 15:04:05"), nil } func convertTime(dest *NullTime, src interface{}) error { // Common cases, without reflect. switch s := src.(type) { case string: t, err := time.Parse("2006-01-02 15:04:05", s) if err != nil { return err } *dest = NullTime(t) return nil case []uint8: t, err := time.Parse("2006-01-02 15:04:05", string(s)) if err != nil { return err } *dest = NullTime(t) return nil case time.Time: *dest = NullTime(s) return nil case nil: default: return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest) } return nil } type EmptyScanner struct { } func (EmptyScanner) Scan(src interface{}) error { return nil }