field.go 25 KB

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