in rows.go [85:144]
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_builder{
ConnectionId: r.conn.connectionId,
StatementId: r.statementID,
Offset: resultSet.offset + uint64(len(resultSet.data)),
FrameMaxSize: r.conn.config.frameMaxSize,
}.Build())
if err != nil {
return r.conn.avaticaErrorToResponseErrorOrError(err)
}
frame := res.(*message.FetchResponse).GetFrame()
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.GetRows()) == 0 {
return io.EOF
}
for _, row := range frame.GetRows() {
var rowData []*message.TypedValue
for _, col := range row.GetValue() {
rowData = append(rowData, col.GetScalarValue())
}
data = append(data, rowData)
}
resultSet.done = frame.GetDone()
resultSet.data = data
resultSet.currentRow = 0
resultSet.offset = frame.GetOffset()
}
for i, val := range resultSet.data[resultSet.currentRow] {
dest[i] = typedValueToNative(resultSet.columns[i].Rep, val, r.conn.config)
}
resultSet.currentRow++
return nil
}