|
|
@@ -318,6 +318,11 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount
|
|
|
}
|
|
|
|
|
|
func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) {
|
|
|
+ // handle beforeClosures
|
|
|
+ for _, closure := range session.beforeClosures {
|
|
|
+ closure(bean)
|
|
|
+ }
|
|
|
+
|
|
|
scanResults := make([]interface{}, fieldsCount)
|
|
|
for i := 0; i < len(fields); i++ {
|
|
|
var cell interface{}
|
|
|
@@ -339,6 +344,11 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
b.AfterSet(key, Cell(scanResults[ii].(*interface{})))
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // handle afterClosures
|
|
|
+ for _, closure := range session.afterClosures {
|
|
|
+ closure(bean)
|
|
|
+ }
|
|
|
}()
|
|
|
|
|
|
dbTZ := session.Engine.DatabaseTZ
|
|
|
@@ -374,9 +384,11 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if fieldValue.CanAddr() {
|
|
|
if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok {
|
|
|
if data, err := value2Bytes(&rawValue); err == nil {
|
|
|
- structConvert.FromDB(data)
|
|
|
+ if err := structConvert.FromDB(data); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
} else {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
+ return nil, err
|
|
|
}
|
|
|
continue
|
|
|
}
|
|
|
@@ -389,7 +401,7 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
}
|
|
|
fieldValue.Interface().(core.Conversion).FromDB(data)
|
|
|
} else {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
+ return nil, err
|
|
|
}
|
|
|
continue
|
|
|
}
|
|
|
@@ -419,14 +431,12 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if fieldValue.CanAddr() {
|
|
|
err := json.Unmarshal(bs, fieldValue.Addr().Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(key, err)
|
|
|
return nil, err
|
|
|
}
|
|
|
} else {
|
|
|
x := reflect.New(fieldType)
|
|
|
err := json.Unmarshal(bs, x.Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(key, err)
|
|
|
return nil, err
|
|
|
}
|
|
|
fieldValue.Set(x.Elem())
|
|
|
@@ -451,14 +461,12 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if fieldValue.CanAddr() {
|
|
|
err := json.Unmarshal(bs, fieldValue.Addr().Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
return nil, err
|
|
|
}
|
|
|
} else {
|
|
|
x := reflect.New(fieldType)
|
|
|
err := json.Unmarshal(bs, x.Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
return nil, err
|
|
|
}
|
|
|
fieldValue.Set(x.Elem())
|
|
|
@@ -475,14 +483,19 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
x := reflect.New(fieldType)
|
|
|
err := json.Unmarshal(vv.Bytes(), x.Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
return nil, err
|
|
|
}
|
|
|
fieldValue.Set(x.Elem())
|
|
|
} else {
|
|
|
- for i := 0; i < fieldValue.Len(); i++ {
|
|
|
- if i < vv.Len() {
|
|
|
- fieldValue.Index(i).Set(vv.Index(i))
|
|
|
+ if fieldValue.Len() > 0 {
|
|
|
+ for i := 0; i < fieldValue.Len(); i++ {
|
|
|
+ if i < vv.Len() {
|
|
|
+ fieldValue.Index(i).Set(vv.Index(i))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for i := 0; i < vv.Len(); i++ {
|
|
|
+ fieldValue.Set(reflect.Append(*fieldValue, vv.Index(i)))
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -593,7 +606,6 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if len([]byte(vv.String())) > 0 {
|
|
|
err := json.Unmarshal([]byte(vv.String()), x.Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
return nil, err
|
|
|
}
|
|
|
fieldValue.Set(x.Elem())
|
|
|
@@ -604,7 +616,6 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if len(vv.Bytes()) > 0 {
|
|
|
err := json.Unmarshal(vv.Bytes(), x.Interface())
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
return nil, err
|
|
|
}
|
|
|
fieldValue.Set(x.Elem())
|
|
|
@@ -746,10 +757,9 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if len([]byte(vv.String())) > 0 {
|
|
|
err := json.Unmarshal([]byte(vv.String()), &x)
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
- } else {
|
|
|
- fieldValue.Set(reflect.ValueOf(&x))
|
|
|
+ return nil, err
|
|
|
}
|
|
|
+ fieldValue.Set(reflect.ValueOf(&x))
|
|
|
}
|
|
|
hasAssigned = true
|
|
|
case core.Complex128Type:
|
|
|
@@ -757,24 +767,23 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
|
|
if len([]byte(vv.String())) > 0 {
|
|
|
err := json.Unmarshal([]byte(vv.String()), &x)
|
|
|
if err != nil {
|
|
|
- session.Engine.logger.Error(err)
|
|
|
- } else {
|
|
|
- fieldValue.Set(reflect.ValueOf(&x))
|
|
|
+ return nil, err
|
|
|
}
|
|
|
+ fieldValue.Set(reflect.ValueOf(&x))
|
|
|
}
|
|
|
hasAssigned = true
|
|
|
} // switch fieldType
|
|
|
- // default:
|
|
|
- // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String())
|
|
|
} // switch fieldType.Kind()
|
|
|
|
|
|
// !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value
|
|
|
if !hasAssigned {
|
|
|
data, err := value2Bytes(&rawValue)
|
|
|
- if err == nil {
|
|
|
- session.bytes2Value(col, fieldValue, data)
|
|
|
- } else {
|
|
|
- session.Engine.logger.Error(err.Error())
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err = session.bytes2Value(col, fieldValue, data); err != nil {
|
|
|
+ return nil, err
|
|
|
}
|
|
|
}
|
|
|
}
|