コード例 #1
0
ファイル: gae_main.go プロジェクト: TimSylvester/bitwrk
// Transactional function to enqueue a bid, while keeping accounts in balance
func EnqueueBid(c appengine.Context, bid *Bid) (*datastore.Key, error) {
	var bidKey *datastore.Key
	f := func(c appengine.Context) error {
		dao := NewGaeAccountingDao(c, true)

		if err := bid.CheckBalance(dao); err != nil {
			return err
		}

		//parentKey := ArticleKey(c, bid.Article)
		//parentKey := AccountKey(c, bid.Participant)
		if key, err := datastore.Put(c, datastore.NewIncompleteKey(c, "Bid", nil), bidCodec{bid}); err != nil {
			return err
		} else {
			bidKey = key
		}

		if err := bid.Book(dao, bidKey.Encode()); err != nil {
			return err
		}

		if err := addRetireBidTask(c, bidKey.Encode(), bid); err != nil {
			return err
		}

		// Encode the new bid as a hotBid and put it into a pull queue
		hot := newHotBid(bidKey, bid)
		if bytes, err := json.Marshal(*hot); err != nil {
			return err
		} else {
			var task taskqueue.Task
			task.Method = "PULL"
			task.Payload = bytes
			task.Tag = string(bid.Article)
			taskqueue.Add(c, &task, "hotbids")
		}

		return dao.Flush()
	}

	if err := datastore.RunInTransaction(c, f, &datastore.TransactionOptions{XG: true}); err != nil {
		return nil, err
	}

	return bidKey, nil
}