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 }