|
|
@@ -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
|
|
|
+}
|