github.com/systematiccaos/gorm@v1.22.6/schema/field.go (about) 1 package schema 2 3 import ( 4 "database/sql" 5 "database/sql/driver" 6 "fmt" 7 "reflect" 8 "strconv" 9 "strings" 10 "sync" 11 "time" 12 13 "github.com/jinzhu/now" 14 "github.com/systematiccaos/gorm/utils" 15 ) 16 17 type DataType string 18 19 type TimeType int64 20 21 var TimeReflectType = reflect.TypeOf(time.Time{}) 22 23 const ( 24 UnixTime TimeType = 1 25 UnixSecond TimeType = 2 26 UnixMillisecond TimeType = 3 27 UnixNanosecond TimeType = 4 28 ) 29 30 const ( 31 Bool DataType = "bool" 32 Int DataType = "int" 33 Uint DataType = "uint" 34 Float DataType = "float" 35 String DataType = "string" 36 Time DataType = "time" 37 Bytes DataType = "bytes" 38 ) 39 40 type Field struct { 41 Name string 42 DBName string 43 BindNames []string 44 DataType DataType 45 GORMDataType DataType 46 PrimaryKey bool 47 AutoIncrement bool 48 AutoIncrementIncrement int64 49 Creatable bool 50 Updatable bool 51 Readable bool 52 HasDefaultValue bool 53 AutoCreateTime TimeType 54 AutoUpdateTime TimeType 55 DefaultValue string 56 DefaultValueInterface interface{} 57 NotNull bool 58 Unique bool 59 Comment string 60 Size int 61 Precision int 62 Scale int 63 FieldType reflect.Type 64 IndirectFieldType reflect.Type 65 StructField reflect.StructField 66 Tag reflect.StructTag 67 TagSettings map[string]string 68 Schema *Schema 69 EmbeddedSchema *Schema 70 OwnerSchema *Schema 71 ReflectValueOf func(reflect.Value) reflect.Value 72 ValueOf func(reflect.Value) (value interface{}, zero bool) 73 Set func(reflect.Value, interface{}) error 74 IgnoreMigration bool 75 } 76 77 func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { 78 var err error 79 80 field := &Field{ 81 Name: fieldStruct.Name, 82 BindNames: []string{fieldStruct.Name}, 83 FieldType: fieldStruct.Type, 84 IndirectFieldType: fieldStruct.Type, 85 StructField: fieldStruct, 86 Creatable: true, 87 Updatable: true, 88 Readable: true, 89 Tag: fieldStruct.Tag, 90 TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"), 91 Schema: schema, 92 AutoIncrementIncrement: 1, 93 } 94 95 for field.IndirectFieldType.Kind() == reflect.Ptr { 96 field.IndirectFieldType = field.IndirectFieldType.Elem() 97 } 98 99 fieldValue := reflect.New(field.IndirectFieldType) 100 // if field is valuer, used its value or first fields as data type 101 valuer, isValuer := fieldValue.Interface().(driver.Valuer) 102 if isValuer { 103 if _, ok := fieldValue.Interface().(GormDataTypeInterface); !ok { 104 if v, err := valuer.Value(); reflect.ValueOf(v).IsValid() && err == nil { 105 fieldValue = reflect.ValueOf(v) 106 } 107 108 var getRealFieldValue func(reflect.Value) 109 getRealFieldValue = func(v reflect.Value) { 110 rv := reflect.Indirect(v) 111 if rv.Kind() == reflect.Struct && !rv.Type().ConvertibleTo(TimeReflectType) { 112 for i := 0; i < rv.Type().NumField(); i++ { 113 newFieldType := rv.Type().Field(i).Type 114 for newFieldType.Kind() == reflect.Ptr { 115 newFieldType = newFieldType.Elem() 116 } 117 118 fieldValue = reflect.New(newFieldType) 119 120 if rv.Type() != reflect.Indirect(fieldValue).Type() { 121 getRealFieldValue(fieldValue) 122 } 123 124 if fieldValue.IsValid() { 125 return 126 } 127 128 for key, value := range ParseTagSetting(field.IndirectFieldType.Field(i).Tag.Get("gorm"), ";") { 129 if _, ok := field.TagSettings[key]; !ok { 130 field.TagSettings[key] = value 131 } 132 } 133 } 134 } 135 } 136 137 getRealFieldValue(fieldValue) 138 } 139 } 140 141 if dbName, ok := field.TagSettings["COLUMN"]; ok { 142 field.DBName = dbName 143 } 144 145 if val, ok := field.TagSettings["PRIMARYKEY"]; ok && utils.CheckTruth(val) { 146 field.PrimaryKey = true 147 } else if val, ok := field.TagSettings["PRIMARY_KEY"]; ok && utils.CheckTruth(val) { 148 field.PrimaryKey = true 149 } 150 151 if val, ok := field.TagSettings["AUTOINCREMENT"]; ok && utils.CheckTruth(val) { 152 field.AutoIncrement = true 153 field.HasDefaultValue = true 154 } 155 156 if num, ok := field.TagSettings["AUTOINCREMENTINCREMENT"]; ok { 157 field.AutoIncrementIncrement, _ = strconv.ParseInt(num, 10, 64) 158 } 159 160 if v, ok := field.TagSettings["DEFAULT"]; ok { 161 field.HasDefaultValue = true 162 field.DefaultValue = v 163 } 164 165 if num, ok := field.TagSettings["SIZE"]; ok { 166 if field.Size, err = strconv.Atoi(num); err != nil { 167 field.Size = -1 168 } 169 } 170 171 if p, ok := field.TagSettings["PRECISION"]; ok { 172 field.Precision, _ = strconv.Atoi(p) 173 } 174 175 if s, ok := field.TagSettings["SCALE"]; ok { 176 field.Scale, _ = strconv.Atoi(s) 177 } 178 179 if val, ok := field.TagSettings["NOT NULL"]; ok && utils.CheckTruth(val) { 180 field.NotNull = true 181 } else if val, ok := field.TagSettings["NOTNULL"]; ok && utils.CheckTruth(val) { 182 field.NotNull = true 183 } 184 185 if val, ok := field.TagSettings["UNIQUE"]; ok && utils.CheckTruth(val) { 186 field.Unique = true 187 } 188 189 if val, ok := field.TagSettings["COMMENT"]; ok { 190 field.Comment = val 191 } 192 193 // default value is function or null or blank (primary keys) 194 field.DefaultValue = strings.TrimSpace(field.DefaultValue) 195 skipParseDefaultValue := strings.Contains(field.DefaultValue, "(") && 196 strings.Contains(field.DefaultValue, ")") || strings.ToLower(field.DefaultValue) == "null" || field.DefaultValue == "" 197 switch reflect.Indirect(fieldValue).Kind() { 198 case reflect.Bool: 199 field.DataType = Bool 200 if field.HasDefaultValue && !skipParseDefaultValue { 201 if field.DefaultValueInterface, err = strconv.ParseBool(field.DefaultValue); err != nil { 202 schema.err = fmt.Errorf("failed to parse %s as default value for bool, got error: %v", field.DefaultValue, err) 203 } 204 } 205 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 206 field.DataType = Int 207 if field.HasDefaultValue && !skipParseDefaultValue { 208 if field.DefaultValueInterface, err = strconv.ParseInt(field.DefaultValue, 0, 64); err != nil { 209 schema.err = fmt.Errorf("failed to parse %s as default value for int, got error: %v", field.DefaultValue, err) 210 } 211 } 212 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 213 field.DataType = Uint 214 if field.HasDefaultValue && !skipParseDefaultValue { 215 if field.DefaultValueInterface, err = strconv.ParseUint(field.DefaultValue, 0, 64); err != nil { 216 schema.err = fmt.Errorf("failed to parse %s as default value for uint, got error: %v", field.DefaultValue, err) 217 } 218 } 219 case reflect.Float32, reflect.Float64: 220 field.DataType = Float 221 if field.HasDefaultValue && !skipParseDefaultValue { 222 if field.DefaultValueInterface, err = strconv.ParseFloat(field.DefaultValue, 64); err != nil { 223 schema.err = fmt.Errorf("failed to parse %s as default value for float, got error: %v", field.DefaultValue, err) 224 } 225 } 226 case reflect.String: 227 field.DataType = String 228 229 if field.HasDefaultValue && !skipParseDefaultValue { 230 field.DefaultValue = strings.Trim(field.DefaultValue, "'") 231 field.DefaultValue = strings.Trim(field.DefaultValue, `"`) 232 field.DefaultValueInterface = field.DefaultValue 233 } 234 case reflect.Struct: 235 if _, ok := fieldValue.Interface().(*time.Time); ok { 236 field.DataType = Time 237 } else if fieldValue.Type().ConvertibleTo(TimeReflectType) { 238 field.DataType = Time 239 } else if fieldValue.Type().ConvertibleTo(reflect.TypeOf(&time.Time{})) { 240 field.DataType = Time 241 } 242 case reflect.Array, reflect.Slice: 243 if reflect.Indirect(fieldValue).Type().Elem() == reflect.TypeOf(uint8(0)) { 244 field.DataType = Bytes 245 } 246 } 247 248 field.GORMDataType = field.DataType 249 250 if dataTyper, ok := fieldValue.Interface().(GormDataTypeInterface); ok { 251 field.DataType = DataType(dataTyper.GormDataType()) 252 } 253 254 if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { 255 if field.DataType == Time { 256 field.AutoCreateTime = UnixTime 257 } else if strings.ToUpper(v) == "NANO" { 258 field.AutoCreateTime = UnixNanosecond 259 } else if strings.ToUpper(v) == "MILLI" { 260 field.AutoCreateTime = UnixMillisecond 261 } else { 262 field.AutoCreateTime = UnixSecond 263 } 264 } 265 266 if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { 267 if field.DataType == Time { 268 field.AutoUpdateTime = UnixTime 269 } else if strings.ToUpper(v) == "NANO" { 270 field.AutoUpdateTime = UnixNanosecond 271 } else if strings.ToUpper(v) == "MILLI" { 272 field.AutoUpdateTime = UnixMillisecond 273 } else { 274 field.AutoUpdateTime = UnixSecond 275 } 276 } 277 278 if val, ok := field.TagSettings["TYPE"]; ok { 279 switch DataType(strings.ToLower(val)) { 280 case Bool, Int, Uint, Float, String, Time, Bytes: 281 field.DataType = DataType(strings.ToLower(val)) 282 default: 283 field.DataType = DataType(val) 284 } 285 } 286 287 if field.GORMDataType == "" { 288 field.GORMDataType = field.DataType 289 } 290 291 if field.Size == 0 { 292 switch reflect.Indirect(fieldValue).Kind() { 293 case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64, reflect.Float64: 294 field.Size = 64 295 case reflect.Int8, reflect.Uint8: 296 field.Size = 8 297 case reflect.Int16, reflect.Uint16: 298 field.Size = 16 299 case reflect.Int32, reflect.Uint32, reflect.Float32: 300 field.Size = 32 301 } 302 } 303 304 // setup permission 305 if val, ok := field.TagSettings["-"]; ok { 306 val = strings.ToLower(strings.TrimSpace(val)) 307 switch val { 308 case "-": 309 field.Creatable = false 310 field.Updatable = false 311 field.Readable = false 312 field.DataType = "" 313 case "all": 314 field.Creatable = false 315 field.Updatable = false 316 field.Readable = false 317 field.DataType = "" 318 field.IgnoreMigration = true 319 case "migration": 320 field.IgnoreMigration = true 321 } 322 } 323 324 if v, ok := field.TagSettings["->"]; ok { 325 field.Creatable = false 326 field.Updatable = false 327 if strings.ToLower(v) == "false" { 328 field.Readable = false 329 } else { 330 field.Readable = true 331 } 332 } 333 334 if v, ok := field.TagSettings["<-"]; ok { 335 field.Creatable = true 336 field.Updatable = true 337 338 if v != "<-" { 339 if !strings.Contains(v, "create") { 340 field.Creatable = false 341 } 342 343 if !strings.Contains(v, "update") { 344 field.Updatable = false 345 } 346 } 347 } 348 349 if _, ok := field.TagSettings["EMBEDDED"]; ok || (fieldStruct.Anonymous && !isValuer && (field.Creatable || field.Updatable || field.Readable)) { 350 kind := reflect.Indirect(fieldValue).Kind() 351 switch kind { 352 case reflect.Struct: 353 var err error 354 field.Creatable = false 355 field.Updatable = false 356 field.Readable = false 357 358 cacheStore := &sync.Map{} 359 cacheStore.Store(embeddedCacheKey, true) 360 if field.EmbeddedSchema, err = getOrParse(fieldValue.Interface(), cacheStore, embeddedNamer{Table: schema.Table, Namer: schema.namer}); err != nil { 361 schema.err = err 362 } 363 364 for _, ef := range field.EmbeddedSchema.Fields { 365 ef.Schema = schema 366 ef.OwnerSchema = field.EmbeddedSchema 367 ef.BindNames = append([]string{fieldStruct.Name}, ef.BindNames...) 368 // index is negative means is pointer 369 if field.FieldType.Kind() == reflect.Struct { 370 ef.StructField.Index = append([]int{fieldStruct.Index[0]}, ef.StructField.Index...) 371 } else { 372 ef.StructField.Index = append([]int{-fieldStruct.Index[0] - 1}, ef.StructField.Index...) 373 } 374 375 if prefix, ok := field.TagSettings["EMBEDDEDPREFIX"]; ok && ef.DBName != "" { 376 ef.DBName = prefix + ef.DBName 377 } 378 379 if ef.PrimaryKey { 380 if val, ok := ef.TagSettings["PRIMARYKEY"]; ok && utils.CheckTruth(val) { 381 ef.PrimaryKey = true 382 } else if val, ok := ef.TagSettings["PRIMARY_KEY"]; ok && utils.CheckTruth(val) { 383 ef.PrimaryKey = true 384 } else { 385 ef.PrimaryKey = false 386 387 if val, ok := ef.TagSettings["AUTOINCREMENT"]; !ok || !utils.CheckTruth(val) { 388 ef.AutoIncrement = false 389 } 390 391 if ef.DefaultValue == "" { 392 ef.HasDefaultValue = false 393 } 394 } 395 } 396 397 for k, v := range field.TagSettings { 398 ef.TagSettings[k] = v 399 } 400 } 401 case reflect.Invalid, reflect.Uintptr, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, 402 reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer, reflect.Complex64, reflect.Complex128: 403 schema.err = fmt.Errorf("invalid embedded struct for %s's field %s, should be struct, but got %v", field.Schema.Name, field.Name, field.FieldType) 404 } 405 } 406 407 return field 408 } 409 410 // create valuer, setter when parse struct 411 func (field *Field) setupValuerAndSetter() { 412 // ValueOf 413 switch { 414 case len(field.StructField.Index) == 1: 415 field.ValueOf = func(value reflect.Value) (interface{}, bool) { 416 fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]) 417 return fieldValue.Interface(), fieldValue.IsZero() 418 } 419 case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0: 420 field.ValueOf = func(value reflect.Value) (interface{}, bool) { 421 fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1]) 422 return fieldValue.Interface(), fieldValue.IsZero() 423 } 424 default: 425 field.ValueOf = func(value reflect.Value) (interface{}, bool) { 426 v := reflect.Indirect(value) 427 428 for _, idx := range field.StructField.Index { 429 if idx >= 0 { 430 v = v.Field(idx) 431 } else { 432 v = v.Field(-idx - 1) 433 434 if v.Type().Elem().Kind() != reflect.Struct { 435 return nil, true 436 } 437 438 if !v.IsNil() { 439 v = v.Elem() 440 } else { 441 return nil, true 442 } 443 } 444 } 445 return v.Interface(), v.IsZero() 446 } 447 } 448 449 // ReflectValueOf 450 switch { 451 case len(field.StructField.Index) == 1: 452 field.ReflectValueOf = func(value reflect.Value) reflect.Value { 453 return reflect.Indirect(value).Field(field.StructField.Index[0]) 454 } 455 case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0 && field.FieldType.Kind() != reflect.Ptr: 456 field.ReflectValueOf = func(value reflect.Value) reflect.Value { 457 return reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1]) 458 } 459 default: 460 field.ReflectValueOf = func(value reflect.Value) reflect.Value { 461 v := reflect.Indirect(value) 462 for idx, fieldIdx := range field.StructField.Index { 463 if fieldIdx >= 0 { 464 v = v.Field(fieldIdx) 465 } else { 466 v = v.Field(-fieldIdx - 1) 467 } 468 469 if v.Kind() == reflect.Ptr { 470 if v.Type().Elem().Kind() == reflect.Struct { 471 if v.IsNil() { 472 v.Set(reflect.New(v.Type().Elem())) 473 } 474 } 475 476 if idx < len(field.StructField.Index)-1 { 477 v = v.Elem() 478 } 479 } 480 } 481 return v 482 } 483 } 484 485 fallbackSetter := func(value reflect.Value, v interface{}, setter func(reflect.Value, interface{}) error) (err error) { 486 if v == nil { 487 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 488 } else { 489 reflectV := reflect.ValueOf(v) 490 // Optimal value type acquisition for v 491 reflectValType := reflectV.Type() 492 493 if reflectValType.AssignableTo(field.FieldType) { 494 field.ReflectValueOf(value).Set(reflectV) 495 return 496 } else if reflectValType.ConvertibleTo(field.FieldType) { 497 field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType)) 498 return 499 } else if field.FieldType.Kind() == reflect.Ptr { 500 fieldValue := field.ReflectValueOf(value) 501 fieldType := field.FieldType.Elem() 502 503 if reflectValType.AssignableTo(fieldType) { 504 if !fieldValue.IsValid() { 505 fieldValue = reflect.New(fieldType) 506 } else if fieldValue.IsNil() { 507 fieldValue.Set(reflect.New(fieldType)) 508 } 509 fieldValue.Elem().Set(reflectV) 510 return 511 } else if reflectValType.ConvertibleTo(fieldType) { 512 if fieldValue.IsNil() { 513 fieldValue.Set(reflect.New(fieldType)) 514 } 515 516 fieldValue.Elem().Set(reflectV.Convert(fieldType)) 517 return 518 } 519 } 520 521 if reflectV.Kind() == reflect.Ptr { 522 if reflectV.IsNil() { 523 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 524 } else { 525 err = setter(value, reflectV.Elem().Interface()) 526 } 527 } else if valuer, ok := v.(driver.Valuer); ok { 528 if v, err = valuer.Value(); err == nil { 529 err = setter(value, v) 530 } 531 } else { 532 return fmt.Errorf("failed to set value %+v to field %s", v, field.Name) 533 } 534 } 535 536 return 537 } 538 539 // Set 540 switch field.FieldType.Kind() { 541 case reflect.Bool: 542 field.Set = func(value reflect.Value, v interface{}) error { 543 switch data := v.(type) { 544 case bool: 545 field.ReflectValueOf(value).SetBool(data) 546 case *bool: 547 if data != nil { 548 field.ReflectValueOf(value).SetBool(*data) 549 } else { 550 field.ReflectValueOf(value).SetBool(false) 551 } 552 case int64: 553 if data > 0 { 554 field.ReflectValueOf(value).SetBool(true) 555 } else { 556 field.ReflectValueOf(value).SetBool(false) 557 } 558 case string: 559 b, _ := strconv.ParseBool(data) 560 field.ReflectValueOf(value).SetBool(b) 561 default: 562 return fallbackSetter(value, v, field.Set) 563 } 564 return nil 565 } 566 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 567 field.Set = func(value reflect.Value, v interface{}) (err error) { 568 switch data := v.(type) { 569 case int64: 570 field.ReflectValueOf(value).SetInt(data) 571 case int: 572 field.ReflectValueOf(value).SetInt(int64(data)) 573 case int8: 574 field.ReflectValueOf(value).SetInt(int64(data)) 575 case int16: 576 field.ReflectValueOf(value).SetInt(int64(data)) 577 case int32: 578 field.ReflectValueOf(value).SetInt(int64(data)) 579 case uint: 580 field.ReflectValueOf(value).SetInt(int64(data)) 581 case uint8: 582 field.ReflectValueOf(value).SetInt(int64(data)) 583 case uint16: 584 field.ReflectValueOf(value).SetInt(int64(data)) 585 case uint32: 586 field.ReflectValueOf(value).SetInt(int64(data)) 587 case uint64: 588 field.ReflectValueOf(value).SetInt(int64(data)) 589 case float32: 590 field.ReflectValueOf(value).SetInt(int64(data)) 591 case float64: 592 field.ReflectValueOf(value).SetInt(int64(data)) 593 case []byte: 594 return field.Set(value, string(data)) 595 case string: 596 if i, err := strconv.ParseInt(data, 0, 64); err == nil { 597 field.ReflectValueOf(value).SetInt(i) 598 } else { 599 return err 600 } 601 case time.Time: 602 if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond { 603 field.ReflectValueOf(value).SetInt(data.UnixNano()) 604 } else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond { 605 field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6) 606 } else { 607 field.ReflectValueOf(value).SetInt(data.Unix()) 608 } 609 case *time.Time: 610 if data != nil { 611 if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond { 612 field.ReflectValueOf(value).SetInt(data.UnixNano()) 613 } else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond { 614 field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6) 615 } else { 616 field.ReflectValueOf(value).SetInt(data.Unix()) 617 } 618 } else { 619 field.ReflectValueOf(value).SetInt(0) 620 } 621 default: 622 return fallbackSetter(value, v, field.Set) 623 } 624 return err 625 } 626 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 627 field.Set = func(value reflect.Value, v interface{}) (err error) { 628 switch data := v.(type) { 629 case uint64: 630 field.ReflectValueOf(value).SetUint(data) 631 case uint: 632 field.ReflectValueOf(value).SetUint(uint64(data)) 633 case uint8: 634 field.ReflectValueOf(value).SetUint(uint64(data)) 635 case uint16: 636 field.ReflectValueOf(value).SetUint(uint64(data)) 637 case uint32: 638 field.ReflectValueOf(value).SetUint(uint64(data)) 639 case int64: 640 field.ReflectValueOf(value).SetUint(uint64(data)) 641 case int: 642 field.ReflectValueOf(value).SetUint(uint64(data)) 643 case int8: 644 field.ReflectValueOf(value).SetUint(uint64(data)) 645 case int16: 646 field.ReflectValueOf(value).SetUint(uint64(data)) 647 case int32: 648 field.ReflectValueOf(value).SetUint(uint64(data)) 649 case float32: 650 field.ReflectValueOf(value).SetUint(uint64(data)) 651 case float64: 652 field.ReflectValueOf(value).SetUint(uint64(data)) 653 case []byte: 654 return field.Set(value, string(data)) 655 case time.Time: 656 if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond { 657 field.ReflectValueOf(value).SetUint(uint64(data.UnixNano())) 658 } else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond { 659 field.ReflectValueOf(value).SetUint(uint64(data.UnixNano() / 1e6)) 660 } else { 661 field.ReflectValueOf(value).SetUint(uint64(data.Unix())) 662 } 663 case string: 664 if i, err := strconv.ParseUint(data, 0, 64); err == nil { 665 field.ReflectValueOf(value).SetUint(i) 666 } else { 667 return err 668 } 669 default: 670 return fallbackSetter(value, v, field.Set) 671 } 672 return err 673 } 674 case reflect.Float32, reflect.Float64: 675 field.Set = func(value reflect.Value, v interface{}) (err error) { 676 switch data := v.(type) { 677 case float64: 678 field.ReflectValueOf(value).SetFloat(data) 679 case float32: 680 field.ReflectValueOf(value).SetFloat(float64(data)) 681 case int64: 682 field.ReflectValueOf(value).SetFloat(float64(data)) 683 case int: 684 field.ReflectValueOf(value).SetFloat(float64(data)) 685 case int8: 686 field.ReflectValueOf(value).SetFloat(float64(data)) 687 case int16: 688 field.ReflectValueOf(value).SetFloat(float64(data)) 689 case int32: 690 field.ReflectValueOf(value).SetFloat(float64(data)) 691 case uint: 692 field.ReflectValueOf(value).SetFloat(float64(data)) 693 case uint8: 694 field.ReflectValueOf(value).SetFloat(float64(data)) 695 case uint16: 696 field.ReflectValueOf(value).SetFloat(float64(data)) 697 case uint32: 698 field.ReflectValueOf(value).SetFloat(float64(data)) 699 case uint64: 700 field.ReflectValueOf(value).SetFloat(float64(data)) 701 case []byte: 702 return field.Set(value, string(data)) 703 case string: 704 if i, err := strconv.ParseFloat(data, 64); err == nil { 705 field.ReflectValueOf(value).SetFloat(i) 706 } else { 707 return err 708 } 709 default: 710 return fallbackSetter(value, v, field.Set) 711 } 712 return err 713 } 714 case reflect.String: 715 field.Set = func(value reflect.Value, v interface{}) (err error) { 716 switch data := v.(type) { 717 case string: 718 field.ReflectValueOf(value).SetString(data) 719 case []byte: 720 field.ReflectValueOf(value).SetString(string(data)) 721 case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: 722 field.ReflectValueOf(value).SetString(utils.ToString(data)) 723 case float64, float32: 724 field.ReflectValueOf(value).SetString(fmt.Sprintf("%."+strconv.Itoa(field.Precision)+"f", data)) 725 default: 726 return fallbackSetter(value, v, field.Set) 727 } 728 return err 729 } 730 default: 731 fieldValue := reflect.New(field.FieldType) 732 switch fieldValue.Elem().Interface().(type) { 733 case time.Time: 734 field.Set = func(value reflect.Value, v interface{}) error { 735 switch data := v.(type) { 736 case time.Time: 737 field.ReflectValueOf(value).Set(reflect.ValueOf(v)) 738 case *time.Time: 739 if data != nil { 740 field.ReflectValueOf(value).Set(reflect.ValueOf(data).Elem()) 741 } else { 742 field.ReflectValueOf(value).Set(reflect.ValueOf(time.Time{})) 743 } 744 case string: 745 if t, err := now.Parse(data); err == nil { 746 field.ReflectValueOf(value).Set(reflect.ValueOf(t)) 747 } else { 748 return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err) 749 } 750 default: 751 return fallbackSetter(value, v, field.Set) 752 } 753 return nil 754 } 755 case *time.Time: 756 field.Set = func(value reflect.Value, v interface{}) error { 757 switch data := v.(type) { 758 case time.Time: 759 fieldValue := field.ReflectValueOf(value) 760 if fieldValue.IsNil() { 761 fieldValue.Set(reflect.New(field.FieldType.Elem())) 762 } 763 fieldValue.Elem().Set(reflect.ValueOf(v)) 764 case *time.Time: 765 field.ReflectValueOf(value).Set(reflect.ValueOf(v)) 766 case string: 767 if t, err := now.Parse(data); err == nil { 768 fieldValue := field.ReflectValueOf(value) 769 if fieldValue.IsNil() { 770 if v == "" { 771 return nil 772 } 773 fieldValue.Set(reflect.New(field.FieldType.Elem())) 774 } 775 fieldValue.Elem().Set(reflect.ValueOf(t)) 776 } else { 777 return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err) 778 } 779 default: 780 return fallbackSetter(value, v, field.Set) 781 } 782 return nil 783 } 784 default: 785 if _, ok := fieldValue.Elem().Interface().(sql.Scanner); ok { 786 // pointer scanner 787 field.Set = func(value reflect.Value, v interface{}) (err error) { 788 reflectV := reflect.ValueOf(v) 789 if !reflectV.IsValid() { 790 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 791 } else if reflectV.Type().AssignableTo(field.FieldType) { 792 field.ReflectValueOf(value).Set(reflectV) 793 } else if reflectV.Kind() == reflect.Ptr { 794 if reflectV.IsNil() || !reflectV.IsValid() { 795 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 796 } else { 797 return field.Set(value, reflectV.Elem().Interface()) 798 } 799 } else { 800 fieldValue := field.ReflectValueOf(value) 801 if fieldValue.IsNil() { 802 fieldValue.Set(reflect.New(field.FieldType.Elem())) 803 } 804 805 if valuer, ok := v.(driver.Valuer); ok { 806 v, _ = valuer.Value() 807 } 808 809 err = fieldValue.Interface().(sql.Scanner).Scan(v) 810 } 811 return 812 } 813 } else if _, ok := fieldValue.Interface().(sql.Scanner); ok { 814 // struct scanner 815 field.Set = func(value reflect.Value, v interface{}) (err error) { 816 reflectV := reflect.ValueOf(v) 817 if !reflectV.IsValid() { 818 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 819 } else if reflectV.Type().AssignableTo(field.FieldType) { 820 field.ReflectValueOf(value).Set(reflectV) 821 } else if reflectV.Kind() == reflect.Ptr { 822 if reflectV.IsNil() || !reflectV.IsValid() { 823 field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) 824 } else { 825 return field.Set(value, reflectV.Elem().Interface()) 826 } 827 } else { 828 if valuer, ok := v.(driver.Valuer); ok { 829 v, _ = valuer.Value() 830 } 831 832 err = field.ReflectValueOf(value).Addr().Interface().(sql.Scanner).Scan(v) 833 } 834 return 835 } 836 } else { 837 field.Set = func(value reflect.Value, v interface{}) (err error) { 838 return fallbackSetter(value, v, field.Set) 839 } 840 } 841 } 842 } 843 }