Files
mvds/dependency/tracker_sqlite.go
Dean Eigenmann 748b61123f feature/mdf (#76)
* protobuf

* do not send ack when not required

* remove from state if no ack required

* different send modes

* fix

* updated

* retransmit fix

* updated

* fixed

* renamed to ephemeral

* repeated

* gen

* resolution

* cleanup

* rough dependency code

* todo

* removed

* only stores if ephemeral

* started implementing the algo

* simplified

* updated

* we never store ephemeral messages so we did not need

* adds parents

* new schema

* tx to insert

* err

* removed old

* fixed

* changed log

* test persistence of parents

* removed

* rename

* ignoring

* Update store/messagestore_sqlite.go

Co-Authored-By: Adam Babik <adam@status.im>

* Update node/node.go

Co-Authored-By: Adam Babik <adam@status.im>

* Update node/node.go

Co-Authored-By: Adam Babik <adam@status.im>

* Update node/node.go

Co-Authored-By: Adam Babik <adam@status.im>

* more fixes

* Update store/messagestore_sqlite.go

Co-Authored-By: Adam Babik <adam@status.im>

* more fixes

* using refs

* Update node/node.go

Co-Authored-By: Adam Babik <adam@status.im>

* finished

* Update store/messagestore_sqlite.go

Co-Authored-By: Adam Babik <adam@status.im>

* Update 1572372377_initial_schema.down.sql

* desc + refactor

* started refactoring resolution

* Update README.md

* rewrote resolve

* mutex

* todo

* fixes

* sql impl

* added test

* log

* updates

* updated

* little bug

* fix

* added test

* first changes from @adambabik

* moved

* fixed test, started eventual ones

* fixed eventually test

* mock install

* consistent test

* mock

* fix lint

* Update dependency/tracker_sqlite.go

Co-Authored-By: Adam Babik <adam@status.im>

* fix
2019-11-05 17:32:23 +01:00

72 lines
1.4 KiB
Go

package dependency
import (
"database/sql"
"github.com/vacp2p/mvds/state"
)
// Verify that Tracker interface is implemented.
var _ Tracker = (*sqliteTracker)(nil)
type sqliteTracker struct {
db *sql.DB
}
func NewPersistentTracker(db *sql.DB) *sqliteTracker {
return &sqliteTracker{db: db}
}
func (sd *sqliteTracker) Add(msg, dependency state.MessageID) error {
_, err := sd.db.Exec(`INSERT INTO mvds_dependencies (msg_id, dependency) VALUES (?, ?)`, msg[:], dependency[:])
if err != nil {
return err
}
return nil
}
func (sd *sqliteTracker) Dependants(id state.MessageID) ([]state.MessageID, error) {
rows, err := sd.db.Query(`SELECT msg_id FROM mvds_dependencies WHERE dependency = ?`, id[:])
if err != nil {
return nil, err
}
defer rows.Close()
var msgs []state.MessageID
for rows.Next() {
var msg []byte
err := rows.Scan(&msg)
if err != nil {
return nil, err
}
msgs = append(msgs, state.ToMessageID(msg))
}
return msgs, nil
}
func (sd *sqliteTracker) Resolve(msg state.MessageID, dependency state.MessageID) error {
_, err := sd.db.Exec(
`DELETE FROM mvds_dependencies WHERE msg_id = ? AND dependency = ?`,
msg[:],
dependency[:],
)
return err
}
func (sd *sqliteTracker) IsResolved(id state.MessageID) (bool, error) {
result := sd.db.QueryRow(`SELECT COUNT(*) FROM mvds_dependencies WHERE msg_id = ?`, id[:])
var num int64
err := result.Scan(&num)
if err != nil {
return false, err
}
return num == 0, nil
}