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 }