src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/cli/histutil/db_store.go (about)

     1  package histutil
     2  
     3  import (
     4  	"src.elv.sh/pkg/store/storedefs"
     5  )
     6  
     7  // NewDBStore returns a Store backed by a database with the view of all
     8  // commands frozen at creation.
     9  func NewDBStore(db DB) (Store, error) {
    10  	upper, err := db.NextCmdSeq()
    11  	if err != nil {
    12  		return nil, err
    13  	}
    14  	return dbStore{db, upper}, nil
    15  }
    16  
    17  type dbStore struct {
    18  	db    DB
    19  	upper int
    20  }
    21  
    22  func (s dbStore) AllCmds() ([]storedefs.Cmd, error) {
    23  	return s.db.CmdsWithSeq(0, s.upper)
    24  }
    25  
    26  func (s dbStore) AddCmd(cmd storedefs.Cmd) (int, error) {
    27  	return s.db.AddCmd(cmd.Text)
    28  }
    29  
    30  func (s dbStore) Cursor(prefix string) Cursor {
    31  	return &dbStoreCursor{
    32  		s.db, prefix, s.upper, storedefs.Cmd{Seq: s.upper}, ErrEndOfHistory}
    33  }
    34  
    35  type dbStoreCursor struct {
    36  	db     DB
    37  	prefix string
    38  	upper  int
    39  	cmd    storedefs.Cmd
    40  	err    error
    41  }
    42  
    43  func (c *dbStoreCursor) Prev() {
    44  	if c.cmd.Seq < 0 {
    45  		return
    46  	}
    47  	cmd, err := c.db.PrevCmd(c.cmd.Seq, c.prefix)
    48  	c.set(cmd, err, -1)
    49  }
    50  
    51  func (c *dbStoreCursor) Next() {
    52  	if c.cmd.Seq >= c.upper {
    53  		return
    54  	}
    55  	cmd, err := c.db.NextCmd(c.cmd.Seq+1, c.prefix)
    56  	if cmd.Seq < c.upper {
    57  		c.set(cmd, err, c.upper)
    58  	}
    59  	if cmd.Seq >= c.upper {
    60  		c.cmd = storedefs.Cmd{Seq: c.upper}
    61  		c.err = ErrEndOfHistory
    62  	}
    63  }
    64  
    65  func (c *dbStoreCursor) set(cmd storedefs.Cmd, err error, endSeq int) {
    66  	if err == nil {
    67  		c.cmd = cmd
    68  		c.err = nil
    69  	} else if err.Error() == storedefs.ErrNoMatchingCmd.Error() {
    70  		c.cmd = storedefs.Cmd{Seq: endSeq}
    71  		c.err = ErrEndOfHistory
    72  	} else {
    73  		// Don't change c.cmd
    74  		c.err = err
    75  	}
    76  }
    77  
    78  func (c *dbStoreCursor) Get() (storedefs.Cmd, error) {
    79  	return c.cmd, c.err
    80  }