1
This commit is contained in:
parent
c3814ee3af
commit
cf0959d4bd
89
dataset.go
89
dataset.go
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user