39 lines
555 B
Go
39 lines
555 B
Go
package orm
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"sync"
|
|
)
|
|
|
|
var Tables = newTables()
|
|
|
|
type tables struct {
|
|
mu sync.RWMutex
|
|
tables map[reflect.Type]*Table
|
|
}
|
|
|
|
func newTables() *tables {
|
|
return &tables{
|
|
tables: make(map[reflect.Type]*Table),
|
|
}
|
|
}
|
|
|
|
func (t *tables) Get(typ reflect.Type) *Table {
|
|
if typ.Kind() != reflect.Struct {
|
|
panic(fmt.Errorf("got %s, wanted %s", typ.Kind(), reflect.Struct))
|
|
}
|
|
|
|
t.mu.RLock()
|
|
table, ok := t.tables[typ]
|
|
t.mu.RUnlock()
|
|
if ok {
|
|
return table
|
|
}
|
|
|
|
t.mu.Lock()
|
|
table = newTable(typ)
|
|
t.mu.Unlock()
|
|
|
|
return table
|
|
}
|