Sergiusz Bazanski | 1fad2e5 | 2019-08-01 20:16:27 +0200 | [diff] [blame] | 1 | package model |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "fmt" |
| 6 | "strconv" |
| 7 | "time" |
| 8 | |
| 9 | "github.com/golang/glog" |
| 10 | "github.com/jmoiron/sqlx" |
| 11 | ) |
| 12 | |
| 13 | func (s *sqlModel) GetPeerCheckResults(ctx context.Context, asn []int64) ([]*PeerCheckResult, error) { |
| 14 | asns := make([]string, len(asn)) |
| 15 | for i, asn := range asn { |
| 16 | asns[i] = fmt.Sprintf("%d", asn) |
| 17 | } |
| 18 | |
| 19 | data := []struct { |
| 20 | sqlPeer `db:"peers"` |
| 21 | sqlPeerCheck `db:"peer_checks"` |
| 22 | }{} |
| 23 | q := ` |
| 24 | SELECT |
| 25 | peers.asn "peers.asn", |
| 26 | peer_checks.check_name "peer_checks.check_name", |
| 27 | peer_checks.check_time "peer_checks.check_time", |
| 28 | peer_checks.check_status "peer_checks.check_status", |
| 29 | peer_checks.check_message "peer_checks.check_message" |
| 30 | FROM peers |
| 31 | LEFT JOIN peer_checks |
| 32 | ON peers.id = peer_checks.peer_id |
| 33 | WHERE peers.asn IN (?) |
| 34 | ` |
| 35 | query, args, err := sqlx.In(q, asns) |
| 36 | if err != nil { |
| 37 | return nil, fmt.Errorf("SELECT peers: %v", err) |
| 38 | } |
| 39 | |
| 40 | query = s.db.Rebind(query) |
| 41 | if err := s.db.SelectContext(ctx, &data, query, args...); err != nil { |
| 42 | return nil, fmt.Errorf("SELECT peers: %v", err) |
| 43 | } |
| 44 | |
| 45 | res := make([]*PeerCheckResult, len(data)) |
| 46 | for i, d := range data { |
| 47 | asn, err := strconv.ParseInt(d.sqlPeer.ASN, 10, 64) |
| 48 | if err != nil { |
| 49 | return nil, err |
| 50 | } |
| 51 | status := PeerCheckStatus_Invalid |
| 52 | switch d.sqlPeerCheck.CheckStatus { |
| 53 | case "okay": |
| 54 | status = PeerCheckStatus_Okay |
| 55 | case "failed": |
| 56 | status = PeerCheckStatus_Failed |
| 57 | default: |
| 58 | glog.Errorf("Unhandled check status %q", d.sqlPeerCheck.CheckStatus) |
| 59 | } |
| 60 | res[i] = &PeerCheckResult{ |
| 61 | PeerASN: asn, |
| 62 | CheckName: d.sqlPeerCheck.CheckName, |
| 63 | Time: time.Unix(0, d.sqlPeerCheck.CheckTime), |
| 64 | Status: status, |
| 65 | Message: d.sqlPeerCheck.CheckMessage, |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | return res, nil |
| 70 | } |