field.go 26 KB

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