| 
					
				 | 
			
			
				@@ -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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |