Merge pull request #68 from notwithering/master

add sequence support
This commit is contained in:
2026-06-12 07:42:37 -05:00
committed by GitHub
3 changed files with 69 additions and 2 deletions
+31
View File
@@ -27,6 +27,7 @@ type BoltBucket struct {
expanded bool
errorFlag bool
isRoot bool
sequence uint64
}
/*
@@ -273,6 +274,7 @@ func (bd *BoltDB) refreshDatabase() *BoltDB {
bb, err := readBucket(b)
if err == nil {
bb.name = string(nm)
bb.sequence = b.Sequence()
bb.expanded = false
memBolt.buckets = append(memBolt.buckets, *bb)
return nil
@@ -453,6 +455,7 @@ func readBucket(b *bbolt.Bucket) (*BoltBucket, error) {
tb.parent = bb
if err == nil {
tb.name = string(k)
tb.sequence = b.Bucket(k).Sequence()
bb.buckets = append(bb.buckets, *tb)
}
} else {
@@ -587,6 +590,34 @@ func updatePairValue(path []string, v string) error {
return err
}
func updateBucketSequence(path []string, seq uint64) error {
if AppArgs.ReadOnly {
return errors.New("DB is in Read-Only Mode")
}
err := db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(path[0]))
if b == nil {
// Invalid path, try for the root bucket
b = tx.Cursor().Bucket()
}
if b != nil {
if len(path) > 0 {
for i := range path[1:] {
b = b.Bucket([]byte(path[i+1]))
if b == nil {
return errors.New("updateBucketSequence: Invalid Path")
}
}
}
// Now update the sequence
err := b.SetSequence(seq)
return err
}
return errors.New("updateBucketSequence: Invalid Path")
})
return err
}
func insertBucket(path []string, n string) error {
if AppArgs.ReadOnly {
return errors.New("DB is in Read-Only Mode")
+1 -1
View File
@@ -108,7 +108,7 @@ func (screen *AboutScreen) drawScreen(style Style) {
commands2 := []Command{
{"p,P", "create pair/at parent"},
{"b,B", "create bucket/at parent"},
{"e", "edit value of pair"},
{"e", "edit pair value/bucket sequence"},
{"r", "rename pair/bucket"},
{"", ""},
{"D", "delete item"},
+37 -1
View File
@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"path/filepath"
"strconv"
"strings"
"time"
@@ -54,6 +55,7 @@ const (
modeChangeKey = 33 // 0000 0010 0001
modeChangeVal = 34 // 0000 0010 0010
modeFilter = 35 // 0100 0010 0011
modeChangeSeq = 36 // 0100 0010 0100
modeInsert = 64 // 0000 0100 0000
modeInsertBucket = 65 // 0000 0100 0001
modeInsertPair = 68 // 0000 0100 0100
@@ -155,7 +157,7 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
} else if event.Ch == 'e' {
b, p, _ := screen.db.getGenericFromPath(screen.currentPath)
if b != nil {
screen.setMessage("Cannot edit a bucket, did you mean to (r)ename?")
screen.startEditBucketSequence()
} else if p != nil {
screen.startEditItem()
}
@@ -242,6 +244,21 @@ func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
screen.setMessage("Bucket Renamed!")
screen.refreshDatabase()
}
} else if screen.mode == modeChangeSeq {
newSeqStr := screen.inputModal.GetValue()
newSeq, err := strconv.ParseUint(newSeqStr, 10, 64)
if err != nil {
screen.setMessage("Invalid sequence value.")
} else {
if err := updateBucketSequence(screen.currentPath, newSeq); err != nil {
screen.setMessage("Error occurred updating Sequence.")
} else {
b.sequence = newSeq
screen.setMessage("Sequence updated!")
screen.refreshDatabase()
}
}
}
} else if p != nil {
if screen.mode == modeChangeKey {
@@ -624,6 +641,8 @@ func (screen *BrowserScreen) buildRightPane(style Style) {
Line{fmt.Sprintf("Buckets: %d", len(b.buckets)), style.defaultFg, style.defaultBg})
screen.rightPaneBuffer = append(screen.rightPaneBuffer,
Line{fmt.Sprintf("Pairs: %d", len(b.pairs)), style.defaultFg, style.defaultBg})
screen.rightPaneBuffer = append(screen.rightPaneBuffer,
Line{fmt.Sprintf("Sequence: %d", b.sequence), style.defaultFg, style.defaultBg})
} else if p != nil {
screen.rightPaneBuffer = append(screen.rightPaneBuffer,
Line{fmt.Sprintf("Path: %s", strings.Join(stringifyPath(p.GetPath()), " → ")), style.defaultFg, style.defaultBg})
@@ -775,6 +794,23 @@ func (screen *BrowserScreen) startFilter() bool {
return false
}
func (screen *BrowserScreen) startEditBucketSequence() bool {
b, _, e := screen.db.getGenericFromPath(screen.currentPath)
if e == nil {
w, h := termbox.Size()
inpW, inpH := (w / 2), 6
inpX, inpY := ((w / 2) - (inpW / 2)), ((h / 2) - inpH)
mod := termboxUtil.CreateInputModal("", inpX, inpY, inpW, inpH, termbox.ColorWhite, termbox.ColorBlack)
mod.SetTitle(termboxUtil.AlignText(fmt.Sprintf("Set sequence for '%s'", b.name), inpW, termboxUtil.AlignCenter))
mod.SetValue(strconv.Itoa(int(b.sequence)))
mod.Show()
screen.inputModal = mod
screen.mode = modeChangeSeq
return true
}
return false
}
func (screen *BrowserScreen) startEditItem() bool {
_, p, e := screen.db.getGenericFromPath(screen.currentPath)
if e == nil {