diff options
| author | Stefan Majewsky <majewsky@gmx.net> | 2026-04-15 18:54:36 +0200 |
|---|---|---|
| committer | Stefan Majewsky <majewsky@gmx.net> | 2026-04-15 18:54:36 +0200 |
| commit | a818aab2a4b48e399d5186c235149ef21011a4af (patch) | |
| tree | db0b8c60ab5a2767a6489fb1ae50047712b63cfc /select.go | |
| parent | 1bb7ef5779aa3c27417eedf84aac6a8ea896871a (diff) | |
| download | go-oblast-a818aab2a4b48e399d5186c235149ef21011a4af.tar.gz | |
before scanning, spawn member structs within pointers as necessary
Diffstat (limited to 'select.go')
| -rw-r--r-- | select.go | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -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() |
