Read/Edit DBs with key/value pairs in root
Not sure how 'good' this is, but apparently some people do it, so we may as well support it.
This commit is contained in:
parent
14bd1cdd41
commit
bbe5e92c9c
@ -26,6 +26,7 @@ type BoltBucket struct {
|
|||||||
parent *BoltBucket
|
parent *BoltBucket
|
||||||
expanded bool
|
expanded bool
|
||||||
errorFlag bool
|
errorFlag bool
|
||||||
|
isRoot bool
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -268,7 +269,7 @@ func (bd *BoltDB) refreshDatabase() *BoltDB {
|
|||||||
// Reload the database into memBolt
|
// Reload the database into memBolt
|
||||||
memBolt = new(BoltDB)
|
memBolt = new(BoltDB)
|
||||||
db.View(func(tx *bolt.Tx) error {
|
db.View(func(tx *bolt.Tx) error {
|
||||||
return tx.ForEach(func(nm []byte, b *bolt.Bucket) error {
|
err := tx.ForEach(func(nm []byte, b *bolt.Bucket) error {
|
||||||
bb, err := readBucket(b)
|
bb, err := readBucket(b)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
bb.name = string(nm)
|
bb.name = string(nm)
|
||||||
@ -278,6 +279,18 @@ func (bd *BoltDB) refreshDatabase() *BoltDB {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
// Check if there are key/values directly in the root
|
||||||
|
bb, err := readBucket(tx.Cursor().Bucket())
|
||||||
|
if err == nil {
|
||||||
|
bb.isRoot = true
|
||||||
|
bb.expanded = true
|
||||||
|
memBolt.buckets = append(memBolt.buckets, *bb)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
})
|
})
|
||||||
return memBolt
|
return memBolt
|
||||||
}
|
}
|
||||||
@ -400,6 +413,10 @@ func deleteKey(path []string) error {
|
|||||||
return tx.DeleteBucket([]byte(path[0]))
|
return tx.DeleteBucket([]byte(path[0]))
|
||||||
}
|
}
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 1 {
|
if len(path) > 1 {
|
||||||
for i := range path[1 : len(path)-1] {
|
for i := range path[1 : len(path)-1] {
|
||||||
@ -426,6 +443,9 @@ func deleteKey(path []string) error {
|
|||||||
|
|
||||||
func readBucket(b *bolt.Bucket) (*BoltBucket, error) {
|
func readBucket(b *bolt.Bucket) (*BoltBucket, error) {
|
||||||
bb := new(BoltBucket)
|
bb := new(BoltBucket)
|
||||||
|
if b == nil {
|
||||||
|
return nil, errors.New("No bucket passed")
|
||||||
|
}
|
||||||
b.ForEach(func(k, v []byte) error {
|
b.ForEach(func(k, v []byte) error {
|
||||||
if v == nil {
|
if v == nil {
|
||||||
tb, err := readBucket(b.Bucket(k))
|
tb, err := readBucket(b.Bucket(k))
|
||||||
@ -454,9 +474,13 @@ func renameBucket(path []string, name string) error {
|
|||||||
// len(b.path)-1 is the key we need to delete,
|
// len(b.path)-1 is the key we need to delete,
|
||||||
// the rest are buckets leading to that key
|
// the rest are buckets leading to that key
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 1 {
|
if len(path) > 1 {
|
||||||
for i := range path[1:len(path)] {
|
for i := range path[1:] {
|
||||||
b = b.Bucket([]byte(path[i+1]))
|
b = b.Bucket([]byte(path[i+1]))
|
||||||
if b == nil {
|
if b == nil {
|
||||||
return errors.New("renameBucket: Invalid Path")
|
return errors.New("renameBucket: Invalid Path")
|
||||||
@ -504,6 +528,10 @@ func updatePairKey(path []string, k string) error {
|
|||||||
// len(b.path)-1 is the key for the pair we're updating,
|
// len(b.path)-1 is the key for the pair we're updating,
|
||||||
// the rest are buckets leading to that key
|
// the rest are buckets leading to that key
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 0 {
|
if len(path) > 0 {
|
||||||
for i := range path[1 : len(path)-1] {
|
for i := range path[1 : len(path)-1] {
|
||||||
@ -536,6 +564,10 @@ func updatePairValue(path []string, v string) error {
|
|||||||
// len(b.GetPath())-1 is the key for the pair we're updating,
|
// len(b.GetPath())-1 is the key for the pair we're updating,
|
||||||
// the rest are buckets leading to that key
|
// the rest are buckets leading to that key
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 0 {
|
if len(path) > 0 {
|
||||||
for i := range path[1 : len(path)-1] {
|
for i := range path[1 : len(path)-1] {
|
||||||
@ -560,7 +592,7 @@ func insertBucket(path []string, n string) error {
|
|||||||
}
|
}
|
||||||
// Inserts a new bucket named 'n' at 'path'
|
// Inserts a new bucket named 'n' at 'path'
|
||||||
err := db.Update(func(tx *bolt.Tx) error {
|
err := db.Update(func(tx *bolt.Tx) error {
|
||||||
if len(path) == 0 {
|
if len(path) == 0 || path[0] == "" {
|
||||||
// insert at root
|
// insert at root
|
||||||
_, err := tx.CreateBucket([]byte(n))
|
_, err := tx.CreateBucket([]byte(n))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -606,6 +638,10 @@ func insertPair(path []string, k string, v string) error {
|
|||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 0 {
|
if len(path) > 0 {
|
||||||
for i := 1; i < len(path); i++ {
|
for i := 1; i < len(path); i++ {
|
||||||
@ -630,6 +666,10 @@ func exportValue(path []string, fName string) error {
|
|||||||
// len(b.path)-1 is the key whose value we want to export
|
// len(b.path)-1 is the key whose value we want to export
|
||||||
// the rest are buckets leading to that key
|
// the rest are buckets leading to that key
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 1 {
|
if len(path) > 1 {
|
||||||
for i := range path[1 : len(path)-1] {
|
for i := range path[1 : len(path)-1] {
|
||||||
@ -652,6 +692,10 @@ func exportJSON(path []string, fName string) error {
|
|||||||
// len(b.path)-1 is the key whose value we want to export
|
// len(b.path)-1 is the key whose value we want to export
|
||||||
// the rest are buckets leading to that key
|
// the rest are buckets leading to that key
|
||||||
b := tx.Bucket([]byte(path[0]))
|
b := tx.Bucket([]byte(path[0]))
|
||||||
|
if b == nil {
|
||||||
|
// Invalid path, try for the root bucket
|
||||||
|
b = tx.Cursor().Bucket()
|
||||||
|
}
|
||||||
if b != nil {
|
if b != nil {
|
||||||
if len(path) > 1 {
|
if len(path) > 1 {
|
||||||
for i := range path[1 : len(path)-1] {
|
for i := range path[1 : len(path)-1] {
|
||||||
|
@ -242,7 +242,7 @@ func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
|
|||||||
} else if p != nil {
|
} else if p != nil {
|
||||||
if screen.mode == modeChangeKey {
|
if screen.mode == modeChangeKey {
|
||||||
newKey := screen.inputModal.GetValue()
|
newKey := screen.inputModal.GetValue()
|
||||||
if updatePairKey(screen.currentPath, newKey) != nil {
|
if err := updatePairKey(screen.currentPath, newKey); err != nil {
|
||||||
screen.setMessage("Error occurred updating Pair.")
|
screen.setMessage("Error occurred updating Pair.")
|
||||||
} else {
|
} else {
|
||||||
p.key = newKey
|
p.key = newKey
|
||||||
@ -252,7 +252,7 @@ func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
|
|||||||
}
|
}
|
||||||
} else if screen.mode == modeChangeVal {
|
} else if screen.mode == modeChangeVal {
|
||||||
newVal := screen.inputModal.GetValue()
|
newVal := screen.inputModal.GetValue()
|
||||||
if updatePairValue(screen.currentPath, newVal) != nil {
|
if err := updatePairValue(screen.currentPath, newVal); err != nil {
|
||||||
screen.setMessage("Error occurred updating Pair.")
|
screen.setMessage("Error occurred updating Pair.")
|
||||||
} else {
|
} else {
|
||||||
p.val = newVal
|
p.val = newVal
|
||||||
@ -543,7 +543,7 @@ func (screen *BrowserScreen) drawHeader(style Style) {
|
|||||||
headerFileName = filepath.Base(headerFileName)
|
headerFileName = filepath.Base(headerFileName)
|
||||||
}
|
}
|
||||||
headerString := ProgramName + ": " + headerFileName
|
headerString := ProgramName + ": " + headerFileName
|
||||||
count := ((width-len(headerString))/2)+1
|
count := ((width - len(headerString)) / 2) + 1
|
||||||
if count < 0 {
|
if count < 0 {
|
||||||
count = 0
|
count = 0
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user