in vulndb/vendor.go [271:344]
func (v VendorDataExporter) CSV(ctx context.Context, w io.Writer, header bool) error {
q := sqlutil.Select(
"vendor.version AS version",
"vendor.ts AS ts",
"vendor.owner AS owner",
"vendor.provider AS provider",
"vendor_data.cve_id AS cve_id",
"vendor_data.published AS published",
"vendor_data.modified AS modified",
"vendor_data.base_score AS base_score",
"vendor_data.summary AS summary",
).From(
"vendor_data",
).Literal(
"LEFT JOIN vendor ON vendor.version = vendor_data.version",
).Where(
v.condition(),
)
query, args := q.String(), q.QueryArgs()
if debug.V(1) {
flog.Infof("running: %q / %#v", query, args)
}
rows, err := v.DB.QueryContext(ctx, query, args...)
if err != nil {
return errors.Wrap(err, "cannot query vendor data")
}
defer rows.Close()
record := struct {
Version string `sql:"version"`
TS time.Time `sql:"ts"`
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 vendor data")
}
cw.Write([]string{
v.Version,
v.TS.Format(TimeLayout),
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
}