feat(database/gdb): add time field type for value converting for/from field (#3712)

This commit is contained in:
CyJaySong
2024-09-10 17:51:22 +08:00
committed by GitHub
parent baea1c7a7a
commit bb9a3b83eb
8 changed files with 84 additions and 31 deletions

View File

@ -446,6 +446,7 @@ type LocalType string
const (
LocalTypeUndefined LocalType = ""
LocalTypeString LocalType = "string"
LocalTypeTime LocalType = "time"
LocalTypeDate LocalType = "date"
LocalTypeDatetime LocalType = "datetime"
LocalTypeInt LocalType = "int"
@ -492,6 +493,7 @@ const (
fieldTypeBool = "bool"
fieldTypeBit = "bit"
fieldTypeDate = "date"
fieldTypeTime = "time"
fieldTypeDatetime = "datetime"
fieldTypeTimestamp = "timestamp"
fieldTypeTimestampz = "timestamptz"

View File

@ -83,6 +83,10 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
err error
convertedValue = fieldValue
)
switch fieldValue.(type) {
case time.Time, *time.Time, gtime.Time, *gtime.Time:
goto Default
}
// If `value` implements interface `driver.Valuer`, it then uses the interface for value converting.
if valuer, ok := fieldValue.(driver.Valuer); ok {
if convertedValue, err = valuer.Value(); err != nil {
@ -90,6 +94,7 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
}
return convertedValue, nil
}
Default:
// Default value converting.
var (
rvValue = reflect.ValueOf(fieldValue)
@ -100,6 +105,9 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
rvKind = rvValue.Kind()
}
switch rvKind {
case reflect.Invalid:
convertedValue = nil
case reflect.Slice, reflect.Array, reflect.Map:
// It should ignore the bytes type.
if _, ok := fieldValue.([]byte); !ok {
@ -109,7 +117,6 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
return nil, err
}
}
case reflect.Struct:
switch r := fieldValue.(type) {
// If the time is zero, it then updates it to nil,
@ -117,11 +124,28 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
case time.Time:
if r.IsZero() {
convertedValue = nil
} else if fieldType == fieldTypeDate {
convertedValue = r.Format("2006-01-02")
} else if fieldType == fieldTypeTime {
convertedValue = r.Format("15:04:05")
}
case *time.Time:
if r == nil {
// Nothing to do.
} else if fieldType == fieldTypeDate {
convertedValue = r.Format("2006-01-02")
} else if fieldType == fieldTypeTime {
convertedValue = r.Format("15:04:05")
}
case gtime.Time:
if r.IsZero() {
convertedValue = nil
} else if fieldType == fieldTypeDate {
convertedValue = r.Layout("2006-01-02")
} else if fieldType == fieldTypeTime {
convertedValue = r.Layout("15:04:05")
} else {
convertedValue = r.Time
}
@ -129,13 +153,14 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
case *gtime.Time:
if r.IsZero() {
convertedValue = nil
} else if fieldType == fieldTypeDate {
convertedValue = r.Layout("2006-01-02")
} else if fieldType == fieldTypeTime {
convertedValue = r.Layout("15:04:05")
} else {
convertedValue = r.Time
}
case *time.Time:
// Nothing to do.
case Counter, *Counter:
// Nothing to do.
@ -157,6 +182,7 @@ func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, field
}
}
}
return convertedValue, nil
}
@ -247,6 +273,10 @@ func (c *Core) CheckLocalTypeForField(ctx context.Context, fieldType string, fie
fieldTypeDate:
return LocalTypeDate, nil
case
fieldTypeTime:
return LocalTypeTime, nil
case
fieldTypeDatetime,
fieldTypeTimestamp,
@ -353,13 +383,19 @@ func (c *Core) ConvertValueForLocal(
return gconv.Bool(fieldValue), nil
case LocalTypeDate:
// Date without time.
if t, ok := fieldValue.(time.Time); ok {
return gtime.NewFromTime(t).Format("Y-m-d"), nil
}
t, _ := gtime.StrToTime(gconv.String(fieldValue))
return t.Format("Y-m-d"), nil
case LocalTypeTime:
if t, ok := fieldValue.(time.Time); ok {
return gtime.NewFromTime(t).Format("H:i:s"), nil
}
t, _ := gtime.StrToTime(gconv.String(fieldValue))
return t.Format("H:i:s"), nil
case LocalTypeDatetime:
if t, ok := fieldValue.(time.Time); ok {
return gtime.NewFromTime(t), nil

View File

@ -339,7 +339,7 @@ func (m *softTimeMaintainer) getConditionByFieldNameAndTypeForSoftDeleting(
switch m.softTimeOption.SoftTimeType {
case SoftTimeTypeAuto:
switch fieldType {
case LocalTypeDate, LocalTypeDatetime:
case LocalTypeDate, LocalTypeTime, LocalTypeDatetime:
return fmt.Sprintf(`%s IS NULL`, quotedFieldName)
case LocalTypeInt, LocalTypeUint, LocalTypeInt64, LocalTypeUint64, LocalTypeBool:
return fmt.Sprintf(`%s=0`, quotedFieldName)
@ -368,7 +368,7 @@ func (m *softTimeMaintainer) GetValueByFieldTypeForCreateOrUpdate(
var value any
if isDeletedField {
switch fieldType {
case LocalTypeDate, LocalTypeDatetime:
case LocalTypeDate, LocalTypeTime, LocalTypeDatetime:
value = nil
default:
value = 0
@ -378,7 +378,7 @@ func (m *softTimeMaintainer) GetValueByFieldTypeForCreateOrUpdate(
switch m.softTimeOption.SoftTimeType {
case SoftTimeTypeAuto:
switch fieldType {
case LocalTypeDate, LocalTypeDatetime:
case LocalTypeDate, LocalTypeTime, LocalTypeDatetime:
value = gtime.Now()
case LocalTypeInt, LocalTypeUint, LocalTypeInt64, LocalTypeUint64:
value = gtime.Timestamp()