This commit is contained in:
aozhiwei 2024-08-06 11:50:16 +08:00
parent c3814ee3af
commit cf0959d4bd

View File

@ -3,6 +3,8 @@ package f5
import (
"database/sql"
"q5"
"reflect"
"errors"
)
type DataSet struct {
@ -150,6 +152,93 @@ func (this *DataSet) GetRawValueByIndex(index int32) *string {
}
}
func UnmarshalModelList[T any](ds *DataSet, models *[]*T) error {
var resultErr error
for ds.Next() {
p := new(T)
resultErr = UnmarshalModel(ds, p)
if resultErr != nil {
*models = (*models)[:0]
break
}
q5.AppendSlice(models, p)
}
return resultErr
}
func UnmarshalModel[T any](ds *DataSet, m *T) error {
mType := reflect.TypeOf(m)
mVal := reflect.ValueOf(m)
for i := 0; i < mType.NumField(); i++ {
field := mType.Field(i)
gormTag := field.Tag.Get("gorm")
if gormTag == "" {
continue
}
gormFieldName := ""
gormIsJson := false
params := q5.StrSplit(gormTag, ";")
for _, val := range params {
tmpStrs := q5.StrSplit(val, ":")
if len(tmpStrs) == 2 {
if tmpStrs[0] == "column" {
gormFieldName = tmpStrs[1]
}
if tmpStrs[0] == "serializer" {
gormIsJson = true
if tmpStrs[1] != "json" {
return errors.New("gorm unknow serializer:" + tmpStrs[1])
}
}
}
}
if gormFieldName == "" {
return errors.New("gormFieldName is empty")
}
fieldVal := ds.GetByName(gormFieldName)
if gormIsJson {
q5.DecodeJson(fieldVal, mVal.Field(i))
} else {
switch field.Type.Kind() {
case reflect.Bool:
{
if fieldVal == "" || fieldVal == "0" {
mVal.Field(i).SetBool(false)
} else {
mVal.Field(i).SetBool(true)
}
}
case reflect.Int:
case reflect.Int8:
case reflect.Int16:
case reflect.Int32:
case reflect.Int64:
{
mVal.Field(i).SetInt(q5.ToInt64(fieldVal))
}
case reflect.Uint:
case reflect.Uint8:
case reflect.Uint16:
case reflect.Uint32:
case reflect.Uint64:
{
mVal.Field(i).SetUint(uint64(q5.ToInt64(fieldVal)))
}
case reflect.Float32:
case reflect.Float64:
{
mVal.Field(i).SetFloat(q5.ToFloat64(fieldVal))
}
case reflect.String:
{
mVal.Field(i).SetString(fieldVal)
}
}
}
}
return nil
}
func newDataSet(rows *sql.Rows) *DataSet {
dataSet := new(DataSet)
dataSet.init(rows)