|
|
@@ -1,13 +1,36 @@
|
|
|
package sdk
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
+ "git.sxidc.com/go-tools/utils/strutils"
|
|
|
"git.sxidc.com/service-supports/ds-sdk/sdk/raw_sql_tpl"
|
|
|
"git.sxidc.com/service-supports/ds-sdk/sdk/tag"
|
|
|
+ "reflect"
|
|
|
+ "strconv"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
-type InsertCallback[T any] func(e T)
|
|
|
+const (
|
|
|
+ timeWriteFormat = time.DateTime + ".000000 +08:00"
|
|
|
+ createdTimeFieldName = "CreatedTime"
|
|
|
+ lastUpdatedTimeFieldName = "LastUpdatedTime"
|
|
|
+)
|
|
|
+
|
|
|
+type InsertCallback[T any] func(e T, fieldName string, value any) (retValue any, err error)
|
|
|
|
|
|
func Insert[T any](sdk *SDK, tableName string, e T, callback InsertCallback[T]) error {
|
|
|
+ if sdk == nil {
|
|
|
+ return errors.New("没有传递sdk")
|
|
|
+ }
|
|
|
+
|
|
|
+ if strutils.IsStringEmpty(tableName) {
|
|
|
+ return errors.New("没有传递表名")
|
|
|
+ }
|
|
|
+
|
|
|
+ if reflect.TypeOf(e) == nil {
|
|
|
+ return errors.New("没有传递实体")
|
|
|
+ }
|
|
|
+
|
|
|
sqlMapping, err := tag.ParseSqlMapping(e)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -17,20 +40,92 @@ func Insert[T any](sdk *SDK, tableName string, e T, callback InsertCallback[T])
|
|
|
TableName: tableName,
|
|
|
}
|
|
|
|
|
|
- for column, sqlMappingColumn := range sqlMapping.ColumnMap {
|
|
|
+ now := time.Now()
|
|
|
+
|
|
|
+ for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
|
|
|
+ fieldType := sqlMappingColumn.FieldType
|
|
|
+
|
|
|
+ value := reflect.Zero(fieldType).Interface()
|
|
|
+ if !sqlMappingColumn.FieldValue.IsZero() {
|
|
|
+ value = sqlMappingColumn.FieldValue.Interface()
|
|
|
+ }
|
|
|
+
|
|
|
if sqlMappingColumn.InsertCallback {
|
|
|
- if callback != nil {
|
|
|
- //callback(column)
|
|
|
+ if callback == nil {
|
|
|
+ return errors.New("需要使用回调函数但是没有传递回调函数")
|
|
|
+ }
|
|
|
+
|
|
|
+ retValue, err := callback(e, fieldName, value)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ retValueType := reflect.TypeOf(retValue)
|
|
|
+ if retValueType == nil || retValueType.Kind() == reflect.Ptr {
|
|
|
+ return errors.New("返回应当为值类型")
|
|
|
}
|
|
|
+
|
|
|
+ value = retValue
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fieldName == createdTimeFieldName || fieldName == lastUpdatedTimeFieldName) &&
|
|
|
+ fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
|
|
|
+ value = now
|
|
|
+ }
|
|
|
+
|
|
|
+ tableRowValue, err := parseValue(value)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
executeParams.TableRows = append(executeParams.TableRows, raw_sql_tpl.TableRow{
|
|
|
- Column: column,
|
|
|
- Value: "",
|
|
|
+ Column: sqlMappingColumn.Name,
|
|
|
+ Value: tableRowValue,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- //sdk.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParams)
|
|
|
+ executeParamsMap, err := executeParams.Map()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = sdk.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParamsMap)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+func parseValue(value any) (string, error) {
|
|
|
+ switch v := value.(type) {
|
|
|
+ case string:
|
|
|
+ return "'" + v + "'", nil
|
|
|
+ case bool:
|
|
|
+ return strconv.FormatBool(v), nil
|
|
|
+ case time.Time:
|
|
|
+ return "'" + v.Format(timeWriteFormat) + "'", nil
|
|
|
+ case int:
|
|
|
+ return strconv.Itoa(v), nil
|
|
|
+ case int8:
|
|
|
+ return strconv.FormatInt(int64(v), 10), nil
|
|
|
+ case int16:
|
|
|
+ return strconv.FormatInt(int64(v), 10), nil
|
|
|
+ case int32:
|
|
|
+ return strconv.FormatInt(int64(v), 10), nil
|
|
|
+ case int64:
|
|
|
+ return strconv.FormatInt(v, 10), nil
|
|
|
+ case uint:
|
|
|
+ return strconv.FormatUint(uint64(v), 10), nil
|
|
|
+ case uint8:
|
|
|
+ return strconv.FormatUint(uint64(v), 10), nil
|
|
|
+ case uint16:
|
|
|
+ return strconv.FormatUint(uint64(v), 10), nil
|
|
|
+ case uint32:
|
|
|
+ return strconv.FormatUint(uint64(v), 10), nil
|
|
|
+ case uint64:
|
|
|
+ return strconv.FormatUint(v, 10), nil
|
|
|
+ default:
|
|
|
+ return "", errors.New("不支持的类型")
|
|
|
+ }
|
|
|
+}
|