|
@@ -0,0 +1,111 @@
|
|
|
+package orm
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "math/rand"
|
|
|
+ "reflect"
|
|
|
+ "strings"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type tbl struct {
|
|
|
+ rt reflect.Type
|
|
|
+ rv reflect.Value
|
|
|
+ lock *sync.RWMutex
|
|
|
+ name string
|
|
|
+ tFn MapperFn
|
|
|
+ fFn MapperFn
|
|
|
+ f fields
|
|
|
+ rel relations
|
|
|
+ mapped bool
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) GetName() string {
|
|
|
+ t.ReadLock()
|
|
|
+ defer t.Unlock()
|
|
|
+ return t.getName()
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) getName() string {
|
|
|
+ return t.getType().Name()
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) GetTableName() string {
|
|
|
+ t.ReadLock()
|
|
|
+ defer t.Unlock()
|
|
|
+ return t.getTable()
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) getTable() string {
|
|
|
+ if len(t.name) == 0 {
|
|
|
+ t.name = t.tFn(t.getType().Name())
|
|
|
+ }
|
|
|
+ return t.name
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) String() string {
|
|
|
+ return fmt.Sprintf("%s (`%s`):%s",
|
|
|
+ t.getName(), t.getTable(),
|
|
|
+ func() string {
|
|
|
+ s := strings.Split(t.f.String(), ",")
|
|
|
+ if len(s) <= 1 {
|
|
|
+ return " " + t.f.String()
|
|
|
+ }
|
|
|
+
|
|
|
+ return "\n\t" + strings.Join(s, ",\n\t")
|
|
|
+ }(),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) add(r reflect.StructField) {
|
|
|
+ switch r.Type.Kind() {
|
|
|
+ case reflect.Ptr:
|
|
|
+ fmt.Println("Ptr", r)
|
|
|
+ case reflect.Map:
|
|
|
+ fmt.Println("Map", r)
|
|
|
+ case reflect.Struct:
|
|
|
+ fmt.Println("Struct", r)
|
|
|
+ default:
|
|
|
+ t.f = append(t.f, field{r.Name, t.fFn(r.Name), r.Type.Kind()})
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) getType() reflect.Type {
|
|
|
+ return t.rt
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) getValue() reflect.Value {
|
|
|
+ return t.rv
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) isMapped() bool {
|
|
|
+ return t.mapped
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) ReadLock() *tbl {
|
|
|
+ t.lock.RLock()
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) WriteLock() *tbl {
|
|
|
+ if t.mapped {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ t.lock.Lock()
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) Unlock() {
|
|
|
+ if !t.mapped {
|
|
|
+ t.mapped = true
|
|
|
+ t.lock.Unlock()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ t.lock.RUnlock()
|
|
|
+}
|
|
|
+
|
|
|
+func (t *tbl) randomWork(wg *sync.WaitGroup) *tbl {
|
|
|
+ time.Sleep((time.Duration)(rand.Intn(100)*rand.Intn(100)) * time.Millisecond)
|
|
|
+ return t
|
|
|
+}
|