-proc redis_connect {server port} {
- set fd [socket $server $port]
- fconfigure $fd -translation binary
- return $fd
-}
-
-proc redis_write {fd buf} {
- puts -nonewline $fd $buf
-}
-
-proc redis_writenl {fd buf} {
- # puts "C: $buf"
- redis_write $fd $buf
- redis_write $fd "\r\n"
- flush $fd
-}
-
-proc redis_readnl {fd len} {
- set buf [read $fd $len]
- read $fd 2 ; # discard CR LF
- return $buf
-}
-
-proc redis_bulk_read {fd {multi 0}} {
- set count [redis_read_integer $fd]
- if {$count eq {nil}} return {}
- if {$multi && $count == -1} return {}
- set len [expr {abs($count)}]
- set buf [redis_readnl $fd $len]
- if {$count < 0} {return "***ERROR*** $buf"}
- return $buf
-}
-
-proc redis_multi_bulk_read fd {
- set count [redis_read_integer $fd]
- if {$count eq {nil}} return {}
- if {$count < 0} {
- set len [expr {abs($count)}]
- set buf [redis_readnl $fd $len]
- return "***ERROR*** $buf"
- }
- set l {}
- for {set i 0} {$i < $count} {incr i} {
- lappend l [redis_bulk_read $fd 1]
- }
- return $l
-}
-
-proc redis_read_retcode fd {
- set retcode [string trim [gets $fd]]
- # puts "S: $retcode"
- return $retcode
-}
-
-proc redis_read_integer fd {
- string trim [gets $fd]
-}
-
-### Actual API ###
-
-proc redis_set {fd key val} {
- redis_writenl $fd "set $key [string length $val]\r\n$val"
- redis_read_retcode $fd
-}
-
-proc redis_setnx {fd key val} {
- redis_writenl $fd "setnx $key [string length $val]\r\n$val"
- redis_read_integer $fd
-}
-
-proc redis_get {fd key} {
- redis_writenl $fd "get $key"
- redis_bulk_read $fd
-}
-
-proc redis_select {fd id} {
- redis_writenl $fd "select $id"
- redis_read_retcode $fd
-}
-
-proc redis_move {fd key id} {
- redis_writenl $fd "move $key $id"
- redis_read_integer $fd
-}
-
-proc redis_del {fd key} {
- redis_writenl $fd "del $key"
- redis_read_integer $fd
-}
-
-proc redis_keys {fd pattern} {
- redis_writenl $fd "keys $pattern"
- split [redis_bulk_read $fd]
-}
-
-proc redis_dbsize {fd} {
- redis_writenl $fd "dbsize"
- redis_read_integer $fd
-}
-
-proc redis_incr {fd key} {
- redis_writenl $fd "incr $key"
- redis_read_integer $fd
-}
-
-proc redis_decr {fd key} {
- redis_writenl $fd "decr $key"
- redis_read_integer $fd
-}
-
-proc redis_exists {fd key} {
- redis_writenl $fd "exists $key"
- redis_read_integer $fd
-}
-
-proc redis_lpush {fd key val} {
- redis_writenl $fd "lpush $key [string length $val]\r\n$val"
- redis_read_retcode $fd
-}
-
-proc redis_rpush {fd key val} {
- redis_writenl $fd "rpush $key [string length $val]\r\n$val"
- redis_read_retcode $fd
-}
-
-proc redis_llen {fd key} {
- redis_writenl $fd "llen $key"
- redis_read_integer $fd
-}
-
-proc redis_scard {fd key} {
- redis_writenl $fd "scard $key"
- redis_read_integer $fd
-}
-
-proc redis_lindex {fd key index} {
- redis_writenl $fd "lindex $key $index"
- redis_bulk_read $fd
-}
-
-proc redis_lrange {fd key first last} {
- redis_writenl $fd "lrange $key $first $last"
- redis_multi_bulk_read $fd
-}
-
-proc redis_mget {fd args} {
- redis_writenl $fd "mget [join $args]"
- redis_multi_bulk_read $fd
-}
-
-proc redis_sort {fd key {params {}}} {
- redis_writenl $fd "sort $key $params"
- redis_multi_bulk_read $fd
-}
-
-proc redis_ltrim {fd key first last} {
- redis_writenl $fd "ltrim $key $first $last"
- redis_read_retcode $fd
-}
-
-proc redis_rename {fd key1 key2} {
- redis_writenl $fd "rename $key1 $key2"
- redis_read_retcode $fd
-}
-
-proc redis_renamenx {fd key1 key2} {
- redis_writenl $fd "renamenx $key1 $key2"
- redis_read_integer $fd
-}
-
-proc redis_lpop {fd key} {
- redis_writenl $fd "lpop $key"
- redis_bulk_read $fd
-}
-
-proc redis_rpop {fd key} {
- redis_writenl $fd "rpop $key"
- redis_bulk_read $fd
-}
-
-proc redis_lset {fd key index val} {
- redis_writenl $fd "lset $key $index [string length $val]\r\n$val"
- redis_read_retcode $fd
-}
-
-proc redis_sadd {fd key val} {
- redis_writenl $fd "sadd $key [string length $val]\r\n$val"
- redis_read_integer $fd
-}
-
-proc redis_srem {fd key val} {
- redis_writenl $fd "srem $key [string length $val]\r\n$val"
- redis_read_integer $fd
-}
-
-proc redis_sismember {fd key val} {
- redis_writenl $fd "sismember $key [string length $val]\r\n$val"
- redis_read_integer $fd
-}
-
-proc redis_sinter {fd args} {
- redis_writenl $fd "sinter [join $args]"
- redis_multi_bulk_read $fd
-}
-
-proc redis_sinterstore {fd args} {
- redis_writenl $fd "sinterstore [join $args]"
- redis_read_retcode $fd
-}
-
-proc redis_smembers {fd key} {
- redis_writenl $fd "smembers $key"
- redis_multi_bulk_read $fd
-}
-
-proc redis_echo {fd str} {
- redis_writenl $fd "echo [string length $str]\r\n$str"
- redis_writenl $fd "smembers $key"
-}
-
-proc redis_save {fd} {
- redis_writenl $fd "save"
- redis_read_retcode $fd
-}
-
-proc redis_flushall {fd} {
- redis_writenl $fd "flushall"
- redis_read_retcode $fd
-}
-
-proc redis_flushdb {fd} {
- redis_writenl $fd "flushdb"
- redis_read_retcode $fd
-}
-
-proc redis_lrem {fd key count val} {
- redis_writenl $fd "lrem $key $count [string length $val]\r\n$val"
- redis_read_integer $fd
-}
-