field.go 32 KB

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