add auto map

This commit is contained in:
Lunny Xiao 2013-05-13 19:56:38 +08:00
parent 0517c1ddcf
commit d3c4644b17
2 changed files with 26 additions and 11 deletions

View File

@ -157,6 +157,20 @@ func (engine *Engine) MapOne(bean interface{}) Table {
return engine.MapType(t) return engine.MapType(t)
} }
func (engine *Engine) AutoMapType(t reflect.Type) *Table {
table, ok := engine.Tables[t]
if !ok {
table = engine.MapType(t)
engine.Tables[t] = table
}
return &table
}
func (engine *Engine) AutoMap(bean interface{}) *Table {
t := Type(bean)
return engine.AutoMapType(t)
}
func (engine *Engine) MapType(t reflect.Type) Table { func (engine *Engine) MapType(t reflect.Type) Table {
table := Table{Name: engine.Mapper.Obj2Table(t.Name()), Type: t} table := Table{Name: engine.Mapper.Obj2Table(t.Name()), Type: t}
table.Columns = make(map[string]Column) table.Columns = make(map[string]Column)
@ -183,6 +197,7 @@ func (engine *Engine) MapType(t reflect.Type) Table {
switch { switch {
case k == "pk": case k == "pk":
col.IsPrimaryKey = true col.IsPrimaryKey = true
col.Nullable = false
pkCol = &col pkCol = &col
case k == "null": case k == "null":
col.Nullable = (tags[j-1] != "not") col.Nullable = (tags[j-1] != "not")

View File

@ -211,7 +211,8 @@ func (session *Session) Get(bean interface{}) error {
statement := session.Statement statement := session.Statement
defer session.Statement.Init() defer session.Statement.Init()
statement.Limit(1) statement.Limit(1)
table := session.Engine.Bean2Table(bean)
table := session.Engine.AutoMap(bean)
statement.Table = table statement.Table = table
colNames, args := session.BuildConditions(table, bean) colNames, args := session.BuildConditions(table, bean)
@ -241,7 +242,7 @@ func (session *Session) Get(bean interface{}) error {
func (session *Session) Count(bean interface{}) (int64, error) { func (session *Session) Count(bean interface{}) (int64, error) {
statement := session.Statement statement := session.Statement
defer session.Statement.Init() defer session.Statement.Init()
table := session.Engine.Bean2Table(bean) table := session.Engine.AutoMap(bean)
statement.Table = table statement.Table = table
colNames, args := session.BuildConditions(table, bean) colNames, args := session.BuildConditions(table, bean)
@ -271,12 +272,11 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
} }
sliceElementType := sliceValue.Type().Elem() sliceElementType := sliceValue.Type().Elem()
table := session.Engine.AutoMapType(sliceElementType)
table := session.Engine.Tables[sliceElementType] statement.Table = table
statement.Table = &table
if len(condiBean) > 0 { if len(condiBean) > 0 {
colNames, args := session.BuildConditions(&table, condiBean[0]) colNames, args := session.BuildConditions(table, condiBean[0])
statement.ColumnStr = strings.Join(colNames, " and ") statement.ColumnStr = strings.Join(colNames, " and ")
statement.BeanArgs = args statement.BeanArgs = args
} }
@ -428,8 +428,8 @@ func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) {
bean := sliceValue.Index(0).Interface() bean := sliceValue.Index(0).Interface()
sliceElementType := Type(bean) sliceElementType := Type(bean)
table := session.Engine.Tables[sliceElementType] table := session.Engine.AutoMapType(sliceElementType)
session.Statement.Table = &table session.Statement.Table = table
size := sliceValue.Len() size := sliceValue.Len()
@ -490,7 +490,7 @@ func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) {
} }
func (session *Session) InsertOne(bean interface{}) (int64, error) { func (session *Session) InsertOne(bean interface{}) (int64, error) {
table := session.Engine.Bean2Table(bean) table := session.Engine.AutoMap(bean)
session.Statement.Table = table session.Statement.Table = table
colNames := make([]string, 0) colNames := make([]string, 0)
colPlaces := make([]string, 0) colPlaces := make([]string, 0)
@ -561,7 +561,7 @@ func (session *Session) BuildConditions(table *Table, bean interface{}) ([]strin
} }
func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) { func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) {
table := session.Engine.Bean2Table(bean) table := session.Engine.AutoMap(bean)
session.Statement.Table = table session.Statement.Table = table
colNames, args := session.BuildConditions(table, bean) colNames, args := session.BuildConditions(table, bean)
var condiColNames []string var condiColNames []string
@ -610,7 +610,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
} }
func (session *Session) Delete(bean interface{}) (int64, error) { func (session *Session) Delete(bean interface{}) (int64, error) {
table := session.Engine.Bean2Table(bean) table := session.Engine.AutoMap(bean)
session.Statement.Table = table session.Statement.Table = table
colNames, args := session.BuildConditions(table, bean) colNames, args := session.BuildConditions(table, bean)