field.go 25 KB

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