in mysql/mysql.go [152:212]
func (m MySQL) PublishWithDelay(date time.Time, sched *schedule.Schedule, delay time.Duration) (err error) {
// First, we check to see if there is a schedule present
tx, err := m.db.Begin()
if err != nil {
return errors.Wrap(err, "failed to begin transaction")
}
// We must either commit or rollback at the end
defer func() {
switch err {
case nil:
err = tx.Commit()
case schedstore.ErrAlreadyExists:
// We want to return ErrAlreadyExists even if the transaction commit
// fails
_ = tx.Commit()
default:
_ = tx.Rollback()
}
}()
exists, err := schedExists(tx, date)
if err != nil {
return err
}
if exists {
return schedstore.ErrAlreadyExists
}
if delay > 0 {
time.Sleep(delay)
}
query := "INSERT INTO schedules (date, time, app, account, region, stack, cluster) VALUES (?, ?, ?, ?, ?, ?, ?)"
stmt, err := tx.Prepare(query)
if err != nil {
return errors.Wrapf(err, "failed to prepare sql statement: %s", query)
}
for _, entry := range sched.Entries() {
var app, account, region, stack, cluster string
app = entry.Group.App()
account = entry.Group.Account()
if val, ok := entry.Group.Region(); ok {
region = val
}
if val, ok := entry.Group.Stack(); ok {
stack = val
}
if val, ok := entry.Group.Cluster(); ok {
cluster = val
}
_, err = stmt.Exec(utcDate(date), entry.Time.In(time.UTC), app, account, region, stack, cluster)
if err != nil {
return errors.Wrapf(err, "failed to execute prepared query")
}
}
return nil
}