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 expanded bool
errorFlag bool errorFlag bool
isRoot bool isRoot bool
sequence uint64
} }
/* /*
@@ -273,6 +274,7 @@ func (bd *BoltDB) refreshDatabase() *BoltDB {
bb, err := readBucket(b) bb, err := readBucket(b)
if err == nil { if err == nil {
bb.name = string(nm) bb.name = string(nm)
bb.sequence = b.Sequence()
bb.expanded = false bb.expanded = false
memBolt.buckets = append(memBolt.buckets, *bb) memBolt.buckets = append(memBolt.buckets, *bb)
return nil return nil
@@ -453,6 +455,7 @@ func readBucket(b *bbolt.Bucket) (*BoltBucket, error) {
tb.parent = bb tb.parent = bb
if err == nil { if err == nil {
tb.name = string(k) tb.name = string(k)
tb.sequence = b.Bucket(k).Sequence()
bb.buckets = append(bb.buckets, *tb) bb.buckets = append(bb.buckets, *tb)
} }
} else { } else {
@@ -587,6 +590,34 @@ func updatePairValue(path []string, v string) error {
return err 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 { func insertBucket(path []string, n string) error {
if AppArgs.ReadOnly { if AppArgs.ReadOnly {
return errors.New("DB is in Read-Only Mode") 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{ commands2 := []Command{
{"p,P", "create pair/at parent"}, {"p,P", "create pair/at parent"},
{"b,B", "create bucket/at parent"}, {"b,B", "create bucket/at parent"},
{"e", "edit value of pair"}, {"e", "edit pair value/bucket sequence"},
{"r", "rename pair/bucket"}, {"r", "rename pair/bucket"},
{"", ""}, {"", ""},
{"D", "delete item"}, {"D", "delete item"},
+37 -1
View File
@@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"path/filepath" "path/filepath"
"strconv"
"strings" "strings"
"time" "time"
@@ -54,6 +55,7 @@ const (
modeChangeKey = 33 // 0000 0010 0001 modeChangeKey = 33 // 0000 0010 0001
modeChangeVal = 34 // 0000 0010 0010 modeChangeVal = 34 // 0000 0010 0010
modeFilter = 35 // 0100 0010 0011 modeFilter = 35 // 0100 0010 0011
modeChangeSeq = 36 // 0100 0010 0100
modeInsert = 64 // 0000 0100 0000 modeInsert = 64 // 0000 0100 0000
modeInsertBucket = 65 // 0000 0100 0001 modeInsertBucket = 65 // 0000 0100 0001
modeInsertPair = 68 // 0000 0100 0100 modeInsertPair = 68 // 0000 0100 0100
@@ -155,7 +157,7 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
} else if event.Ch == 'e' { } else if event.Ch == 'e' {
b, p, _ := screen.db.getGenericFromPath(screen.currentPath) b, p, _ := screen.db.getGenericFromPath(screen.currentPath)
if b != nil { if b != nil {
screen.setMessage("Cannot edit a bucket, did you mean to (r)ename?") screen.startEditBucketSequence()
} else if p != nil { } else if p != nil {
screen.startEditItem() screen.startEditItem()
} }
@@ -242,6 +244,21 @@ func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
screen.setMessage("Bucket Renamed!") screen.setMessage("Bucket Renamed!")
screen.refreshDatabase() 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 { } else if p != nil {
if screen.mode == modeChangeKey { 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}) Line{fmt.Sprintf("Buckets: %d", len(b.buckets)), style.defaultFg, style.defaultBg})
screen.rightPaneBuffer = append(screen.rightPaneBuffer, screen.rightPaneBuffer = append(screen.rightPaneBuffer,
Line{fmt.Sprintf("Pairs: %d", len(b.pairs)), style.defaultFg, style.defaultBg}) 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 { } else if p != nil {
screen.rightPaneBuffer = append(screen.rightPaneBuffer, screen.rightPaneBuffer = append(screen.rightPaneBuffer,
Line{fmt.Sprintf("Path: %s", strings.Join(stringifyPath(p.GetPath()), " → ")), style.defaultFg, style.defaultBg}) 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 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 { func (screen *BrowserScreen) startEditItem() bool {
_, p, e := screen.db.getGenericFromPath(screen.currentPath) _, p, e := screen.db.getGenericFromPath(screen.currentPath)
if e == nil { if e == nil {