mirror of https://github.com/jlelse/GoBlog
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/araddon/dateparse"
|
|
)
|
|
|
|
func (db *database) enqueue(name string, content []byte, schedule time.Time) error {
|
|
if len(content) == 0 {
|
|
return errors.New("empty content")
|
|
}
|
|
_, err := db.exec("insert into queue (name, content, schedule) values (@name, @content, @schedule)",
|
|
sql.Named("name", name), sql.Named("content", content), sql.Named("schedule", schedule.UTC().String()))
|
|
return err
|
|
}
|
|
|
|
type queueItem struct {
|
|
id int
|
|
name string
|
|
content []byte
|
|
schedule *time.Time
|
|
}
|
|
|
|
func (db *database) reschedule(qi *queueItem, dur time.Duration) error {
|
|
_, err := db.exec("update queue set schedule = @schedule, content = @content where id = @id", sql.Named("schedule", qi.schedule.Add(dur).UTC().String()), sql.Named("content", qi.content), sql.Named("id", qi.id))
|
|
return err
|
|
}
|
|
|
|
func (db *database) dequeue(qi *queueItem) error {
|
|
_, err := db.exec("delete from queue where id = @id", sql.Named("id", qi.id))
|
|
return err
|
|
}
|
|
|
|
func (db *database) peekQueue(name string) (*queueItem, error) {
|
|
row, err := db.queryRow("select id, name, content, schedule from queue where schedule <= @schedule and name = @name order by schedule asc limit 1", sql.Named("name", name), sql.Named("schedule", time.Now().UTC().String()))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
qi := &queueItem{}
|
|
var timeString string
|
|
if err = row.Scan(&qi.id, &qi.name, &qi.content, &timeString); err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
t, err := dateparse.ParseLocal(timeString)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
t = t.Local()
|
|
qi.schedule = &t
|
|
return qi, nil
|
|
}
|