You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

table_name.go 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2020 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package names
  5. import (
  6. "reflect"
  7. "sync"
  8. )
  9. // TableName table name interface to define customerize table name
  10. type TableName interface {
  11. TableName() string
  12. }
  13. var (
  14. tpTableName = reflect.TypeOf((*TableName)(nil)).Elem()
  15. tvCache sync.Map
  16. )
  17. func GetTableName(mapper Mapper, v reflect.Value) string {
  18. if v.Type().Implements(tpTableName) {
  19. return v.Interface().(TableName).TableName()
  20. }
  21. if v.Kind() == reflect.Ptr {
  22. v = v.Elem()
  23. if v.Type().Implements(tpTableName) {
  24. return v.Interface().(TableName).TableName()
  25. }
  26. } else if v.CanAddr() {
  27. v1 := v.Addr()
  28. if v1.Type().Implements(tpTableName) {
  29. return v1.Interface().(TableName).TableName()
  30. }
  31. } else {
  32. name, ok := tvCache.Load(v.Type())
  33. if ok {
  34. if name.(string) != "" {
  35. return name.(string)
  36. }
  37. } else {
  38. v2 := reflect.New(v.Type())
  39. if v2.Type().Implements(tpTableName) {
  40. tableName := v2.Interface().(TableName).TableName()
  41. tvCache.Store(v.Type(), tableName)
  42. return tableName
  43. }
  44. tvCache.Store(v.Type(), "")
  45. }
  46. }
  47. return mapper.Obj2Table(v.Type().Name())
  48. }