now object crud is simple
Showing
4 changed files
with
90 additions
and
58 deletions
| ... | @@ -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) | ... | ... |
-
Please register or sign in to post a comment