Browse Source

close rows if possible

xormplus 8 năm trước cách đây
mục cha
commit
79788b55f1
3 tập tin đã thay đổi với 45 bổ sung25 xóa
  1. 6 1
      rows.go
  2. 10 3
      session.go
  3. 29 21
      session_get.go

+ 6 - 1
rows.go

@@ -122,8 +122,13 @@ func (rows *Rows) Scan(bean interface{}) error {
 	if err := rows.session.Statement.setRefValue(dataStruct); err != nil {
 		return err
 	}
-	_, err := rows.session.row2Bean(rows.rows, rows.fields, len(rows.fields), bean, &dataStruct, rows.session.Statement.RefTable)
 
+	scanResults, err := rows.session.row2Slice(rows.rows, rows.fields, len(rows.fields), bean)
+	if err != nil {
+		return err
+	}
+
+	_, err = rows.session.slice2Bean(scanResults, rows.fields, len(rows.fields), bean, &dataStruct, rows.session.Statement.RefTable)
 	return err
 }
 

+ 10 - 3
session.go

@@ -305,7 +305,12 @@ 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)
+		// handle beforeClosures
+		scanResults, err := session.row2Slice(rows, fields, fieldsCount, bean)
+		if err != nil {
+			return err
+		}
+		pk, err := session.slice2Bean(scanResults, fields, fieldsCount, bean, &dataStruct, table)
 		if err != nil {
 			return err
 		}
@@ -318,8 +323,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{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) {
-	// handle beforeClosures
+func (session *Session) row2Slice(rows *core.Rows, fields []string, fieldsCount int, bean interface{}) ([]interface{}, error) {
 	for _, closure := range session.beforeClosures {
 		closure(bean)
 	}
@@ -338,7 +342,10 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
 			b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
 		}
 	}
+	return scanResults, nil
+}
 
+func (session *Session) slice2Bean(scanResults []interface{}, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) {
 	defer func() {
 		if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
 			for ii, key := range fields {

+ 29 - 21
session_get.go

@@ -78,30 +78,38 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlS
 
 	defer rawRows.Close()
 
-	if rawRows.Next() {
-		switch beanKind {
-		case reflect.Struct:
-			fields, err := rawRows.Columns()
-			if err != nil {
-				// WARN: Alougth rawRows return true, but get fields failed
-				return true, err
-			}
-			dataStruct := rValue(bean)
-			if err := session.Statement.setRefValue(dataStruct); err != nil {
-				return false, err
-			}
-			_, err = session.row2Bean(rawRows, fields, len(fields), bean, &dataStruct, session.Statement.RefTable)
-		case reflect.Slice:
-			err = rawRows.ScanSlice(bean)
-		case reflect.Map:
-			err = rawRows.ScanMap(bean)
-		default:
-			err = rawRows.Scan(bean)
+	if !rawRows.Next() {
+		return false, nil
+	}
+
+	switch beanKind {
+	case reflect.Struct:
+		fields, err := rawRows.Columns()
+		if err != nil {
+			// WARN: Alougth rawRows return true, but get fields failed
+			return true, err
+		}
+		dataStruct := rValue(bean)
+		if err := session.Statement.setRefValue(dataStruct); err != nil {
+			return false, err
 		}
 
-		return true, err
+		scanResults, err := session.row2Slice(rawRows, fields, len(fields), bean)
+		if err != nil {
+			return false, err
+		}
+		rawRows.Close()
+
+		_, err = session.slice2Bean(scanResults, fields, len(fields), bean, &dataStruct, session.Statement.RefTable)
+	case reflect.Slice:
+		err = rawRows.ScanSlice(bean)
+	case reflect.Map:
+		err = rawRows.ScanMap(bean)
+	default:
+		err = rawRows.Scan(bean)
 	}
-	return false, nil
+
+	return true, err
 }
 
 func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) {