56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
func scanRow(row *sql.Row, dest any) error {
|
|
destValue := reflect.ValueOf(dest).Elem()
|
|
fields := make([]any, destValue.NumField())
|
|
|
|
for i := 0; i < destValue.NumField(); i++ {
|
|
fields[i] = destValue.Field(i).Addr().Interface()
|
|
}
|
|
|
|
return row.Scan(fields...)
|
|
}
|
|
|
|
func ScanRows(rows *sql.Rows, destSlice any) error {
|
|
sliceValue := reflect.ValueOf(destSlice)
|
|
if sliceValue.Kind() != reflect.Pointer || sliceValue.Elem().Kind() != reflect.Slice {
|
|
return fmt.Errorf("destSlice must be a pointer to a slice")
|
|
}
|
|
|
|
sliceElem := sliceValue.Elem()
|
|
structType := sliceElem.Type().Elem()
|
|
|
|
for rows.Next() {
|
|
newStruct := reflect.New(structType).Elem()
|
|
|
|
fields := make([]any, newStruct.NumField())
|
|
for i := 0; i < newStruct.NumField(); i++ {
|
|
fields[i] = newStruct.Field(i).Addr().Interface()
|
|
}
|
|
|
|
if err := rows.Scan(fields...); err != nil {
|
|
return err
|
|
}
|
|
|
|
sliceElem.Set(reflect.Append(sliceElem, newStruct))
|
|
}
|
|
|
|
return rows.Err()
|
|
}
|
|
|
|
func GetStructFieldsPtr(object any) []any {
|
|
destValue := reflect.ValueOf(object).Elem()
|
|
fields := make([]any, destValue.NumField())
|
|
|
|
for i := 0; i < destValue.NumField(); i++ {
|
|
fields[i] = destValue.Field(i).Addr().Interface()
|
|
}
|
|
return fields
|
|
}
|