aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2014-03-21 22:51:22 -0600
committerBen Johnson <benbjohnson@yahoo.com>2014-03-21 22:51:22 -0600
commit64a52452d32d2552c71bc4d4424b8a578a2103ed (patch)
tree26fb3d5edc74a62617f86807fef947ad89d5f4a1 /cmd
parentAdd 'bolt pages'. (diff)
downloaddedo-64a52452d32d2552c71bc4d4424b8a578a2103ed.tar.gz
dedo-64a52452d32d2552c71bc4d4424b8a578a2103ed.tar.xz
Add 'bolt set'.
Diffstat (limited to 'cmd')
-rw-r--r--cmd/bolt/main.go43
-rw-r--r--cmd/bolt/main_test.go29
2 files changed, 69 insertions, 3 deletions
diff --git a/cmd/bolt/main.go b/cmd/bolt/main.go
index 248884e..387ffa4 100644
--- a/cmd/bolt/main.go
+++ b/cmd/bolt/main.go
@@ -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)
diff --git a/cmd/bolt/main_test.go b/cmd/bolt/main_test.go
index 95b4df5..1884dfa 100644
--- a/cmd/bolt/main_test.go
+++ b/cmd/bolt/main_test.go
@@ -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)