func()

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
}