aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown
diff options
context:
space:
mode:
Diffstat (limited to 'content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown')
-rw-r--r--content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown76
1 files changed, 76 insertions, 0 deletions
diff --git a/content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown b/content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown
new file mode 100644
index 0000000..99180b3
--- /dev/null
+++ b/content/blog/2012-10-07-an-embedded-key-value-store-for-shell-scripts.markdown
@@ -0,0 +1,76 @@
+---
+title: "An Embedded Key/Value Store for Shell Scripts"
+date: 2012-10-07T10:06:00Z
+comments: true
+tags: ['shell scripting', 'databases']
+---
+
+UPDATE: this is now available as a [sub](http://github.com/37signals/sub) command, here: [kiev](http://github.com/capotej/kiev)
+
+Cooked this up last night when I needed a simple key/value store for use in a shell script:
+
+<!--more-->
+
+```sh db.sh
+#!/bin/sh
+
+DBFILE=example.db
+
+put(){
+ echo "export kv_$1=$2" >> $DBFILE
+}
+
+del(){
+ echo "unset kv_$1" >> $DBFILE
+}
+
+get(){
+ source $DBFILE
+ eval r=\$$(echo "kv_$1")
+ echo $r
+}
+
+list(){
+ source $DBFILE
+ for i in $(env | grep "kv_" | cut -d= -f1 ); do
+ eval r=\$$i; echo $(echo $i | sed -e 's/kv_//') $r;
+ done
+}
+
+## cmd dispatch
+
+if [ ${1:-0} == "set" ]; then
+ put $2 $3
+elif [ ${1:-0} == "get" ] ; then
+ get $2
+elif [ ${1:-0} == "list" ] ; then
+ list
+elif [ ${1:-0} == "del" ] ; then
+ del $2
+else
+ echo "unknown cmd"
+fi
+```
+
+Use it like so:
+
+
+`$ ./db.sh set foo bar`
+
+`$ ./db.sh get foo`
+
+`$ ./db.sh set foo baz`
+
+`$ ./db.sh get foo`
+
+`$ ./db.sh del foo`
+
+`$ ./db.sh list`
+
+
+## How it works
+
+Every time you update/set/delete a value, it writes a shell expression to an append-only log,
+exporting a shell variable (key) with that value. By sourcing the file every time we read a value, we
+replay the log, bringing our environment to a consistent state. Then, reading the value is just looking
+up that dynamic variable (key) in our shell environment.