Przeglądaj źródła

scanner: dont allocate columns slice for every row

Chris Bannister 7 lat temu
rodzic
commit
2b46f6585f
1 zmienionych plików z 10 dodań i 10 usunięć
  1. 10 10
      session.go

+ 10 - 10
session.go

@@ -1120,8 +1120,9 @@ type Scanner interface {
 }
 
 type iterScanner struct {
-	iter *Iter
-	cols [][]byte
+	iter  *Iter
+	cols  [][]byte
+	valid bool
 }
 
 func (is *iterScanner) Next() bool {
@@ -1138,17 +1139,16 @@ func (is *iterScanner) Next() bool {
 		return false
 	}
 
-	cols := make([][]byte, len(iter.meta.columns))
-	for i := 0; i < len(cols); i++ {
+	for i := 0; i < len(is.cols); i++ {
 		col, err := iter.readColumn()
 		if err != nil {
 			iter.err = err
 			return false
 		}
-		cols[i] = col
+		is.cols[i] = col
 	}
-	is.cols = cols
 	iter.pos++
+	is.valid = true
 
 	return true
 }
@@ -1178,7 +1178,7 @@ func scanColumn(p []byte, col ColumnInfo, dest []interface{}) (int, error) {
 }
 
 func (is *iterScanner) Scan(dest ...interface{}) error {
-	if is.cols == nil {
+	if !is.valid {
 		return errors.New("gocql: Scan called without calling Next")
 	}
 
@@ -1202,8 +1202,7 @@ func (is *iterScanner) Scan(dest ...interface{}) error {
 		i += n
 	}
 
-	is.cols = nil
-
+	is.valid = false
 	return err
 }
 
@@ -1211,6 +1210,7 @@ func (is *iterScanner) Err() error {
 	iter := is.iter
 	is.iter = nil
 	is.cols = nil
+	is.valid = false
 	return iter.Close()
 }
 
@@ -1221,7 +1221,7 @@ func (iter *Iter) Scanner() Scanner {
 		return nil
 	}
 
-	return &iterScanner{iter: iter}
+	return &iterScanner{iter: iter, cols: make([][]byte, len(iter.meta.columns))}
 }
 
 func (iter *Iter) readColumn() ([]byte, error) {