(db *sql.DB, crawledNodes []crawlerdb.CrawledNode)
| 39 | } |
| 40 | |
| 41 | func InsertCrawledNodes(db *sql.DB, crawledNodes []crawlerdb.CrawledNode) error { |
| 42 | log.Info("Writing nodes to db", "len", len(crawledNodes)) |
| 43 | |
| 44 | tx, err := db.Begin() |
| 45 | if err != nil { |
| 46 | return err |
| 47 | } |
| 48 | stmt, err := tx.Prepare(` |
| 49 | INSERT INTO nodes( |
| 50 | id, |
| 51 | name, |
| 52 | version_major, |
| 53 | version_minor, |
| 54 | version_patch, |
| 55 | version_tag, |
| 56 | version_build, |
| 57 | version_date, |
| 58 | os_name, |
| 59 | os_architecture, |
| 60 | language_name, |
| 61 | language_version, |
| 62 | last_crawled, |
| 63 | country_name |
| 64 | ) |
| 65 | VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) |
| 66 | ON CONFLICT(id) DO UPDATE |
| 67 | SET |
| 68 | name = excluded.name, |
| 69 | version_major = excluded.version_major, |
| 70 | version_minor = excluded.version_minor, |
| 71 | version_patch = excluded.version_patch, |
| 72 | version_tag = excluded.version_tag, |
| 73 | version_build = excluded.version_build, |
| 74 | version_date = excluded.version_date, |
| 75 | os_name = excluded.os_name, |
| 76 | os_architecture = excluded.os_architecture, |
| 77 | language_name = excluded.language_name, |
| 78 | language_version = excluded.language_version, |
| 79 | last_crawled = excluded.last_crawled, |
| 80 | country_name = excluded.country_name |
| 81 | WHERE |
| 82 | name = excluded.name |
| 83 | OR excluded.name != "unknown" |
| 84 | `) |
| 85 | if err != nil { |
| 86 | return err |
| 87 | } |
| 88 | |
| 89 | // It's possible for us to have the same node scraped multiple times, so |
| 90 | // we want to make sure when we are upserting, we get the most recent |
| 91 | // scrape upserted last. |
| 92 | sort.SliceStable(crawledNodes, func(i, j int) bool { |
| 93 | return strings.Compare(crawledNodes[i].Now, crawledNodes[j].Now) < 0 |
| 94 | }) |
| 95 | |
| 96 | for _, node := range crawledNodes { |
| 97 | parsed := vparser.ParseVersionString(node.ClientType) |
| 98 | if parsed != nil { |
no test coverage detected