diff --git a/database/ticket.go b/database/ticket.go index ab54e49..ab5ef66 100644 --- a/database/ticket.go +++ b/database/ticket.go @@ -315,8 +315,8 @@ func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) { vdb.ticketsMtx.RLock() defer vdb.ticketsMtx.RUnlock() - return vdb.filterTickets(func(t Ticket) bool { - return !t.Confirmed + return vdb.filterTickets(func(t *bolt.Bucket) bool { + return t.Get(confirmedK)[0] == byte(0) }) } @@ -326,8 +326,8 @@ func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) { vdb.ticketsMtx.RLock() defer vdb.ticketsMtx.RUnlock() - return vdb.filterTickets(func(t Ticket) bool { - return t.Confirmed && t.FeeTxStatus == FeeReceieved + return vdb.filterTickets(func(t *bolt.Bucket) bool { + return t.Get(confirmedK)[0] == byte(1) && FeeStatus(t.Get(feeTxStatusK)) == FeeReceieved }) } @@ -337,16 +337,16 @@ func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) { vdb.ticketsMtx.RLock() defer vdb.ticketsMtx.RUnlock() - return vdb.filterTickets(func(t Ticket) bool { - return t.FeeTxStatus == FeeBroadcast + return vdb.filterTickets(func(t *bolt.Bucket) bool { + return FeeStatus(t.Get(feeTxStatusK)) == FeeBroadcast }) } // GetVotableTickets returns tickets with a confirmed fee tx and no outcome (ie. // not expired/voted/missed). func (vdb *VspDatabase) GetVotableTickets() ([]Ticket, error) { - return vdb.filterTickets(func(t Ticket) bool { - return t.FeeTxStatus == FeeConfirmed && t.Outcome == "" + return vdb.filterTickets(func(t *bolt.Bucket) bool { + return FeeStatus(t.Get(feeTxStatusK)) == FeeConfirmed && TicketOutcome(t.Get(outcomeK)) == "" }) } @@ -354,18 +354,19 @@ func (vdb *VspDatabase) GetVotableTickets() ([]Ticket, error) { // database which match the filter. // // This function must be called with the lock held. -func (vdb *VspDatabase) filterTickets(filter func(Ticket) bool) ([]Ticket, error) { +func (vdb *VspDatabase) filterTickets(filter func(*bolt.Bucket) bool) ([]Ticket, error) { var tickets []Ticket err := vdb.db.View(func(tx *bolt.Tx) error { ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) return ticketBkt.ForEach(func(k, v []byte) error { - ticket, err := getTicketFromBkt(ticketBkt.Bucket(k)) - if err != nil { - return fmt.Errorf("could not get ticket: %w", err) - } + ticketBkt := ticketBkt.Bucket(k) - if filter(ticket) { + if filter(ticketBkt) { + ticket, err := getTicketFromBkt(ticketBkt) + if err != nil { + return fmt.Errorf("could not get ticket: %w", err) + } tickets = append(tickets, ticket) } diff --git a/database/ticket_test.go b/database/ticket_test.go index 4119d2a..f5d0ae0 100644 --- a/database/ticket_test.go +++ b/database/ticket_test.go @@ -9,6 +9,8 @@ import ( "reflect" "testing" "time" + + bolt "go.etcd.io/bbolt" ) var seededRand = rand.New(rand.NewSource(time.Now().UnixNano())) @@ -224,7 +226,7 @@ func testFilterTickets(t *testing.T) { } // Expect all tickets returned. - retrieved, err := db.filterTickets(func(t Ticket) bool { + retrieved, err := db.filterTickets(func(t *bolt.Bucket) bool { return true }) if err != nil { @@ -235,8 +237,8 @@ func testFilterTickets(t *testing.T) { } // Only one ticket should be confirmed. - retrieved, err = db.filterTickets(func(t Ticket) bool { - return t.Confirmed + retrieved, err = db.filterTickets(func(t *bolt.Bucket) bool { + return t.Get(confirmedK)[0] == byte(1) }) if err != nil { t.Fatalf("error filtering tickets: %v", err) @@ -249,8 +251,8 @@ func testFilterTickets(t *testing.T) { } // Expect no tickets with confirmed fee. - retrieved, err = db.filterTickets(func(t Ticket) bool { - return t.FeeTxStatus == FeeConfirmed + retrieved, err = db.filterTickets(func(t *bolt.Bucket) bool { + return FeeStatus(t.Get(feeTxStatusK)) == FeeConfirmed }) if err != nil { t.Fatalf("error filtering tickets: %v", err)