64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
|
package peers
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
"errors"
|
||
|
|
||
|
"github.com/vacp2p/mvds/state"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrPeerNotFound = errors.New("peer not found")
|
||
|
)
|
||
|
|
||
|
type sqlitePersistence struct {
|
||
|
db *sql.DB
|
||
|
}
|
||
|
|
||
|
func NewSQLitePersistence(db *sql.DB) sqlitePersistence {
|
||
|
return sqlitePersistence{db: db}
|
||
|
}
|
||
|
|
||
|
func (p sqlitePersistence) Add(groupID state.GroupID, peerID state.PeerID) error {
|
||
|
_, err := p.db.Exec(`INSERT INTO mvds_peers (group_id, peer_id) VALUES (?, ?)`, groupID[:], peerID[:])
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (p sqlitePersistence) Exists(groupID state.GroupID, peerID state.PeerID) (bool, error) {
|
||
|
var result bool
|
||
|
err := p.db.QueryRow(
|
||
|
`SELECT EXISTS(SELECT 1 FROM mvds_peers WHERE group_id = ? AND peer_id = ?)`,
|
||
|
groupID[:],
|
||
|
peerID[:],
|
||
|
).Scan(&result)
|
||
|
switch err {
|
||
|
case sql.ErrNoRows:
|
||
|
return false, ErrPeerNotFound
|
||
|
case nil:
|
||
|
return result, nil
|
||
|
default:
|
||
|
return false, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (p sqlitePersistence) GetByGroupID(groupID state.GroupID) (result []state.PeerID, err error) {
|
||
|
rows, err := p.db.Query(`SELECT peer_id FROM mvds_peers WHERE group_id = ?`, groupID[:])
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer rows.Close()
|
||
|
|
||
|
for rows.Next() {
|
||
|
var (
|
||
|
peerIDBytes []byte
|
||
|
peerID state.PeerID
|
||
|
)
|
||
|
if err := rows.Scan(&peerIDBytes); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
copy(peerID[:], peerIDBytes)
|
||
|
result = append(result, peerID)
|
||
|
}
|
||
|
return
|
||
|
}
|