Improve code

This commit is contained in:
Lunny Xiao 2020-02-27 09:50:01 +08:00
parent 02c8a4b25d
commit dcee43899e
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
8 changed files with 54 additions and 62 deletions

View File

@ -24,6 +24,7 @@ import (
"xorm.io/xorm/caches"
"xorm.io/xorm/core"
"xorm.io/xorm/dialects"
"xorm.io/xorm/internal/utils"
"xorm.io/xorm/log"
"xorm.io/xorm/names"
"xorm.io/xorm/schemas"
@ -80,7 +81,7 @@ func (engine *Engine) CondDeleted(col *schemas.Column) builder.Cond {
} else {
// FIXME: mssql: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.
if engine.dialect.DBType() != schemas.MSSQL {
cond = builder.Eq{col.Name: zeroTime1}
cond = builder.Eq{col.Name: utils.ZeroTime1}
}
}

View File

@ -11,6 +11,7 @@ import (
"sort"
"strconv"
"strings"
"time"
)
// str2PK convert string value to primary key value according to tp
@ -200,3 +201,7 @@ func sliceEq(left, right []string) bool {
func indexName(tableName, idxName string) string {
return fmt.Sprintf("IDX_%v_%v", tableName, idxName)
}
func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04:05")
}

View File

@ -1,21 +0,0 @@
// Copyright 2017 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 xorm
import "time"
const (
zeroTime0 = "0000-00-00 00:00:00"
zeroTime1 = "0001-01-01 00:00:00"
)
func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04:05")
}
func isTimeZero(t time.Time) bool {
return t.IsZero() || formatTime(t) == zeroTime0 ||
formatTime(t) == zeroTime1
}

View File

@ -7,6 +7,7 @@ package xorm
import (
"context"
"database/sql"
"encoding/json"
"reflect"
"time"
@ -122,3 +123,27 @@ var (
_ EngineInterface = &Engine{}
_ EngineInterface = &EngineGroup{}
)
// JSONInterface represents an interface to handle json data
type JSONInterface interface {
Marshal(v interface{}) ([]byte, error)
Unmarshal(data []byte, v interface{}) error
}
var (
// DefaultJSONHandler default json handler
DefaultJSONHandler JSONInterface = StdJSON{}
)
// StdJSON implements JSONInterface via encoding/json
type StdJSON struct{}
// Marshal implements JSONInterface
func (StdJSON) Marshal(v interface{}) ([]byte, error) {
return json.Marshal(v)
}
// Unmarshal implements JSONInterface
func (StdJSON) Unmarshal(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}

View File

@ -6,6 +6,7 @@ package utils
import (
"reflect"
"time"
)
type Zeroable interface {
@ -96,3 +97,13 @@ func IsArrayZero(v reflect.Value) bool {
return true
}
const (
ZeroTime0 = "0000-00-00 00:00:00"
ZeroTime1 = "0001-01-01 00:00:00"
)
func IsTimeZero(t time.Time) bool {
return t.IsZero() || t.Format("2006-01-02 15:04:05") == ZeroTime0 ||
t.Format("2006-01-02 15:04:05") == ZeroTime1
}

31
json.go
View File

@ -1,31 +0,0 @@
// 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 xorm
import "encoding/json"
// JSONInterface represents an interface to handle json data
type JSONInterface interface {
Marshal(v interface{}) ([]byte, error)
Unmarshal(data []byte, v interface{}) error
}
var (
// DefaultJSONHandler default json handler
DefaultJSONHandler JSONInterface = StdJSON{}
)
// StdJSON implements JSONInterface via encoding/json
type StdJSON struct{}
// Marshal implements JSONInterface
func (StdJSON) Marshal(v interface{}) ([]byte, error) {
return json.Marshal(v)
}
// Unmarshal implements JSONInterface
func (StdJSON) Unmarshal(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}

View File

@ -14,6 +14,7 @@ import (
"strings"
"time"
"xorm.io/xorm/internal/utils"
"xorm.io/xorm/schemas"
)
@ -27,7 +28,7 @@ func (session *Session) str2Time(col *schemas.Column, data string) (outTime time
parseLoc = col.TimeZone
}
if sdata == zeroTime0 || sdata == zeroTime1 {
if sdata == utils.ZeroTime0 || sdata == utils.ZeroTime1 {
} else if !strings.ContainsAny(sdata, "- :") { // !nashtsai! has only found that mymysql driver is using this for time type column
// time stamp
sd, err := strconv.ParseInt(sdata, 10, 64)

View File

@ -11,6 +11,7 @@ import (
"time"
"github.com/stretchr/testify/assert"
"xorm.io/xorm/internal/utils"
)
func TestTimeUserTime(t *testing.T) {
@ -282,7 +283,7 @@ func TestTimeUserDeleted(t *testing.T) {
assert.EqualValues(t, formatTime(user.CreatedAt), formatTime(user2.CreatedAt))
assert.EqualValues(t, user.UpdatedAt.Unix(), user2.UpdatedAt.Unix())
assert.EqualValues(t, formatTime(user.UpdatedAt), formatTime(user2.UpdatedAt))
assert.True(t, isTimeZero(user2.DeletedAt))
assert.True(t, utils.IsTimeZero(user2.DeletedAt))
fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt)
fmt.Println("user2 str", user2.CreatedAtStr, user2.UpdatedAtStr)
@ -290,7 +291,7 @@ func TestTimeUserDeleted(t *testing.T) {
cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
assert.True(t, !isTimeZero(user3.DeletedAt))
assert.True(t, !utils.IsTimeZero(user3.DeletedAt))
var user4 UserDeleted
has, err = testEngine.Unscoped().Get(&user4)
@ -336,14 +337,14 @@ func TestTimeUserDeletedDiffLoc(t *testing.T) {
assert.EqualValues(t, formatTime(user.CreatedAt), formatTime(user2.CreatedAt))
assert.EqualValues(t, user.UpdatedAt.Unix(), user2.UpdatedAt.Unix())
assert.EqualValues(t, formatTime(user.UpdatedAt), formatTime(user2.UpdatedAt))
assert.True(t, isTimeZero(user2.DeletedAt))
assert.True(t, utils.IsTimeZero(user2.DeletedAt))
fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt)
var user3 UserDeleted2
cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
assert.True(t, !isTimeZero(user3.DeletedAt))
assert.True(t, !utils.IsTimeZero(user3.DeletedAt))
var user4 UserDeleted2
has, err = testEngine.Unscoped().Get(&user4)
@ -407,14 +408,14 @@ func TestCustomTimeUserDeleted(t *testing.T) {
assert.EqualValues(t, formatTime(time.Time(user.CreatedAt)), formatTime(time.Time(user2.CreatedAt)))
assert.EqualValues(t, user.UpdatedAt.Unix(), user2.UpdatedAt.Unix())
assert.EqualValues(t, formatTime(time.Time(user.UpdatedAt)), formatTime(time.Time(user2.UpdatedAt)))
assert.True(t, isTimeZero(time.Time(user2.DeletedAt)))
assert.True(t, utils.IsTimeZero(time.Time(user2.DeletedAt)))
fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt)
var user3 UserDeleted3
cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
assert.True(t, !isTimeZero(time.Time(user3.DeletedAt)))
assert.True(t, !utils.IsTimeZero(time.Time(user3.DeletedAt)))
var user4 UserDeleted3
has, err = testEngine.Unscoped().Get(&user4)
@ -460,14 +461,14 @@ func TestCustomTimeUserDeletedDiffLoc(t *testing.T) {
assert.EqualValues(t, formatTime(time.Time(user.CreatedAt)), formatTime(time.Time(user2.CreatedAt)))
assert.EqualValues(t, user.UpdatedAt.Unix(), user2.UpdatedAt.Unix())
assert.EqualValues(t, formatTime(time.Time(user.UpdatedAt)), formatTime(time.Time(user2.UpdatedAt)))
assert.True(t, isTimeZero(time.Time(user2.DeletedAt)))
assert.True(t, utils.IsTimeZero(time.Time(user2.DeletedAt)))
fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt, user2.DeletedAt)
var user3 UserDeleted4
cnt, err = testEngine.Where("id = ?", "lunny").Delete(&user3)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
assert.True(t, !isTimeZero(time.Time(user3.DeletedAt)))
assert.True(t, !utils.IsTimeZero(time.Time(user3.DeletedAt)))
var user4 UserDeleted4
has, err = testEngine.Unscoped().Get(&user4)