decred.org/dcrwallet/v3@v3.1.0/wallet/udb/agendas.go (about)

     1  // Copyright (c) 2017-2018 The Decred developers
     2  // Use of this source code is governed by an ISC
     3  // license that can be found in the LICENSE file.
     4  
     5  package udb
     6  
     7  import (
     8  	"decred.org/dcrwallet/v3/errors"
     9  	"decred.org/dcrwallet/v3/wallet/walletdb"
    10  	"github.com/decred/dcrd/chaincfg/chainhash"
    11  )
    12  
    13  type agendaPreferencesTy struct {
    14  }
    15  
    16  var agendaPreferences agendaPreferencesTy
    17  
    18  var (
    19  	defaultAgendaPrefsBucketKey = []byte("agendaprefs")
    20  	ticketsAgendaPrefsBucketKey = []byte("ticketsagendaprefs")
    21  )
    22  
    23  func (agendaPreferencesTy) key(version uint32, agendaID string) []byte {
    24  	k := make([]byte, 4+len(agendaID))
    25  	byteOrder.PutUint32(k, version)
    26  	copy(k[4:], agendaID)
    27  	return k
    28  }
    29  
    30  func (agendaPreferencesTy) defaultBucketKey() []byte { return defaultAgendaPrefsBucketKey }
    31  
    32  func (agendaPreferencesTy) ticketsBucketKey() []byte { return ticketsAgendaPrefsBucketKey }
    33  
    34  func (t agendaPreferencesTy) setDefaultPreference(tx walletdb.ReadWriteTx, version uint32, agendaID, choiceID string) error {
    35  	b := tx.ReadWriteBucket(t.defaultBucketKey())
    36  	return b.Put(t.key(version, agendaID), []byte(choiceID))
    37  }
    38  
    39  func (t agendaPreferencesTy) setTicketPreference(tx walletdb.ReadWriteTx, txHash *chainhash.Hash, version uint32, agendaID, choiceID string) error {
    40  	b, err := tx.ReadWriteBucket(t.ticketsBucketKey()).CreateBucketIfNotExists(txHash[:])
    41  	if err != nil {
    42  		return err
    43  	}
    44  	return b.Put(t.key(version, agendaID), []byte(choiceID))
    45  }
    46  
    47  func (t agendaPreferencesTy) defaultPreference(dbtx walletdb.ReadTx, version uint32, agendaID string) (choiceID string) {
    48  	b := dbtx.ReadBucket(t.defaultBucketKey())
    49  	v := b.Get(t.key(version, agendaID))
    50  	return string(v)
    51  }
    52  
    53  func (t agendaPreferencesTy) ticketPreference(dbtx walletdb.ReadTx, ticketHash *chainhash.Hash, version uint32, agendaID string) (choiceID string) {
    54  	ticketBucket := dbtx.ReadBucket(t.ticketsBucketKey()).NestedReadBucket(ticketHash[:])
    55  	if ticketBucket == nil {
    56  		return ""
    57  	}
    58  	v := ticketBucket.Get(t.key(version, agendaID))
    59  	return string(v)
    60  }
    61  
    62  // SetDefaultAgendaPreference saves a default agenda choice ID for an agenda ID
    63  // and deployment version.
    64  func SetDefaultAgendaPreference(dbtx walletdb.ReadWriteTx, version uint32, agendaID, choiceID string) error {
    65  	err := agendaPreferences.setDefaultPreference(dbtx, version, agendaID, choiceID)
    66  	if err != nil {
    67  		return errors.E(errors.IO, err)
    68  	}
    69  	return nil
    70  }
    71  
    72  // SetTicketAgendaPreference saves a ticket-specific agenda choice ID for an
    73  // agenda ID and deployment version.
    74  func SetTicketAgendaPreference(dbtx walletdb.ReadWriteTx, txHash *chainhash.Hash, version uint32, agendaID, choiceID string) error {
    75  	err := agendaPreferences.setTicketPreference(dbtx, txHash, version, agendaID, choiceID)
    76  	if err != nil {
    77  		return errors.E(errors.IO, err)
    78  	}
    79  	return nil
    80  }
    81  
    82  // DefaultAgendaPreference returns the saved default choice ID, if any, for an
    83  // agenda ID and deployment version.  If no choice has been saved, this returns
    84  // the empty string.
    85  func DefaultAgendaPreference(dbtx walletdb.ReadTx, version uint32, agendaID string) (choiceID string) {
    86  	return agendaPreferences.defaultPreference(dbtx, version, agendaID)
    87  }
    88  
    89  // TicketAgendaPreference returns a ticket's saved choice ID, if any, for an agenda
    90  // ID and deployment version.  If no choice has been saved, this returns the empty
    91  // string.
    92  func TicketAgendaPreference(dbtx walletdb.ReadTx, ticketHash *chainhash.Hash, version uint32, agendaID string) (choiceID string) {
    93  	return agendaPreferences.ticketPreference(dbtx, ticketHash, version, agendaID)
    94  }