Current section

Files

Jump to
ssdb_elixir lib ssdb.ex
Raw

lib/ssdb.ex

defmodule SSDB do
@type key :: binary | atom
@type req_type :: binary | atom | integer | list
@type rsp_type :: binary | boolean | list | integer
@type return_value :: {:ok, rsp_type} | {:error, rsp_type} | {:fail, rsp_type}| {:not_found} | {:client_error}
def start(options \\ []) do
GenServer.start SSDB.Server, options, []
end
def start_link(options \\ []) do
GenServer.start_link SSDB.Server, options, []
end
@doc """
For example:
{:ok, pid} = SSDB.start
{:ok, true} = SSDB.set pid, "a", 3
"""
@spec set(pid, key, req_type) :: return_value
def set(pid, key, value) do
call(pid, ["set", key, value])
end
@spec setx(pid, key, req_type, integer) :: return_value
def setx(pid, key, value, ttl) do
call(pid, ["setx", key, value, ttl])
end
@spec expire(pid, key, integer) :: return_value
def expire(pid, key, ttl) do
call(pid, ["expire", key, ttl])
end
@spec ttl(pid, key) :: return_value
def ttl(pid, key) do
call(pid, ["ttl", key])
end
@spec get(pid, key) :: return_value
def get(pid, key) do
call(pid, ["get", key])
end
def del(pid, key) do
call(pid, ["del", key])
end
def exists(pid, key) do
call(pid, ["exists", key])
end
def setnx(pid, key, value) do
call(pid, ["setnx", key, value])
end
def getset(pid, key, value) do
call(pid, ["getset", key, value])
end
def incr(pid, key, num) do
call(pid, ["incr", key, num])
end
def multi_set(pid, kvs) when is_map(kvs) do
values = Enum.map(kvs, fn({k,v}) -> [k,v] end)
|> List.flatten
call(pid, ["multi_set" | values])
end
def multi_get(pid, keys) when is_list(keys) do
call(pid, ["multi_get" | keys])
end
def multi_del(pid, keys) when is_list(keys) do
call(pid, ["multi_del" | keys])
end
## api for hashmap ##
def hset(pid, name, key, value) do
call(pid, ["hset", name, key, value])
end
def hget(pid, name, key) do
call(pid, ["hget", name, key])
end
def hdel(pid, name, key) do
call(pid, ["hdel", name, key])
end
def hexists(pid, name, key) do
call(pid, ["hexists", name, key])
end
def hsize(pid, name) do
call(pid, ["hsize", name]) |> int_reply
end
@doc """
send request to ssdb server, request is a list with command and args
For example:
SSDB.call pid, ["set", "a", "1"]
"""
@spec call(pid, list) :: return_value
def call(pid, request) when is_list(request) do
GenServer.call(pid, {:request, request})
end
@spec int_reply(binary) :: integer
defp int_reply(rsp) do
case rsp do
{:ok, value} -> {:ok, String.to_integer(value)}
_ -> rsp
end
end
end