package store
import (
bolt
)
func () {
initDB["initialize command history table"] = func( *bolt.Tx) error {
, := .CreateBucketIfNotExists([]byte(bucketCmd))
return
}
}
func ( *dbStore) () (int, error) {
var uint64
:= .db.View(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
= .Sequence() + 1
return nil
})
return int(),
}
func ( *dbStore) ( string) (int, error) {
var (
uint64
error
)
= .db.Update(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
, = .NextSequence()
if != nil {
return
}
return .Put(marshalSeq(), []byte())
})
return int(),
}
func ( *dbStore) ( int) error {
return .db.Update(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
return .Delete(marshalSeq(uint64()))
})
}
func ( *dbStore) ( int) (string, error) {
var string
:= .db.View(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
:= .Get(marshalSeq(uint64()))
if == nil {
return ErrNoMatchingCmd
}
= string()
return nil
})
return ,
}
func ( *dbStore) (, int, func(Cmd)) error {
return .db.View(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
:= .Cursor()
for , := .Seek(marshalSeq(uint64())); != nil && unmarshalSeq() < uint64(); , = .Next() {
(Cmd{Text: string(), Seq: int(unmarshalSeq())})
}
return nil
})
}
func ( *dbStore) (, int) ([]string, error) {
var []string
:= .IterateCmds(, , func( Cmd) {
= append(, .Text)
})
return ,
}
func ( *dbStore) (, int) ([]Cmd, error) {
var []Cmd
:= .IterateCmds(, , func( Cmd) {
= append(, )
})
return ,
}
func ( *dbStore) ( int, string) (Cmd, error) {
var Cmd
:= .db.View(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
:= .Cursor()
:= []byte()
for , := .Seek(marshalSeq(uint64())); != nil; , = .Next() {
if bytes.HasPrefix(, ) {
= Cmd{Text: string(), Seq: int(unmarshalSeq())}
return nil
}
}
return ErrNoMatchingCmd
})
return ,
}
func ( *dbStore) ( int, string) (Cmd, error) {
var Cmd
:= .db.View(func( *bolt.Tx) error {
:= .Bucket([]byte(bucketCmd))
:= .Cursor()
:= []byte()
var []byte
, := .Seek(marshalSeq(uint64()))
if == nil {
, = .Last()
if == nil {
return ErrNoMatchingCmd
}
} else {
, = .Prev()
}
for ; != nil; , = .Prev() {
if bytes.HasPrefix(, ) {
= Cmd{Text: string(), Seq: int(unmarshalSeq())}
return nil
}
}
return ErrNoMatchingCmd
})
return ,
}
func ( uint64) []byte {
:= make([]byte, 8)
binary.BigEndian.PutUint64(, )
return
}
func ( []byte) uint64 {
return binary.BigEndian.Uint64()
}