| 17 | var initSql string |
| 18 | |
| 19 | func Sqlite(report Report, out string) { |
| 20 | |
| 21 | dbFile := out |
| 22 | db, err := sql.Open("sqlite", dbFile) |
| 23 | if err != nil { |
| 24 | logs.Error(err) |
| 25 | } |
| 26 | defer db.Close() |
| 27 | |
| 28 | if _, err := os.Stat(dbFile); err != nil { |
| 29 | logs.Info("initing database: " + dbFile) |
| 30 | _, err = db.Exec(initSql) |
| 31 | if err != nil { |
| 32 | logs.Warn(err) |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | moduleName := filepath.Base(report.TaskInfo.AppName) |
| 37 | |
| 38 | if report.DepDetailGraph != nil && report.DepDetailGraph.Name != "" { |
| 39 | moduleName = report.DepDetailGraph.Name |
| 40 | } |
| 41 | |
| 42 | logs.Debugf("sql report of %s", moduleName) |
| 43 | insertFmt := "insert or ignore into component (name, version, vendor, language, purl) values ('%s','%s','%s','%s','%s');\n" |
| 44 | insertRef := "insert or ignore into reference (module_name, purl) values ('%s','%s');\n" |
| 45 | |
| 46 | report.DepDetailGraph.ForEach(func(n *detail.DepDetailGraph) bool { |
| 47 | if n.Name == "" { |
| 48 | return true |
| 49 | } |
| 50 | _, err := db.Exec("insert or ignore into component (name, version, vendor, language, purl) values (?,?,?,?,?)", n.Name, n.Version, n.Vendor, n.Language, n.Purl()) |
| 51 | if err != nil { |
| 52 | logs.Debugf(insertFmt, quoteEscape(n.Name), quoteEscape(n.Version), quoteEscape(n.Vendor), quoteEscape(n.Language), quoteEscape(n.Purl())) |
| 53 | logs.Warn(err) |
| 54 | } |
| 55 | return true |
| 56 | }) |
| 57 | |
| 58 | report.DepDetailGraph.ForEach(func(n *detail.DepDetailGraph) bool { |
| 59 | if n.Name == "" { |
| 60 | return true |
| 61 | } |
| 62 | _, err := db.Exec("insert or ignore into reference (module_name, purl) values (?, ?)", moduleName, n.Purl()) |
| 63 | if err != nil { |
| 64 | logs.Debugf(insertRef, moduleName, quoteEscape(n.Purl())) |
| 65 | logs.Warn(err) |
| 66 | } |
| 67 | return true |
| 68 | }) |
| 69 | |
| 70 | } |
| 71 | |
| 72 | // quoteEscape 转义单引号 |
| 73 | func quoteEscape(src string) (out string) { |