package exec import ( "database/sql" "errors" "reflect" "git.gdulai.com/gdulai/simpleorm" "git.gdulai.com/gdulai/simpleorm/schema" log "gitlab.com/gdulai/simpleloglvl" ) type Update[T any] struct { target schema.Table toUpdate T } func NewUpdate[T any](orm *simpleorm.ORM, toUpdate T) (Update[T], error) { table, ok := orm.Cache().Get(reflect.TypeFor[T]().Name()) if !ok { return Update[T]{}, errors.New("Failed to get table from schema cache") } return Update[T]{target: *table, toUpdate: toUpdate}, nil } func (u Update[T]) Execute(conn *simpleorm.DBConnection) error { return u.execute(conn, nil) } func (u Update[T]) execute(conn *simpleorm.DBConnection, tx *sql.Tx) error { dml, err := u.target.GetUpdateDML() if err != nil { return err } params := prepareParams(u.toUpdate, u.target) pkCols, err := getPk(u.toUpdate, u.target) if err != nil { return err } // Put the pks back at the end for _, pk := range pkCols { params = append(params, pk) } log.LogDebug("%s [%s]", dml, params) var stmt *sql.Stmt if tx != nil { stmt, err = tx.Prepare(dml) } else { stmt, err = conn.Prepare(dml) } defer stmt.Close() result, err := stmt.Exec(params...) if err != nil { return err } else { rowsAffected, _ := result.RowsAffected() log.LogInfo("Updated %s row", rowsAffected) } return nil }