forked from ethereum/node-crawler
-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdatabase.go
More file actions
110 lines (103 loc) · 2.58 KB
/
Copy pathdatabase.go
File metadata and controls
110 lines (103 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"database/sql"
"fmt"
"time"
"github.com/MariusVanDerWijden/node-crawler-backend/input"
"github.com/MariusVanDerWijden/node-crawler-backend/parser"
)
func createDB(db *sql.DB) error {
sqlStmt := `
CREATE TABLE nodes (
ID text not null,
name text,
version_major number,
version_minor number,
version_patch number,
version_tag text,
version_build text,
version_date text,
os_name text,
os_architecture text,
language_name text,
language_version text,
last_crawled datetime,
PRIMARY KEY (ID)
);
delete from nodes;
`
_, err := db.Exec(sqlStmt)
return err
}
func InsertCrawledNodes(db *sql.DB, crawledNodes []input.CrawledNode) error {
fmt.Printf("Writing nodes to db: %v\n", len(crawledNodes))
tx, err := db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare(
`insert into nodes(
ID,
name,
version_major, version_minor, version_patch, version_tag, version_build, version_date,
os_name, os_architecture,
language_name, language_version, last_crawled)
values(?,?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(ID) DO UPDATE SET
name=excluded.name,
version_major=excluded.version_major,
version_minor=excluded.version_minor,
version_patch=excluded.version_patch,
version_tag=excluded.version_tag,
version_build=excluded.version_build,
version_date=excluded.version_date,
os_name=excluded.os_name,
os_architecture=excluded.os_architecture,
language_name=excluded.language_name,
language_version=excluded.language_version,
last_crawled=excluded.last_crawled
WHERE name=excluded.name OR excluded.name != "unknown"`)
if err != nil {
return err
}
for _, node := range crawledNodes {
parsed := parser.ParseVersionString(node.ClientType)
_, err = stmt.Exec(
node.ID,
parsed.Name,
parsed.Version.Major,
parsed.Version.Minor,
parsed.Version.Patch,
parsed.Version.Tag,
parsed.Version.Build,
parsed.Version.Date,
parsed.Os.Os,
parsed.Os.Architecture,
parsed.Language.Name,
parsed.Language.Version,
time.Now(),
)
if err != nil {
panic(err)
}
}
return tx.Commit()
}
func dropOldNodes(db *sql.DB, minTimePassed time.Duration) error {
fmt.Printf("Dropping all nodes older than: %v\n", minTimePassed)
oldest := time.Now().Add(-minTimePassed)
tx, err := db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare(`DELETE FROM nodes WHERE last_crawled < ?`)
if err != nil {
return err
}
res, err := stmt.Exec(oldest)
if err != nil {
return err
}
affected, _ := res.RowsAffected()
fmt.Printf("Dropped %v nodes\n", affected)
return tx.Commit()
}