models.go 2.5 KB
Newer Older
A
astaxie 已提交
1 2 3 4 5 6
// Beego (http://beego.me/)
// @description beego is an open-source, high-performance web framework for the Go programming language.
// @link        http://github.com/astaxie/beego for the canonical source repository
// @license     http://github.com/astaxie/beego/blob/master/LICENSE
// @authors     slene

S
slene 已提交
7 8 9 10 11 12 13
package orm

import (
	"sync"
)

const (
14 15 16 17 18 19
	od_CASCADE            = "cascade"
	od_SET_NULL           = "set_null"
	od_SET_DEFAULT        = "set_default"
	od_DO_NOTHING         = "do_nothing"
	defaultStructTagName  = "orm"
	defaultStructTagDelim = ";"
S
slene 已提交
20 21 22
)

var (
23 24 25 26
	modelCache = &_modelCache{
		cache:     make(map[string]*modelInfo),
		cacheByFN: make(map[string]*modelInfo),
	}
S
slene 已提交
27
	supportTag = map[string]int{
28
		"-":            1,
S
slene 已提交
29 30 31 32 33 34 35
		"null":         1,
		"index":        1,
		"unique":       1,
		"pk":           1,
		"auto":         1,
		"auto_now":     1,
		"auto_now_add": 1,
S
slene 已提交
36
		"size":         2,
S
slene 已提交
37 38 39 40 41 42 43 44 45
		"column":       2,
		"default":      2,
		"rel":          2,
		"reverse":      2,
		"rel_table":    2,
		"rel_through":  2,
		"digits":       2,
		"decimals":     2,
		"on_delete":    2,
S
slene 已提交
46
		"type":         2,
S
slene 已提交
47 48 49
	}
)

F
FuXiaoHei 已提交
50
// model info collection
S
slene 已提交
51 52
type _modelCache struct {
	sync.RWMutex
53 54 55 56
	orders    []string
	cache     map[string]*modelInfo
	cacheByFN map[string]*modelInfo
	done      bool
S
slene 已提交
57 58
}

F
FuXiaoHei 已提交
59
// get all model info
S
slene 已提交
60 61 62 63 64 65 66 67
func (mc *_modelCache) all() map[string]*modelInfo {
	m := make(map[string]*modelInfo, len(mc.cache))
	for k, v := range mc.cache {
		m[k] = v
	}
	return m
}

F
FuXiaoHei 已提交
68
// get orderd model info
S
slene 已提交
69 70
func (mc *_modelCache) allOrdered() []*modelInfo {
	m := make([]*modelInfo, 0, len(mc.orders))
S
slene 已提交
71 72
	for _, table := range mc.orders {
		m = append(m, mc.cache[table])
S
slene 已提交
73 74 75 76
	}
	return m
}

F
FuXiaoHei 已提交
77
// get model info by table name
S
slene 已提交
78 79
func (mc *_modelCache) get(table string) (mi *modelInfo, ok bool) {
	mi, ok = mc.cache[table]
80 81 82
	return
}

F
FuXiaoHei 已提交
83
// get model info by field name
84 85
func (mc *_modelCache) getByFN(name string) (mi *modelInfo, ok bool) {
	mi, ok = mc.cacheByFN[name]
S
slene 已提交
86 87 88
	return
}

F
FuXiaoHei 已提交
89
// set model info to collection
S
slene 已提交
90 91 92
func (mc *_modelCache) set(table string, mi *modelInfo) *modelInfo {
	mii := mc.cache[table]
	mc.cache[table] = mi
93
	mc.cacheByFN[mi.fullName] = mi
S
slene 已提交
94 95 96 97 98
	if mii == nil {
		mc.orders = append(mc.orders, table)
	}
	return mii
}
S
slene 已提交
99

F
FuXiaoHei 已提交
100
// clean all model info.
S
slene 已提交
101 102 103 104 105 106
func (mc *_modelCache) clean() {
	mc.orders = make([]string, 0)
	mc.cache = make(map[string]*modelInfo)
	mc.cacheByFN = make(map[string]*modelInfo)
	mc.done = false
}
107 108 109 110 111 112

// Clean model cache. Then you can re-RegisterModel.
// Common use this api for test case.
func ResetModelCache() {
	modelCache.clean()
}