From d170089adfb36bed7e60ef59f59de6e14a965be3 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 14 Mar 2017 23:03:27 +0800 Subject: [PATCH] refactor rowsbean --- rows.go | 5 ++++- session.go | 15 ++------------- session_get.go | 4 +++- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/rows.go b/rows.go index 3957ab60..a91d08b7 100644 --- a/rows.go +++ b/rows.go @@ -112,7 +112,10 @@ func (rows *Rows) Scan(bean interface{}) error { return fmt.Errorf("scan arg is incompatible type to [%v]", rows.beanType) } - _, err := rows.session.row2Bean(rows.rows, rows.fields, len(rows.fields), bean) + dataStruct := rValue(bean) + rows.session.Statement.setRefValue(dataStruct) + _, err := rows.session.row2Bean(rows.rows, rows.fields, len(rows.fields), bean, &dataStruct, rows.session.Statement.RefTable) + return err } diff --git a/session.go b/session.go index 34315ea4..5127cba3 100644 --- a/session.go +++ b/session.go @@ -380,7 +380,7 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount var newValue = newElemFunc(fields) bean := newValue.Interface() dataStruct := rValue(bean) - pk, err := session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table) + pk, err := session.row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table) if err != nil { return err } @@ -393,18 +393,7 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount return nil } -func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}) (core.PK, error) { - dataStruct := rValue(bean) - if dataStruct.Kind() != reflect.Struct { - return nil, errors.New("Expected a pointer to a struct") - } - - session.Statement.setRefValue(dataStruct) - - return session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, session.Statement.RefTable) -} - -func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) { +func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) { scanResults := make([]interface{}, fieldsCount) for i := 0; i < len(fields); i++ { var cell interface{} diff --git a/session_get.go b/session_get.go index 2b975c83..0c78ed94 100644 --- a/session_get.go +++ b/session_get.go @@ -85,7 +85,9 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlS switch beanKind { case reflect.Struct: - _, err = session.row2Bean(rawRows, fields, len(fields), bean) + dataStruct := rValue(bean) + session.Statement.setRefValue(dataStruct) + _, err = session.row2Bean(rawRows, fields, len(fields), bean, &dataStruct, session.Statement.RefTable) case reflect.Slice: err = rawRows.ScanSlice(bean) case reflect.Map: