Add 'bolt set'.

pull/34/head
Ben Johnson 2014-03-21 22:51:22 -06:00
parent 0e4d77d424
commit 64a52452d3
2 changed files with 69 additions and 3 deletions

View File

@ -23,17 +23,22 @@ func NewApp() *cli.App {
app.Commands = []cli.Command{
{
Name: "get",
Usage: "retrieve a value for given key",
Usage: "Retrieve a value for given key in a bucket",
Action: GetCommand,
},
{
Name: "set",
Usage: "Sets a value for given key in a bucket",
Action: SetCommand,
},
{
Name: "keys",
Usage: "retrieve a list of all keys in a bucket",
Usage: "Retrieve a list of all keys in a bucket",
Action: KeysCommand,
},
{
Name: "pages",
Usage: "dump page information for a database",
Usage: "Dumps page information for a database",
Action: PagesCommand,
},
}
@ -79,6 +84,38 @@ func GetCommand(c *cli.Context) {
}
}
// SetCommand sets the value for a given key in a bucket.
func SetCommand(c *cli.Context) {
path, name, key, value := c.Args().Get(0), c.Args().Get(1), c.Args().Get(2), c.Args().Get(3)
if _, err := os.Stat(path); os.IsNotExist(err) {
fatal(err)
return
}
db, err := bolt.Open(path, 0600)
if err != nil {
fatal(err)
return
}
defer db.Close()
err = db.Do(func(tx *bolt.Tx) error {
// Find bucket.
b := tx.Bucket(name)
if b == nil {
fatalf("bucket not found: %s", name)
return nil
}
// Set value for a given key.
return b.Put([]byte(key), []byte(value))
})
if err != nil {
fatal(err)
return
}
}
// KeysCommand retrieves a list of keys for a given bucket.
func KeysCommand(c *cli.Context) {
path, name := c.Args().Get(0), c.Args().Get(1)

View File

@ -53,6 +53,35 @@ func TestGetKeyNotFound(t *testing.T) {
})
}
// Ensure that a value can be set from the CLI.
func TestSet(t *testing.T) {
SetTestMode(true)
open(func(db *bolt.DB) {
db.Do(func(tx *bolt.Tx) error {
tx.CreateBucket("widgets")
return nil
})
assert.Equal(t, "", run("set", db.Path(), "widgets", "foo", "bar"))
assert.Equal(t, "bar", run("get", db.Path(), "widgets", "foo"))
})
}
// Ensure that an error is reported if the database is not found.
func TestSetDBNotFound(t *testing.T) {
SetTestMode(true)
output := run("set", "no/such/db", "widgets", "foo", "bar")
assert.Equal(t, "stat no/such/db: no such file or directory", output)
}
// Ensure that an error is reported if the bucket is not found.
func TestSetBucketNotFound(t *testing.T) {
SetTestMode(true)
open(func(db *bolt.DB) {
output := run("set", db.Path(), "widgets", "foo", "bar")
assert.Equal(t, "bucket not found: widgets", output)
})
}
// Ensure that a list of keys can be retrieved for a given bucket.
func TestKeys(t *testing.T) {
SetTestMode(true)