| 130 | } |
| 131 | |
| 132 | func (plan *scanPlanBinaryCompositeToCompositeIndexScanner) Scan(src []byte, target any) error { |
| 133 | targetScanner := (target).(CompositeIndexScanner) |
| 134 | |
| 135 | if src == nil { |
| 136 | return targetScanner.ScanNull() |
| 137 | } |
| 138 | |
| 139 | scanner := NewCompositeBinaryScanner(plan.m, src) |
| 140 | for i, field := range plan.cc.Fields { |
| 141 | if scanner.Next() { |
| 142 | fieldTarget := targetScanner.ScanIndex(i) |
| 143 | if fieldTarget != nil { |
| 144 | fieldPlan := plan.m.PlanScan(field.Type.OID, BinaryFormatCode, fieldTarget) |
| 145 | if fieldPlan == nil { |
| 146 | return fmt.Errorf("unable to encode %v into OID %d in binary format", field, field.Type.OID) |
| 147 | } |
| 148 | |
| 149 | err := fieldPlan.Scan(scanner.Bytes(), fieldTarget) |
| 150 | if err != nil { |
| 151 | return err |
| 152 | } |
| 153 | } |
| 154 | } else { |
| 155 | return errors.New("read past end of composite") |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | if err := scanner.Err(); err != nil { |
| 160 | return err |
| 161 | } |
| 162 | |
| 163 | return nil |
| 164 | } |
| 165 | |
| 166 | type scanPlanTextCompositeToCompositeIndexScanner struct { |
| 167 | cc *CompositeCodec |