func()

in vulndb/export.go [109:190]


func (exp DataExporter) CSV(ctx context.Context, w io.Writer, header bool) error {
	q := sqlutil.Select(
		"d.owner",
		"d.provider",
		"d.cve_id",
		"d.published",
		"d.modified",
		"d.base_score",
		"d.summary",
	).From().SelectGroup(
		"d",
		exp.selectVendorData(
			"vendor.owner",
			"vendor.provider",
			"vendor_data.cve_id",
			"vendor_data.published",
			"vendor_data.modified",
			"vendor_data.base_score",
			"vendor_data.summary",
		).Literal("UNION ALL").
			Select(exp.selectOverrides(
				"custom_data.owner",
				"custom_data.provider",
				"custom_data.cve_id",
				"custom_data.published",
				"custom_data.modified",
				"custom_data.base_score",
				"custom_data.summary",
			)),
	)

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

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

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

	defer rows.Close()

	record := struct {
		Owner     string    `sql:"owner"`
		Provider  string    `sql:"provider"`
		CVE       string    `sql:"cve_id"`
		Published time.Time `sql:"published"`
		Modified  time.Time `sql:"modified"`
		BaseScore float64   `sql:"base_score"`
		Summary   string    `sql:"summary"`
	}{}

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

	if header {
		fields := sqlutil.NewRecordType(record).Fields()
		cw.Write(fields)
	}

	for rows.Next() {
		v := record
		err = rows.Scan(sqlutil.NewRecordType(&v).Values()...)
		if err != nil {
			return errors.Wrap(err, "cannot scan export data")
		}

		cw.Write([]string{
			v.Owner,
			v.Provider,
			v.CVE,
			v.Published.Format(TimeLayout),
			v.Modified.Format(TimeLayout),
			strconv.FormatFloat(v.BaseScore, 'f', 3, 64),
			v.Summary,
		})
	}

	return nil
}