in rows.go [85:143]
func (r *rows) Next(dest []driver.Value) error {
if len(r.resultSets) == 0 {
return io.EOF
}
resultSet := r.resultSets[r.currentResultSet]
if resultSet.currentRow >= len(resultSet.data) {
if resultSet.done {
// Finished iterating through all results
return io.EOF
}
// Fetch more results from the server
res, err := r.conn.httpClient.post(context.Background(), &message.FetchRequest{
ConnectionId: r.conn.connectionId,
StatementId: r.statementID,
Offset: resultSet.offset,
FrameMaxSize: r.conn.config.frameMaxSize,
})
if err != nil {
return r.conn.avaticaErrorToResponseErrorOrError(err)
}
frame := res.(*message.FetchResponse).Frame
var data [][]*message.TypedValue
// In some cases the server does not return done as true
// until it returns a result with no rows
if len(frame.Rows) == 0 {
return io.EOF
}
for _, row := range frame.Rows {
var rowData []*message.TypedValue
for _, col := range row.Value {
rowData = append(rowData, col.ScalarValue)
}
data = append(data, rowData)
}
resultSet.done = frame.Done
resultSet.data = data
resultSet.currentRow = 0
}
for i, val := range resultSet.data[resultSet.currentRow] {
dest[i] = typedValueToNative(resultSet.columns[i].Rep, val, r.conn.config)
}
resultSet.currentRow++
return nil
}