// DELETEs the data it returns func (db FlightDB) ExtractTrackFragments(icao string, callsign string) ([]f.Track, error) { q := datastore. NewQuery(kTrackFragmentKind). Filter("Icao24 = ", icao). Filter("Callsign = ", callsign) ftfs := []f.FrozenTrackFragment{} if keys, err := q.GetAll(db.C, &ftfs); err != nil { return nil, err } else { out := []f.Track{} for _, ftf := range ftfs { t := f.Track{} if err := t.Base64Decode(ftf.TrackBase64); err != nil { return nil, err } out = append(out, t) } // OK, safe to delete !! if true { if err := datastore.DeleteMulti(db.C, keys); err != nil { return nil, err } } return out, nil } }
func addtrackHandler(w http.ResponseWriter, r *http.Request) { ctx := req2ctx(r) db := fdb.NewDB(r) icaoId := r.FormValue("icaoid") callsign := strings.TrimSpace(r.FormValue("callsign")) tStr := r.FormValue("track") // Validate it works before persisting t := ftype.Track{} if err := t.Base64Decode(tStr); err != nil { log.Errorf(ctx, " /mdb/addtrack: decode failed: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) } ftf := ftype.FrozenTrackFragment{ TrackBase64: tStr, Callsign: callsign, Icao24: icaoId, } if err := db.AddTrackFrgament(ftf); err != nil { log.Errorf(ctx, " /mdb/addtrack: db.AddTrackFragment failed: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) } // 3. Routine to merge track fragments ? Extra credit ? // c.Infof(" /mdb/addtrack: added %d points for [%s][%s]", len(t), icaoId, callsign) w.Write([]byte(fmt.Sprintf("Added %d for %s\n", len(t), icaoId))) }
// Leaves data intact ! There is some scope for refactoring here. func (db FlightDB) ReadTrackFragments(icao string, callsign string) ([]f.Track, error) { q := datastore. NewQuery(kTrackFragmentKind). Filter("Icao24 = ", icao). Filter("Callsign = ", callsign) ftfs := []f.FrozenTrackFragment{} if _, err := q.GetAll(db.C, &ftfs); err != nil { return nil, err } else { out := []f.Track{} for _, ftf := range ftfs { t := f.Track{} if err := t.Base64Decode(ftf.TrackBase64); err != nil { return nil, err } out = append(out, t) } return out, nil } }