aboutsummaryrefslogtreecommitdiff
path: root/select.go
diff options
context:
space:
mode:
authorStefan Majewsky <majewsky@gmx.net>2026-04-15 18:54:36 +0200
committerStefan Majewsky <majewsky@gmx.net>2026-04-15 18:54:36 +0200
commita818aab2a4b48e399d5186c235149ef21011a4af (patch)
treedb0b8c60ab5a2767a6489fb1ae50047712b63cfc /select.go
parent1bb7ef5779aa3c27417eedf84aac6a8ea896871a (diff)
downloadgo-oblast-a818aab2a4b48e399d5186c235149ef21011a4af.tar.gz
before scanning, spawn member structs within pointers as necessary
Diffstat (limited to 'select.go')
-rw-r--r--select.go14
1 files changed, 11 insertions, 3 deletions
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()