summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md13
-rw-r--r--lib/polyjuice/client/storage.ex14
-rw-r--r--lib/polyjuice/client/storage/dets.ex12
-rw-r--r--lib/polyjuice/client/storage/ets.ex12
-rw-r--r--test/polyjuice/client/storage/ets_test.exs35
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