add sequence support
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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"},
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user