experimental-cli/project/peers.go

83 lines
2.1 KiB
Go
Raw Normal View History

package main
import (
"database/sql"
2020-09-24 23:43:11 +00:00
"fmt"
)
// PeerStatus represents a known state of a peer, such as
// blocked, following, etc..
type PeerStatus string
const (
following PeerStatus = "following"
blocked = "blocked"
unknown = "unknown"
)
2020-09-28 00:56:55 +00:00
type peer struct {
mhash string
status PeerStatus
}
2020-09-28 01:21:49 +00:00
const sqlCreatePeer = "INSERT INTO peers(mhash, status) VALUES(?1, ?2);"
const sqlFindPeerByStatus = "SELECT status FROM peers WHERE mhash=$1;"
const sqlGetAllPeers = "SELECT mhash, status FROM peers ORDER BY status DESC, mhash ASC;"
const sqlRemovePeer = "DELETE FROM peers WHERE mhash=$1;"
func getPeerStatus(mHash string) PeerStatus {
var status PeerStatus
2020-09-28 01:21:49 +00:00
row := getDB().QueryRow(sqlFindPeerByStatus, mHash)
2020-11-15 19:14:18 +00:00
err := row.Scan(&status)
if err == sql.ErrNoRows {
return "unknown"
}
2020-11-15 19:14:18 +00:00
check(err, "getPeerStatus error I")
return status
}
2020-12-10 13:16:20 +00:00
func setPeerStatus(mHash string, status PeerStatus) {
2020-09-24 23:43:11 +00:00
tx, err := getDB().Begin()
2020-12-10 13:16:20 +00:00
check(err, "Failed to begin setPeerStatus trx (0): %s", err)
2020-09-28 01:21:49 +00:00
_, err2 := tx.Exec(sqlCreatePeer, mHash, status)
if err2 != nil {
2020-09-27 13:46:44 +00:00
err1 := tx.Rollback()
2020-11-15 19:14:18 +00:00
check(err1, "Failed to rollback peer (1): %s", err)
2020-09-24 23:43:11 +00:00
panic(fmt.Sprintf("Failure. Possible duplicate peer?: %s", err2))
}
err1 := tx.Commit()
2020-11-15 19:14:18 +00:00
check(err1, "Failed to commit peer (2): %s", err1)
}
2020-09-28 01:21:49 +00:00
func removePeer(mHash string) {
tx, err := getDB().Begin()
2020-11-15 19:14:18 +00:00
check(err, "Failed to begin removePeer trx (0): %s", err)
2020-09-28 01:21:49 +00:00
_, err2 := tx.Exec(sqlRemovePeer, mHash)
if err2 != nil {
err1 := tx.Rollback()
2020-11-15 19:14:18 +00:00
check(err1, "Failed to rollback removePeer (1): %s", err)
2020-09-28 01:21:49 +00:00
panic(fmt.Sprintf("Failure. Possible duplicate peer?: %s", err2))
}
err1 := tx.Commit()
2020-11-15 19:14:18 +00:00
check(err1, "Failed to commit peer removal (2): %s", err1)
2020-09-28 01:21:49 +00:00
}
2020-09-28 00:56:55 +00:00
func listPeers() []peer {
var (
status PeerStatus
mhash string
)
2020-09-28 01:21:49 +00:00
rows, err := getDB().Query(sqlGetAllPeers)
2020-11-15 19:14:18 +00:00
check(err, "showPeers query failure: %s", err)
2020-09-28 00:56:55 +00:00
defer rows.Close()
output := []peer{}
for rows.Next() {
err := rows.Scan(&mhash, &status)
2020-11-15 19:14:18 +00:00
check(err, "Show peers row scan failure: %s", err)
2020-09-28 00:56:55 +00:00
output = append(output, peer{mhash: mhash, status: status})
}
err = rows.Err()
2020-11-15 19:14:18 +00:00
check(err, "showPeers row error: %s", err)
2020-09-28 00:56:55 +00:00
return output
}