From a818aab2a4b48e399d5186c235149ef21011a4af Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Wed, 15 Apr 2026 18:54:36 +0200 Subject: before scanning, spawn member structs within pointers as necessary --- select.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'select.go') diff --git a/select.go b/select.go index 8aed249..9de6e13 100644 --- a/select.go +++ b/select.go @@ -29,7 +29,7 @@ func (s Store[R]) Select(db Handle, query string, args ...any) (result []R, retu slots := make([]any, len(indexes)) for rows.Next() { var target R - err = collectRow(rows, reflect.ValueOf(&target).Elem(), slots, indexes) + err = collectRow(rows, s.plan, reflect.ValueOf(&target).Elem(), slots, indexes) if err != nil { return nil, err } @@ -67,7 +67,7 @@ func (s Store[R]) SelectWhere(db Handle, partialQuery string, args ...any) (resu slots := make([]any, len(indexes)) for rows.Next() { var target R - err = collectRow(rows, reflect.ValueOf(&target).Elem(), slots, indexes) + err = collectRow(rows, s.plan, reflect.ValueOf(&target).Elem(), slots, indexes) if err != nil { return nil, err } @@ -119,7 +119,11 @@ func startSelectWhereQuery(db Handle, plan plan, partialQuery string, args ...an return rows, plan.Select.ScanIndexes, err } -func collectRow(rows *sql.Rows, v reflect.Value, slots []any, indexes [][]int) error { +func collectRow(rows *sql.Rows, plan plan, v reflect.Value, slots []any, indexes [][]int) error { + for _, index := range plan.IndexesOfTransparentPointerStructs { + f := v.FieldByIndex(index) + f.Set(reflect.New(f.Type().Elem())) + } for idx, index := range indexes { slots[idx] = v.FieldByIndex(index).Addr().Interface() } @@ -178,6 +182,10 @@ func selectOneWhere(db Handle, plan plan, v reflect.Value, partialQuery string, return errors.New("cannot execute SelectOneWhere() because query could not be autogenerated") } query := plan.Select.Query + partialQuery + for _, index := range plan.IndexesOfTransparentPointerStructs { + f := v.FieldByIndex(index) + f.Set(reflect.New(f.Type().Elem())) + } slots := make([]any, len(plan.Select.ScanIndexes)) for idx, index := range plan.Select.ScanIndexes { slots[idx] = v.FieldByIndex(index).Addr().Interface() -- cgit v1.2.3