table.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package orm
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "reflect"
  6. "strings"
  7. "sync"
  8. "time"
  9. )
  10. type tbl struct {
  11. rt reflect.Type
  12. rv reflect.Value
  13. lock *sync.RWMutex
  14. name string
  15. tFn MapperFn
  16. fFn MapperFn
  17. f fields
  18. rel relations
  19. mapped bool
  20. }
  21. func (t *tbl) GetName() string {
  22. t.ReadLock()
  23. defer t.Unlock()
  24. return t.getName()
  25. }
  26. func (t *tbl) getName() string {
  27. return t.getType().Name()
  28. }
  29. func (t *tbl) GetTableName() string {
  30. t.ReadLock()
  31. defer t.Unlock()
  32. return t.getTable()
  33. }
  34. func (t *tbl) getTable() string {
  35. if len(t.name) == 0 {
  36. t.name = t.tFn(t.getType().Name())
  37. }
  38. return t.name
  39. }
  40. func (t *tbl) String() string {
  41. return fmt.Sprintf("%s (`%s`):%s",
  42. t.getName(), t.getTable(),
  43. func() string {
  44. s := strings.Split(t.f.String(), ",")
  45. if len(s) <= 1 {
  46. return " " + t.f.String()
  47. }
  48. return "\n\t" + strings.Join(s, ",\n\t")
  49. }(),
  50. )
  51. }
  52. func (t *tbl) add(r reflect.StructField) {
  53. switch r.Type.Kind() {
  54. case reflect.Ptr:
  55. fmt.Println("Ptr", r)
  56. case reflect.Map:
  57. fmt.Println("Map", r)
  58. case reflect.Struct:
  59. fmt.Println("Struct", r)
  60. default:
  61. t.f = append(t.f, field{r.Name, t.fFn(r.Name), r.Type.Kind()})
  62. }
  63. }
  64. func (t *tbl) getType() reflect.Type {
  65. return t.rt
  66. }
  67. func (t *tbl) getValue() reflect.Value {
  68. return t.rv
  69. }
  70. func (t *tbl) isMapped() bool {
  71. return t.mapped
  72. }
  73. func (t *tbl) ReadLock() *tbl {
  74. t.lock.RLock()
  75. return t
  76. }
  77. func (t *tbl) WriteLock() *tbl {
  78. if t.mapped {
  79. return nil
  80. }
  81. t.lock.Lock()
  82. return t
  83. }
  84. func (t *tbl) Unlock() {
  85. if !t.mapped {
  86. t.mapped = true
  87. t.lock.Unlock()
  88. return
  89. }
  90. t.lock.RUnlock()
  91. }
  92. func (t *tbl) randomWork(wg *sync.WaitGroup) *tbl {
  93. time.Sleep((time.Duration)(rand.Intn(100)*rand.Intn(100)) * time.Millisecond)
  94. return t
  95. }