github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/sugar/query.go (about)

     1  package sugar
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"io"
     7  
     8  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/scanner"
     9  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
    10  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xiter"
    11  	"github.com/ydb-platform/ydb-go-sdk/v3/query"
    12  )
    13  
    14  // UnmarshallRow returns typed object from query.Row
    15  //
    16  // Experimental: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#experimental
    17  func UnmarshallRow[T any](row query.Row) (*T, error) {
    18  	var v T
    19  	if err := row.ScanStruct(&v); err != nil {
    20  		return nil, xerrors.WithStackTrace(err)
    21  	}
    22  
    23  	return &v, nil
    24  }
    25  
    26  // UnmarshalRows returns typed object iterator from query.Row iterator
    27  //
    28  // Experimental: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#experimental
    29  func UnmarshalRows[T any](seq xiter.Seq2[query.Row, error], opts ...scanner.ScanStructOption) xiter.Seq2[T, error] {
    30  	return func(yield func(T, error) bool) {
    31  		seq(func(row query.Row, err error) bool {
    32  			// The function caller for every pair row, errpr in seq iterator, then call yield for outer iterator
    33  			// for produce T, errpr pair for output
    34  
    35  			if errors.Is(err, io.EOF) {
    36  				return false
    37  			}
    38  
    39  			var val T
    40  			if err != nil {
    41  				yield(val, err)
    42  
    43  				return false
    44  			}
    45  
    46  			err = row.ScanStruct(&val, opts...)
    47  			if err != nil {
    48  				yield(val, err)
    49  
    50  				return false
    51  			}
    52  
    53  			return yield(val, err)
    54  		})
    55  	}
    56  }
    57  
    58  // UnmarshallResultSet returns slice of typed objects from given query.ResultSet
    59  //
    60  // Experimental: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#experimental
    61  func UnmarshallResultSet[T any](resultSet query.ResultSet) (values []*T, _ error) {
    62  	for {
    63  		row, err := resultSet.NextRow(context.Background())
    64  		if err != nil {
    65  			if xerrors.Is(err, io.EOF) {
    66  				break
    67  			}
    68  
    69  			return nil, xerrors.WithStackTrace(err)
    70  		}
    71  		var v T
    72  		if err := row.ScanStruct(&v); err != nil {
    73  			return nil, xerrors.WithStackTrace(err)
    74  		}
    75  
    76  		values = append(values, &v)
    77  	}
    78  
    79  	return values, nil
    80  }