add conversion interface; add struct derive support; add single mapping support

This commit is contained in:
Lunny Xiao 2013-06-26 01:02:22 +08:00
parent 5e90d61fa8
commit 2110aa631e
3 changed files with 94 additions and 0 deletions

76
examples/conversion.go Normal file
View File

@ -0,0 +1,76 @@
package main
import (
"errors"
"fmt"
_ "github.com/mattn/go-sqlite3"
"os"
. "xorm"
)
type Status struct {
Name string
Color string
}
var (
Registed Status = Status{"Registed", "white"}
Approved Status = Status{"Approved", "green"}
Removed Status = Status{"Removed", "red"}
Statuses map[string]Status = map[string]Status{
Registed.Name: Registed,
Approved.Name: Approved,
Removed.Name: Removed,
}
)
func (s *Status) FromDB(bytes []byte) error {
if r, ok := Statuses[string(bytes)]; ok {
*s = r
return nil
} else {
return errors.New("no this data")
}
}
func (s *Status) ToDB() ([]byte, error) {
return []byte(s.Name), nil
}
type User struct {
Id int64
Name string
Status Status `xorm:"varchar(40)"`
}
func main() {
f := "conversion.db"
os.Remove(f)
Orm, err := NewEngine("sqlite3", f)
if err != nil {
fmt.Println(err)
return
}
Orm.ShowSQL = true
err = Orm.CreateTables(&User{})
if err != nil {
fmt.Println(err)
return
}
_, err = Orm.Insert(&User{1, "xlw", Registed})
if err != nil {
fmt.Println(err)
return
}
users := make([]User, 0)
err = Orm.Find(&users)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(users)
}

View File

@ -225,6 +225,12 @@ func (session *Session) scanMapIntoStruct(obj interface{}, objMap map[string][]b
} }
v = x v = x
} else if structConvert, ok := structField.Addr().Interface().(Conversion); ok {
err := structConvert.FromDB(data)
if err != nil {
return err
}
continue
} else if session.Statement.UseCascade { } else if session.Statement.UseCascade {
table := session.Engine.AutoMapType(structField.Type()) table := session.Engine.AutoMapType(structField.Type())
if table != nil { if table != nil {
@ -710,6 +716,13 @@ func (session *Session) InsertOne(bean interface{}) (int64, error) {
} else { } else {
continue continue
} }
} else if fieldConvert, ok := fieldValue.Addr().Interface().(Conversion); ok {
data, err := fieldConvert.ToDB()
if err != nil {
return 0, err
} else {
args = append(args, string(data))
}
} else { } else {
args = append(args, val) args = append(args, val)
} }

View File

@ -94,3 +94,8 @@ type Table struct {
func (table *Table) PKColumn() Column { func (table *Table) PKColumn() Column {
return table.Columns[table.PrimaryKey] return table.Columns[table.PrimaryKey]
} }
type Conversion interface {
FromDB([]byte) error
ToDB() ([]byte, error)
}