xormplus %!s(int64=8) %!d(string=hai) anos
pai
achega
3aed42b068
Modificáronse 2 ficheiros con 57 adicións e 25 borrados
  1. 34 25
      session.go
  2. 23 0
      types_test.go

+ 34 - 25
session.go

@@ -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
 				}
 			}
 		}

+ 23 - 0
types_test.go

@@ -72,3 +72,26 @@ func TestArrayField(t *testing.T) {
 	assert.NoError(t, err)
 	assert.Equal(t, false, has)
 }
+
+func TestGetBytes(t *testing.T) {
+	assert.NoError(t, prepareEngine())
+
+	type Varbinary struct {
+		Data []byte `xorm:"VARBINARY"`
+	}
+
+	err := testEngine.Sync2(new(Varbinary))
+	assert.NoError(t, err)
+
+	cnt, err := testEngine.Insert(&Varbinary{
+		Data: []byte("test"),
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	var b Varbinary
+	has, err := testEngine.Get(&b)
+	assert.NoError(t, err)
+	assert.Equal(t, true, has)
+	assert.Equal(t, "test", string(b.Data))
+}