Пример #1
0
// This kind of iterator expects to last more than 60s, which is when a regular datastore
// iterator will timeout (it thinks its view of the world is too stale)
// Instead, we just grab all the keys up front, and than instantiate them one at a time.
func (db FlightDB) LongIterWith(q *datastore.Query, flightProcFunc func(*f.Flight)) error {
	keys, err := q.KeysOnly().GetAll(db.C, nil)
	if err != nil {
		return err
	}

	for _, key := range keys {
		blob := f.FrozenFlight{}

		if err := datastore.Get(db.C, key, &blob); err != nil {
			return err
		}

		if flight, err := blob.Thaw(); err != nil {
			return err
		} else {
			//flight.EnterUTC,flight.LeaveUTC = flight.Track.TimesInBox(sfo.KBoxSnarfingCatchment)
			flight.SetDatastoreKey(key.Encode())

			flightProcFunc(flight)
		}
	}

	return nil
}
Пример #2
0
func (db FlightDB) KeyToFlight(key *datastore.Key) (*f.Flight, error) {
	ff := f.FrozenFlight{}
	if err := datastore.Get(db.C, key, &ff); err != nil {
		return nil, err
	}

	flight, err := ff.Thaw()
	if err != nil {
		return nil, err
	}

	flight.EnterUTC, flight.LeaveUTC = flight.Track.TimesInBox(sfo.KBoxSnarfingCatchment)
	flight.SetDatastoreKey(key.Encode())

	return flight, nil
}
Пример #3
0
func (fi *FlightIterator) NextWithErr() (*f.Flight, error) {
	fflight := f.FrozenFlight{}
	_, err := fi.Iter.Next(&fflight)
	if err == datastore.Done {
		return nil, nil // We're all done
	}
	if err != nil {
		fi.C.Errorf("iter.Next: %v", err)
		return nil, err
	}

	if flight, err := fflight.Thaw(); err != nil {
		return nil, err
	} else {
		flight.EnterUTC, flight.LeaveUTC = flight.Track.TimesInBox(sfo.KBoxSnarfingCatchment)
		return flight, nil
	}
}