Example #1
0
File: store.go Project: andrebq/exp
func fetchLatestMessage(msg *pandora.Message, db querier, inbox string, now time.Time, dur time.Duration) error {
	err := reEnqueueMessages(db, now)
	if err != nil {
		return err
	}
	inboxId, err := findInbox(db, inbox, false)
	if err != nil {
		return err
	}
	var buf []byte
	var id int64
	err = db.QueryRow(`select id, mid, status, receivedat, sendwhen, deliverycount
		from pgstore_messages
		where receiverid = $1
			and lid is null
			and sendwhen <= $2
			and status <> $3
		order by sendwhen asc
		limit 1`, inboxId, now, pandora.StatusConfirmed).Scan(&id, &buf, &msg.Status, &msg.ReceivedAt, &msg.SendWhen, &msg.DeliveryCount)
	if err == sql.ErrNoRows {
		return pandora.ErrNoMessages
	}
	if err != nil {
		return err
	}
	msg.Mid = &pandora.SHA1Key{}
	copy(msg.Mid.Bytes(), buf)
	msg.CalcualteLeaseFor(now, dur)

	_, err = db.Exec("update pgstore_messages set lid = $1, deliverycount = deliverycount + 1, leaseuntil = $2 where id = $3", msg.Lid.Bytes(), msg.LeasedUntil, id)
	return err
}