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
}