func()

in vulndb/snooze.go [96:175]


func (s SnoozeGetter) CSV(ctx context.Context, w io.Writer, header bool) error {
	r := sqlutil.NewRecordType(SnoozeRecord{})
	q := sqlutil.Select(
		r.Fields()...,
	).From(
		"snooze",
	)

	var cond *sqlutil.QueryConditionSet

	if s.Collector != "" {
		cond = sqlutil.Cond().Equal("collector", s.Collector)
	}

	if s.Provider != "" {
		if cond == nil {
			cond = sqlutil.Cond()
		} else {
			cond = cond.And()
		}
		cond = cond.Equal("provider", s.Provider)
	}

	if len(s.FilterCVEs) > 0 {
		if cond == nil {
			cond = sqlutil.Cond()
		} else {
			cond = cond.And()
		}
		cond = cond.In("cve_id", s.FilterCVEs)
	}

	if cond != nil {
		q = q.Where(cond)
	}

	query, args := q.String(), q.QueryArgs()

	if debug.V(1) {
		flog.Infof("running: %q / %#v", query, args)
	}

	rows, err := s.DB.QueryContext(ctx, query, args...)
	if err != nil {
		return errors.Wrap(err, "cannot query snooze")
	}

	defer rows.Close()

	cw := csv.NewWriter(w)
	defer cw.Flush()

	if header {
		cw.Write(r.Fields())
	}

	for rows.Next() {
		var sr SnoozeRecord
		err = rows.Scan(sqlutil.NewRecordType(&sr).Values()...)
		if err != nil {
			return errors.Wrap(err, "cannot scan snooze data")
		}

		var deadline string
		if sr.Deadline.Valid {
			deadline = sr.Deadline.Time.Format(TimeLayout)
		}

		cw.Write([]string{
			sr.Owner,
			sr.Collector,
			sr.Provider,
			sr.CVE,
			deadline,
			string(sr.Metadata),
		})
	}

	return nil
}