Packages
ferricstore
0.4.2
0.11.14
0.11.12
0.11.11
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.0
0.1.0
FerricFlow durable workflows and queues with native-protocol storage, Raft durability, and Bitcask persistence.
Current section
Files
Jump to
Current section
Files
lib/ferricstore/commands/strings/get_ex.ex
defmodule Ferricstore.Commands.Strings.GetEx do
@moduledoc false
alias Ferricstore.CommandTime
alias Ferricstore.Commands.Strings
alias Ferricstore.Store.Ops
def do_getex(key, opts, store) do
case parse_getex_opts(opts) do
{:ok, expire_at_ms} -> getex_parsed(key, expire_at_ms, store)
{:error, _} = err -> err
end
end
def getex_parsed(key, expire_at_ms, store) do
case Strings.ensure_string_key(key, store) do
:ok -> Ops.getex(store, key, expire_at_ms)
{:error, _} = error -> error
end
end
defp parse_getex_opts(["PERSIST"]), do: {:ok, 0}
defp parse_getex_opts(["EX", secs_str]) do
case Integer.parse(secs_str) do
{secs, ""} when secs > 0 -> {:ok, CommandTime.now_ms() + secs * 1_000}
{_secs, ""} -> {:error, "ERR invalid expire time in 'getex' command"}
_ -> {:error, "ERR value is not an integer or out of range"}
end
end
defp parse_getex_opts(["PX", ms_str]) do
case Integer.parse(ms_str) do
{ms, ""} when ms > 0 -> {:ok, CommandTime.now_ms() + ms}
{_ms, ""} -> {:error, "ERR invalid expire time in 'getex' command"}
_ -> {:error, "ERR value is not an integer or out of range"}
end
end
defp parse_getex_opts(["EXAT", ts_str]) do
case Integer.parse(ts_str) do
{ts, ""} when ts > 0 -> {:ok, ts * 1_000}
{_ts, ""} -> {:error, "ERR invalid expire time in 'getex' command"}
_ -> {:error, "ERR value is not an integer or out of range"}
end
end
defp parse_getex_opts(["PXAT", ts_str]) do
case Integer.parse(ts_str) do
{ts, ""} when ts > 0 -> {:ok, ts}
{_ts, ""} -> {:error, "ERR invalid expire time in 'getex' command"}
_ -> {:error, "ERR value is not an integer or out of range"}
end
end
defp parse_getex_opts([opt | rest]) when is_binary(opt) do
case String.upcase(opt) do
^opt -> {:error, "ERR syntax error"}
normalized -> parse_getex_opts([normalized | rest])
end
end
defp parse_getex_opts(_), do: {:error, "ERR syntax error"}
end