(typ reflect.Type, val reflect.Value, columnTypes []*sql.ColumnType)
| 186 | } |
| 187 | |
| 188 | func (r *Row) lookupStructFieldPtrs(typ reflect.Type, val reflect.Value, columnTypes []*sql.ColumnType) ([]interface{}, error) { |
| 189 | fieldPtrs := make([]interface{}, 0, len(columnTypes)) |
| 190 | |
| 191 | for _, columnType := range columnTypes { |
| 192 | columnName := columnType.Name() |
| 193 | tableColumn, ok := r.Columns[columnName] |
| 194 | if !ok { |
| 195 | continue |
| 196 | } |
| 197 | |
| 198 | // TODO: when go 1.18 released, replace with that: |
| 199 | /* |
| 200 | tableColumnField, err := val.FieldByIndexErr(tableColumn.FieldIndex) |
| 201 | if err != nil { |
| 202 | return nil, fmt.Errorf("column: %q: %w", tableColumn.Name, err) |
| 203 | } |
| 204 | */ |
| 205 | tableColumnField := val.FieldByIndex(tableColumn.FieldIndex) |
| 206 | |
| 207 | tableColumnFieldType := tableColumnField.Type() |
| 208 | |
| 209 | fieldPtr := reflect.NewAt(tableColumnFieldType, unsafe.Pointer(tableColumnField.UnsafeAddr())).Elem().Addr().Interface() |
| 210 | fieldPtrs = append(fieldPtrs, fieldPtr) |
| 211 | } |
| 212 | |
| 213 | return fieldPtrs, nil |
| 214 | } |
no test coverage detected