Browse Source

完成sqlmapping默认使用

yjp 1 year ago
parent
commit
b24aac63ac
2 changed files with 134 additions and 2 deletions
  1. 2 2
      tag/sql/sql_mapping/tag.go
  2. 132 0
      tag/sql/sql_mapping/usage.go

+ 2 - 2
tag/sql/sql_mapping/tag.go

@@ -35,8 +35,8 @@ type Tag struct {
 	IsKey          bool
 	CanUpdate      bool
 	CanUpdateClear bool
-	AESKey         string
 	JoinWith       string
+	AESKey         string
 	Trim           string
 	TrimPrefix     string
 	TrimSuffix     string
@@ -99,8 +99,8 @@ func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
 		IsKey:          false,
 		CanUpdate:      true,
 		CanUpdateClear: false,
-		AESKey:         "",
 		JoinWith:       defaultJoinWith,
+		AESKey:         "",
 		Trim:           "",
 		TrimPrefix:     "",
 		TrimSuffix:     "",

+ 132 - 0
tag/sql/sql_mapping/usage.go

@@ -1 +1,133 @@
 package sql_mapping
+
+import (
+	"git.sxidc.com/go-tools/utils/encoding"
+	"git.sxidc.com/go-tools/utils/reflectutils"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"git.sxidc.com/service-supports/fserr"
+	"reflect"
+	"strings"
+	"time"
+)
+
+const (
+	timeWriteFormat = time.DateTime + ".000000 +08:00"
+)
+
+type Field struct {
+	ColumnName     string
+	IsKey          bool
+	CanUpdate      bool
+	CanUpdateClear bool
+	SqlValue       string
+}
+
+func DefaultUsage(e any) ([]Field, error) {
+	fields := make([]Field, 0)
+
+	err := UseTag(e, defaultCallback(&fields))
+	if err != nil {
+		return nil, err
+	}
+
+	return fields, nil
+}
+
+func defaultCallback(fields *[]Field) OnParsedFieldTagFunc {
+	return func(fieldName string, entityFieldElemValue reflect.Value, tag *Tag) error {
+		field := &Field{
+			ColumnName:     tag.Name,
+			IsKey:          tag.IsKey,
+			CanUpdate:      tag.CanUpdate,
+			CanUpdateClear: tag.CanUpdateClear,
+			SqlValue:       "",
+		}
+
+		if entityFieldElemValue.IsZero() {
+			return nil
+		}
+
+		entityFieldKind := reflectutils.GroupValueKind(entityFieldElemValue)
+		var entityFieldValue any
+
+		switch entityFieldKind {
+		case reflect.Struct:
+			if !reflectutils.IsValueTime(entityFieldElemValue) {
+				return fserr.New(fieldName + "Error: 解析tag内部错误,除time.Time类型之外的结构被回调")
+			}
+
+			entityFieldValue = entityFieldElemValue.Interface().(time.Time).Format(timeWriteFormat)
+		case reflect.Slice:
+			if !reflectutils.IsSliceValueOf(entityFieldElemValue, reflect.String) {
+				return fserr.New(fieldName + "Error: slice仅支持[]string")
+			}
+
+			entityFieldValue = strings.Join(entityFieldElemValue.Interface().([]string), tag.JoinWith)
+		default:
+			entityFieldValue = entityFieldElemValue.Interface()
+		}
+
+		sqlValue, err := toSqlValue(entityFieldValue, tag)
+		if err != nil {
+			return err
+		}
+
+		field.SqlValue = sqlValue
+		*fields = append(*fields, *field)
+
+		return nil
+	}
+}
+
+func toSqlValue(value any, tag *Tag) (string, error) {
+	switch v := value.(type) {
+	case string:
+		retValue, err := postDeal(v, tag)
+		if err != nil {
+			return "", err
+		}
+
+		return retValue, nil
+	default:
+		var sqlValue string
+
+		err := reflectutils.AssignStringValue(v, reflect.ValueOf(sqlValue))
+		if err != nil {
+			return "", err
+		}
+
+		retValue, err := postDeal(sqlValue, tag)
+		if err != nil {
+			return "", err
+		}
+
+		return retValue, nil
+	}
+}
+
+func postDeal(value string, tag *Tag) (string, error) {
+	retValue := value
+
+	if strutils.IsStringNotEmpty(tag.Trim) {
+		retValue = strings.Trim(retValue, tag.Trim)
+	} else {
+		if strutils.IsStringNotEmpty(tag.TrimPrefix) {
+			retValue = strings.TrimPrefix(retValue, tag.TrimPrefix)
+		}
+
+		if strutils.IsStringNotEmpty(tag.TrimSuffix) {
+			retValue = strings.TrimSuffix(retValue, tag.TrimSuffix)
+		}
+	}
+
+	if strutils.IsStringNotEmpty(tag.AESKey) {
+		encryptedValue, err := encoding.AESEncrypt(retValue, tag.AESKey)
+		if err != nil {
+			return "", err
+		}
+
+		retValue = encryptedValue
+	}
+
+	return retValue, nil
+}