diff options
-rw-r--r-- | CHANGELOG.md | 13 | ||||
-rw-r--r-- | lib/polyjuice/client/storage.ex | 14 | ||||
-rw-r--r-- | lib/polyjuice/client/storage/dets.ex | 12 | ||||
-rw-r--r-- | lib/polyjuice/client/storage/ets.ex | 12 | ||||
-rw-r--r-- | test/polyjuice/client/storage/ets_test.exs | 35 |
5 files changed, 66 insertions, 20 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 6643d45..53bec00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +0.3.0-pre +===== + +Breaking changes: + +- The `Polyjuice.Client.Storage` protocol adds a namespace parameter to the + key-value storage functions. Code that uses the function must add this + parameter to their calls, and modules that implement the protocol must add + this parameter to their implementations. Existing stored data should be + migrated. +- The `Polyjuice.Client.Storage` protocol adds a `kv_del` function. Modules + that implement the protocol must add this function to their implementations. + 0.2.1 ===== diff --git a/lib/polyjuice/client/storage.ex b/lib/polyjuice/client/storage.ex index 9172e5b..21a32c0 100644 --- a/lib/polyjuice/client/storage.ex +++ b/lib/polyjuice/client/storage.ex @@ -63,13 +63,19 @@ defprotocol Polyjuice.Client.Storage do @doc """ Store data for a specific key. """ - @spec kv_put(storage :: __MODULE__.t(), key :: String, value :: __MODULE__.value()) :: any - def kv_put(storage, key, value) + @spec kv_put(__MODULE__.t(), String.t(), String.t(), __MODULE__.value()) :: any + def kv_put(storage, namespace, key, value) @doc """ Get the data for a specific key. """ - @spec kv_get(storage :: __MODULE__.t(), key :: String, default :: __MODULE__.value()) :: + @spec kv_get(__MODULE__.t(), String.t(), String.t(), __MODULE__.value()) :: __MODULE__.value() - def kv_get(storage, key, default \\ nil) + def kv_get(storage, namespace, key, default \\ nil) + + @doc """ + Delete the data for a specific key. + """ + @spec kv_del(__MODULE__.t(), String.t(), String.t()) :: __MODULE__.value() + def kv_del(storage, namespace, key) end diff --git a/lib/polyjuice/client/storage/dets.ex b/lib/polyjuice/client/storage/dets.ex index 71999ee..c6d578f 100644 --- a/lib/polyjuice/client/storage/dets.ex +++ b/lib/polyjuice/client/storage/dets.ex @@ -67,15 +67,19 @@ defmodule Polyjuice.Client.Storage.Dets do end end - def kv_put(%{table: table}, key, value) when is_binary(key) do - :dets.insert(table, {"kv_" <> key, value}) + def kv_put(%{table: table}, namespace, key, value) when is_binary(namespace) and is_binary(key) do + :dets.insert(table, {{"kv", namespace, key}, value}) end - def kv_get(%{table: table}, key, default \\ nil) when is_binary(key) do - case :dets.lookup(table, "kv_" <> key) do + def kv_get(%{table: table}, namespace, key, default \\ nil) when is_binary(namespace) and is_binary(key) do + case :dets.lookup(table, {"kv", namespace, key}) do [{_, value}] -> value _ -> default end end + + def kv_del(%{table: table}, namespace, key) when is_binary(namespace) and is_binary(key) do + :dets.delete(table, {"kv", namespace, key}) + end end end diff --git a/lib/polyjuice/client/storage/ets.ex b/lib/polyjuice/client/storage/ets.ex index 0fae13b..06f7835 100644 --- a/lib/polyjuice/client/storage/ets.ex +++ b/lib/polyjuice/client/storage/ets.ex @@ -62,15 +62,19 @@ defmodule Polyjuice.Client.Storage.Ets do end end - def kv_put(%{table: table}, key, value) when is_binary(key) do - :ets.insert(table, {"kv_" <> key, value}) + def kv_put(%{table: table}, namespace, key, value) when is_binary(namespace) and is_binary(key) do + :ets.insert(table, {{"kv", namespace, key}, value}) end - def kv_get(%{table: table}, key, default \\ nil) when is_binary(key) do - case :ets.lookup(table, "kv_" <> key) do + def kv_get(%{table: table}, namespace, key, default \\ nil) when is_binary(namespace) and is_binary(key) do + case :ets.lookup(table, {"kv", namespace, key}) do [{_, value}] -> value _ -> default end end + + def kv_del(%{table: table}, namespace, key) when is_binary(namespace) and is_binary(key) do + :ets.delete(table, {"kv", namespace, key}) + end end end diff --git a/test/polyjuice/client/storage/ets_test.exs b/test/polyjuice/client/storage/ets_test.exs index 115c757..23fa783 100644 --- a/test/polyjuice/client/storage/ets_test.exs +++ b/test/polyjuice/client/storage/ets_test.exs @@ -17,7 +17,7 @@ defmodule Polyjuice.Client.Storage.EtsTest do alias Polyjuice.Client.Storage alias Polyjuice.Client.Filter - test "ets" do + test "ets can store sync token" do ets = Storage.Ets.open() assert Storage.get_sync_token(ets) == nil @@ -28,6 +28,12 @@ defmodule Polyjuice.Client.Storage.EtsTest do Storage.set_sync_token(ets, "token2") assert Storage.get_sync_token(ets) == "token2" + Storage.close(ets) + end + + test "ets can store filters" do + ets = Storage.Ets.open() + assert Storage.get_filter_id(ets, %{}) == nil Storage.set_filter_id(ets, %{}, "filterid1") @@ -38,16 +44,29 @@ defmodule Polyjuice.Client.Storage.EtsTest do Storage.set_filter_id(ets, Filter.lazy_loading(), "filterid2") assert Storage.get_filter_id(ets, Filter.lazy_loading()) == "filterid2" assert Storage.get_filter_id(ets, %{}) == "filterid1" + end + + test "ets can store key-values" do + ets = Storage.Ets.open() + + assert Storage.kv_get(ets, "ns", "key1") == nil + assert Storage.kv_get(ets, "ns", "key1", :default) == :default + + Storage.kv_put(ets, "ns", "key1", "value1") + assert Storage.kv_get(ets, "ns", "key1") == "value1" - assert Storage.kv_get(ets, "key1") == nil - assert Storage.kv_get(ets, "key1", :default) == :default + # setting a different key doesn't clobber a value + Storage.kv_put(ets, "ns", "key2", "value2") + assert Storage.kv_get(ets, "ns", "key2") == "value2" + assert Storage.kv_get(ets, "ns", "key1") == "value1" - Storage.kv_put(ets, "key1", "value1") - assert Storage.kv_get(ets, "key1") == "value1" + # setting a key in a different namespace doesn't clobber a value + Storage.kv_put(ets, "ns2", "key1", "value3") + assert Storage.kv_get(ets, "ns2", "key1") == "value3" + assert Storage.kv_get(ets, "ns", "key1") == "value1" - Storage.kv_put(ets, "key2", "value2") - assert Storage.kv_get(ets, "key2") == "value2" - assert Storage.kv_get(ets, "key1") == "value1" + Storage.kv_del(ets, "ns", "key1") + assert Storage.kv_get(ets, "ns", "key1") == nil Storage.close(ets) end |