51baa35d by slene

now object crud is simple

1 parent 250cbf59
...@@ -559,6 +559,42 @@ func (d *dbBase) InsertStmt(stmt *sql.Stmt, mi *modelInfo, ind reflect.Value) (i ...@@ -559,6 +559,42 @@ func (d *dbBase) InsertStmt(stmt *sql.Stmt, mi *modelInfo, ind reflect.Value) (i
559 } 559 }
560 } 560 }
561 561
562 func (d *dbBase) Read(q dbQuerier, mi *modelInfo, ind reflect.Value) error {
563 pkNames, pkValues, ok := d.existPk(mi, ind)
564 if ok == false {
565 return ErrMissPK
566 }
567
568 pkColumns := strings.Join(pkNames, "` = ? AND `")
569
570 sels := strings.Join(mi.fields.dbcols, "`, `")
571 colsNum := len(mi.fields.dbcols)
572
573 query := fmt.Sprintf("SELECT `%s` FROM `%s` WHERE `%s` = ?", sels, mi.table, pkColumns)
574
575 refs := make([]interface{}, colsNum)
576 for i, _ := range refs {
577 var ref interface{}
578 refs[i] = &ref
579 }
580
581 row := q.QueryRow(query, pkValues...)
582 if err := row.Scan(refs...); err != nil {
583 return err
584 } else {
585 elm := reflect.New(mi.addrField.Elem().Type())
586 md := elm.Interface().(Modeler)
587 md.Init(md)
588 mind := reflect.Indirect(elm)
589
590 d.setColsValues(mi, &mind, mi.fields.dbcols, refs)
591
592 ind.Set(mind)
593 }
594
595 return nil
596 }
597
562 func (d *dbBase) Insert(q dbQuerier, mi *modelInfo, ind reflect.Value) (int64, error) { 598 func (d *dbBase) Insert(q dbQuerier, mi *modelInfo, ind reflect.Value) (int64, error) {
563 names, values, err := d.collectValues(mi, ind, true, true) 599 names, values, err := d.collectValues(mi, ind, true, true)
564 if err != nil { 600 if err != nil {
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
4 "database/sql" 4 "database/sql"
5 "errors" 5 "errors"
6 "fmt" 6 "fmt"
7 "reflect"
7 "time" 8 "time"
8 ) 9 )
9 10
...@@ -26,15 +27,61 @@ type orm struct { ...@@ -26,15 +27,61 @@ type orm struct {
26 isTx bool 27 isTx bool
27 } 28 }
28 29
29 func (o *orm) Object(md Modeler) ObjectSeter { 30 func (o *orm) getMiInd(md Modeler) (mi *modelInfo, ind reflect.Value) {
30 md.Init(md, true) 31 md.Init(md, true)
31 name := md.GetTableName() 32 name := md.GetTableName()
32 if mi, ok := modelCache.get(name); ok { 33 if mi, ok := modelCache.get(name); ok {
33 return newObject(o, mi, md) 34 return mi, reflect.Indirect(reflect.ValueOf(md))
34 } 35 }
35 panic(fmt.Sprintf("<orm.Object> table name: `%s` not exists", name)) 36 panic(fmt.Sprintf("<orm.Object> table name: `%s` not exists", name))
36 } 37 }
37 38
39 func (o *orm) Read(md Modeler) error {
40 mi, ind := o.getMiInd(md)
41 err := o.alias.DbBaser.Read(o.db, mi, ind)
42 if err != nil {
43 return err
44 }
45 return nil
46 }
47
48 func (o *orm) Insert(md Modeler) (int64, error) {
49 mi, ind := o.getMiInd(md)
50 id, err := o.alias.DbBaser.Insert(o.db, mi, ind)
51 if err != nil {
52 return id, err
53 }
54 if id > 0 {
55 if mi.fields.auto != nil {
56 ind.Field(mi.fields.auto.fieldIndex).SetInt(id)
57 }
58 }
59 return id, nil
60 }
61
62 func (o *orm) Update(md Modeler) (int64, error) {
63 mi, ind := o.getMiInd(md)
64 num, err := o.alias.DbBaser.Update(o.db, mi, ind)
65 if err != nil {
66 return num, err
67 }
68 return num, nil
69 }
70
71 func (o *orm) Delete(md Modeler) (int64, error) {
72 mi, ind := o.getMiInd(md)
73 num, err := o.alias.DbBaser.Delete(o.db, mi, ind)
74 if err != nil {
75 return num, err
76 }
77 if num > 0 {
78 if mi.fields.auto != nil {
79 ind.Field(mi.fields.auto.fieldIndex).SetInt(0)
80 }
81 }
82 return num, nil
83 }
84
38 func (o *orm) QueryTable(ptrStructOrTableName interface{}) QuerySeter { 85 func (o *orm) QueryTable(ptrStructOrTableName interface{}) QuerySeter {
39 name := "" 86 name := ""
40 if table, ok := ptrStructOrTableName.(string); ok { 87 if table, ok := ptrStructOrTableName.(string); ok {
......
...@@ -51,52 +51,3 @@ func newInsertSet(orm *orm, mi *modelInfo) (Inserter, error) { ...@@ -51,52 +51,3 @@ func newInsertSet(orm *orm, mi *modelInfo) (Inserter, error) {
51 bi.stmt = st 51 bi.stmt = st
52 return bi, nil 52 return bi, nil
53 } 53 }
54
55 type object struct {
56 ind reflect.Value
57 mi *modelInfo
58 orm *orm
59 }
60
61 func (o *object) Insert() (int64, error) {
62 id, err := o.orm.alias.DbBaser.Insert(o.orm.db, o.mi, o.ind)
63 if err != nil {
64 return id, err
65 }
66 if id > 0 {
67 if o.mi.fields.auto != nil {
68 o.ind.Field(o.mi.fields.auto.fieldIndex).SetInt(id)
69 }
70 }
71 return id, nil
72 }
73
74 func (o *object) Update() (int64, error) {
75 num, err := o.orm.alias.DbBaser.Update(o.orm.db, o.mi, o.ind)
76 if err != nil {
77 return num, err
78 }
79 return num, nil
80 }
81
82 func (o *object) Delete() (int64, error) {
83 num, err := o.orm.alias.DbBaser.Delete(o.orm.db, o.mi, o.ind)
84 if err != nil {
85 return num, err
86 }
87 if num > 0 {
88 if o.mi.fields.auto != nil {
89 o.ind.Field(o.mi.fields.auto.fieldIndex).SetInt(0)
90 }
91 }
92 return num, nil
93 }
94
95 func newObject(orm *orm, mi *modelInfo, md Modeler) ObjectSeter {
96 o := new(object)
97 ind := reflect.Indirect(reflect.ValueOf(md))
98 o.ind = ind
99 o.mi = mi
100 o.orm = orm
101 return o
102 }
......
...@@ -22,7 +22,10 @@ type Modeler interface { ...@@ -22,7 +22,10 @@ type Modeler interface {
22 } 22 }
23 23
24 type Ormer interface { 24 type Ormer interface {
25 Object(Modeler) ObjectSeter 25 Read(Modeler) error
26 Insert(Modeler) (int64, error)
27 Update(Modeler) (int64, error)
28 Delete(Modeler) (int64, error)
26 QueryTable(interface{}) QuerySeter 29 QueryTable(interface{}) QuerySeter
27 Using(string) error 30 Using(string) error
28 Begin() error 31 Begin() error
...@@ -31,12 +34,6 @@ type Ormer interface { ...@@ -31,12 +34,6 @@ type Ormer interface {
31 Raw(string, ...interface{}) RawSeter 34 Raw(string, ...interface{}) RawSeter
32 } 35 }
33 36
34 type ObjectSeter interface {
35 Insert() (int64, error)
36 Update() (int64, error)
37 Delete() (int64, error)
38 }
39
40 type Inserter interface { 37 type Inserter interface {
41 Insert(Modeler) (int64, error) 38 Insert(Modeler) (int64, error)
42 Close() error 39 Close() error
...@@ -94,6 +91,7 @@ type dbQuerier interface { ...@@ -94,6 +91,7 @@ type dbQuerier interface {
94 } 91 }
95 92
96 type dbBaser interface { 93 type dbBaser interface {
94 Read(dbQuerier, *modelInfo, reflect.Value) error
97 Insert(dbQuerier, *modelInfo, reflect.Value) (int64, error) 95 Insert(dbQuerier, *modelInfo, reflect.Value) (int64, error)
98 InsertStmt(*sql.Stmt, *modelInfo, reflect.Value) (int64, error) 96 InsertStmt(*sql.Stmt, *modelInfo, reflect.Value) (int64, error)
99 Update(dbQuerier, *modelInfo, reflect.Value) (int64, error) 97 Update(dbQuerier, *modelInfo, reflect.Value) (int64, error)
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!