From cf0959d4bd0cee6e8cad378defe82fd478851368 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Aug 2024 11:50:16 +0800 Subject: [PATCH] 1 --- dataset.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/dataset.go b/dataset.go index 8613292..17d58ba 100644 --- a/dataset.go +++ b/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)