ConvertToCreateValues convert to create values
(stmt *gorm.Statement)
| 243 | |
| 244 | // ConvertToCreateValues convert to create values |
| 245 | func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) { |
| 246 | curTime := stmt.DB.NowFunc() |
| 247 | |
| 248 | switch value := stmt.Dest.(type) { |
| 249 | case map[string]interface{}: |
| 250 | values = ConvertMapToValuesForCreate(stmt, value) |
| 251 | case *map[string]interface{}: |
| 252 | values = ConvertMapToValuesForCreate(stmt, *value) |
| 253 | case []map[string]interface{}: |
| 254 | values = ConvertSliceOfMapToValuesForCreate(stmt, value) |
| 255 | case *[]map[string]interface{}: |
| 256 | values = ConvertSliceOfMapToValuesForCreate(stmt, *value) |
| 257 | default: |
| 258 | var ( |
| 259 | selectColumns, restricted = stmt.SelectAndOmitColumns(true, false) |
| 260 | _, updateTrackTime = stmt.Get("gorm:update_track_time") |
| 261 | isZero bool |
| 262 | ) |
| 263 | stmt.Settings.Delete("gorm:update_track_time") |
| 264 | |
| 265 | values = clause.Values{Columns: make([]clause.Column, 0, len(stmt.Schema.DBNames))} |
| 266 | |
| 267 | for _, db := range stmt.Schema.DBNames { |
| 268 | if field := stmt.Schema.FieldsByDBName[db]; !field.HasDefaultValue || field.DefaultValueInterface != nil { |
| 269 | if v, ok := selectColumns[db]; (ok && v) || (!ok && (!restricted || field.AutoCreateTime > 0 || field.AutoUpdateTime > 0)) { |
| 270 | values.Columns = append(values.Columns, clause.Column{Name: db}) |
| 271 | } |
| 272 | } |
| 273 | } |
| 274 | |
| 275 | switch stmt.ReflectValue.Kind() { |
| 276 | case reflect.Slice, reflect.Array: |
| 277 | rValLen := stmt.ReflectValue.Len() |
| 278 | if rValLen == 0 { |
| 279 | stmt.AddError(gorm.ErrEmptySlice) |
| 280 | return |
| 281 | } |
| 282 | |
| 283 | stmt.SQL.Grow(rValLen * 18) |
| 284 | stmt.Vars = make([]interface{}, 0, rValLen*len(values.Columns)) |
| 285 | values.Values = make([][]interface{}, rValLen) |
| 286 | |
| 287 | defaultValueFieldsHavingValue := map[*schema.Field][]interface{}{} |
| 288 | for i := 0; i < rValLen; i++ { |
| 289 | rv := reflect.Indirect(stmt.ReflectValue.Index(i)) |
| 290 | if !rv.IsValid() { |
| 291 | stmt.AddError(fmt.Errorf("slice data #%v is invalid: %w", i, gorm.ErrInvalidData)) |
| 292 | return |
| 293 | } |
| 294 | |
| 295 | values.Values[i] = make([]interface{}, len(values.Columns)) |
| 296 | for idx, column := range values.Columns { |
| 297 | field := stmt.Schema.FieldsByDBName[column.Name] |
| 298 | if values.Values[i][idx], isZero = field.ValueOf(stmt.Context, rv); isZero { |
| 299 | if field.DefaultValueInterface != nil { |
| 300 | values.Values[i][idx] = field.DefaultValueInterface |
| 301 | stmt.AddError(field.Set(stmt.Context, rv, field.DefaultValueInterface)) |
| 302 | } else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 { |