// 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 }
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 }
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 } }