(ctx context.Context, model Model, withValidations bool, isForAuxDB bool)
| 271 | } |
| 272 | |
| 273 | func (app *BaseApp) create(ctx context.Context, model Model, withValidations bool, isForAuxDB bool) error { |
| 274 | event := new(ModelEvent) |
| 275 | event.App = app |
| 276 | event.Context = ctx |
| 277 | event.Type = ModelEventTypeCreate |
| 278 | event.Model = model |
| 279 | |
| 280 | saveErr := app.OnModelCreate().Trigger(event, func(e *ModelEvent) error { |
| 281 | // run validations (if any) |
| 282 | if withValidations { |
| 283 | validateErr := e.App.ValidateWithContext(e.Context, e.Model) |
| 284 | if validateErr != nil { |
| 285 | return validateErr |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | // db write |
| 290 | return e.App.OnModelCreateExecute().Trigger(event, func(e *ModelEvent) error { |
| 291 | var db dbx.Builder |
| 292 | if isForAuxDB { |
| 293 | db = e.App.AuxNonconcurrentDB() |
| 294 | } else { |
| 295 | db = e.App.NonconcurrentDB() |
| 296 | } |
| 297 | |
| 298 | dbErr := baseLockRetry(func(attempt int) error { |
| 299 | if m, ok := e.Model.(DBExporter); ok { |
| 300 | data, err := m.DBExport(e.App) |
| 301 | if err != nil { |
| 302 | return err |
| 303 | } |
| 304 | |
| 305 | // manually add the id to the data if missing |
| 306 | if _, ok := data[idColumn]; !ok { |
| 307 | data[idColumn] = e.Model.PK() |
| 308 | } |
| 309 | |
| 310 | if cast.ToString(data[idColumn]) == "" { |
| 311 | return errors.New("empty primary key is not allowed when using the DBExporter interface") |
| 312 | } |
| 313 | |
| 314 | _, err = db.Insert(e.Model.TableName(), data).WithContext(e.Context).Execute() |
| 315 | |
| 316 | return err |
| 317 | } |
| 318 | |
| 319 | return db.Model(e.Model).WithContext(e.Context).Insert() |
| 320 | }, defaultMaxLockRetries) |
| 321 | if dbErr != nil { |
| 322 | return dbErr |
| 323 | } |
| 324 | |
| 325 | e.Model.MarkAsNotNew() |
| 326 | |
| 327 | return nil |
| 328 | }) |
| 329 | }) |
| 330 | if saveErr != nil { |
no test coverage detected